NAV Navbar
Logo

Introduction

Quovo’s Aggregation API provides methods for retrieving data from financial institutions on behalf of clients, advisors, and other users. This documentation includes detailed explanations of API endpoints, walkthroughs of common workflows, as well as common data definitions. Please note that this documentation does not list all API endpoints. Additionally, you may not have access to all of the listed endpoints depending on the services you’ve purchased from Quovo.

API credentials are required for any usage of the Aggregation API. If you are interested in receiving credentials for testing or evaluation, please sign up for an account here.

Please direct all support questions to support@quovo.com. You can also review our Terms of Use for guidelines on our service’s usage.

Making Requests

The base URL for all Quovo API requests is https://api.quovo.com/v2

The API is built on RESTful principles with resource-oriented URL endpoints. HTTP status codes are used to indicate any API errors and all responses are returned in JSON format. All requests must be made over an HTTPS connection to ensure a secure transmission of data. Following a RESTful structure, requests should hit API endpoints using the appropriate HTTP method, which will depend on the desired action:

Method Description
GET Use the GET method to retrieve information about your users, their accounts, and any associated financial data. This will always be a read-only request, so queried objects will never be modified by a GET request.
POST Use a POST method to create a new object, such as a new User or Account. Request parameters can be given as a JSON or as form-data. The response body will typically return the newly created resource.
PUT Use a PUT method to update an object, such as updating Account credentials. As with a POST request, parameters can be given as a JSON or as form-data. If successful, the response body will typically return the modified object.
DELETE Use a DELETE method to delete a object, such as deleting one of your Users. Successful DELETE requests will typically return an empty response body.

Responses

{
    "users": [
        {
            "email": "testuser@quovo.com",
            "id": 162703,
            "name": "Quovo Testuser",
            "phone": null,
            "username": "quovo_test_user",
            "value": 173471.15110
        },
        {
            "email": "another.testuser@quovo.com",
            "id": 162713,
            "name": "Quovo Testuser II",
            "phone": null,
            "username": "quovo_test_user_2",
            "value": 2944.11
        }
    ]
}

All non-empty response bodies, including errors, will be formatted as a JSON object. In general, a successful GET request (or any other request that retrieves data) will return an object with the data contained inside a single key-value pair. This key is always associated with the relevant endpoint. For example, GET /v2/users will return an object with users as the key and the list of users as its value.

If you are fetching multiple entries, such as the previous /v2/users example, the data will be returned as a list. If you are fetching a single entry, such as GET /v2/users/162703, the data will be returned as a single object.

{
    "user": {
        "email": "testuser@quovo.com",
        "id": 162703,
        "name": "Quovo Testuser",
        "phone": null,
        "username": "quovo_test_user",
        "value": 173471.15110
    }
}

Additionally, Quovo’s APIs use standard HTTP status codes to indicate the status of a request.

Below is a brief overview of the most common status codes:

Code Definition
200 OK - The request was successful and there is relevant data in the response body.
201 Created - Returned after a new object was created. Typically, the newly created object will be available in the response body.
204 No Content - Usually returned on a DELETE request. This indicates that the object was sucessfully removed, but there is no actual data to return.
400 Bad Request - There was an issue with the given parameters. This could be due to a missing required field, a malformed parameter, etc.
401 Unauthorized - The API credentials or access token used are incorrect.
403 Forbidden - You do not have access to the requested endpoint or action.
404 Not Found - Returned if the given resource either does not exist or you do not have access to it.
409 Conflict - This indicates that you are trying to perform an action that would interrupt or conflict with another ongoing action. For example, requesting a new Sync for an Account that already has an ongoing Sync will return a “Conflict”.
500 Internal Server Error - There are internal or API-related errors on Quovo’s side. Additional requests will not resolve the issue.
503 Service Unavailable - The targeted endpoint is currently unavailable. This is caused by temporary issues; access to the endpoint will return momentarily.

Errors

{
    "id": "bad_request",
    "message": "(user): Missing required parameter in the JSON body or the post body",
    "status": 400
}

If there is an error with your request, a JSON containing an error ID and message will be returned.

The status will always match the returned HTTP status code. While there are unique error IDs and messages, most invalid request errors (400s) will either use invalid_parameter or bad_request. These messages are then used for simple request errors such as a missing required field or an improperly formatted date parameter.

Pagination

{
    "history": [
        {
            "account": 877247,
            "currency": null,
            "cusip": "037833100",
            "date": "2015-05-05",
            "expense_category": null,
            "fees": 0.0,
            "fxrate": 1.0,
            "id": 199436906,
            "is_cancel": false,
            "is_pending": false,
            "memo": "Bought AAPL",
            "portfolio": 746745,
            "price": 600.96,
            "quantity": 11.0,
            "ticker": "AAPL",
            "ticker_name": "Apple Inc",
            "tran_category": "B",
            "tran_type": "BUYL",
            "user": 162703,
            "value": -6610.56
        }
    ],
    "cursor": {
        "next": 199546121,
        "prev": null
    }
}

Pagination is used for any endpoint with a sufficiently large set of data, mainly the /v2/positions and /v2/history endpoints. Cursors are used as pointers to the next or previous sets of objects. When your request requires pagination, you will receive a partial set of data alongside a cursor object, which will contain a next and prev field.

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/history?cursor=199546121"

You can then pass cursor.next or cursor.prev to traverse the full data set. For example, to retrieve the next set of transactions, you would pass cursor.next while requesting History (GET /v2/history?cursor=199546121). If either cursor.prev or cursor.next are null, you have reached the start or end of the data set, respectively.

Authentication

curl -X POST --user "my_api_username:my_api_password" -H "Content-Type: application/json" -d '{"name": "main_token"}' "https://api.quovo.com/v2/tokens"
{
    "access_token": {
        "created": "2016-03-31T17:45:09Z",
        "expires": "2016-03-31T18:45:09Z",
        "name": "main_token",
        "token": "a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e"
    }
}

To verify incoming API requests, Quovo’s APIs use access tokens, similar to OAuth application-only authentication.

Use the /v2/tokens endpoint to manage your access tokens. To authenticate to the /v2/tokens endpoint, you will need API user credentials. This is one of the few API endpoints where you will need to use your API user credentials; most other endpoints are authenticated through access tokens.

Pass your API credentials to the /v2/tokens endpoint using Client-side Basic Auth.

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"username": "quovo_myfirstuser", "name": "Test User 1", "email": "fakeemail@quovo.com"}' "https://api.quovo.com/v2/users"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json

Once you have an access token, you can authenticate to any other API endpoint. Pass the access token in the request header in the format Authorization: Bearer {token}, where {token} is your newly created access token.

Examples

Curl

Throughout the documentation, there will be sample requests using curl. These will hopefully help demonstrate actual API calls (though you will have to replace our access tokens, User IDs, etc. with your own parameters).

Curly braces {} are used to indicate variables. While making requests, make sure to replace the entire {variable} with the appropriate parameter or value. And while this documentation passes most parameters as a JSON object, you can also format the parameters as form data attributes.

Be sure to review the Workflows and Data Specs areas of the documentation, located below the endpoint descriptions. These areas contain important information about Quovo terminology and the data you will be receiving from the API.

Postman

In addition to the curl examples, we have also provided a Postman collection containing all available API calls. Postman is a tool that helps generate and test API calls by providing a clean interface to build and save HTTP requests, and to check and test API responses. Find out more about accessing the Quovo API using Postman here.

DOWNLOAD POSTMAN COLLECTION

/accounts

An “Account” at Quovo is equivalent to a login at a single financial institution. Account information is primarily related to the state of the Quovo Account, i.e., whether it is syncing successfully or not. Quovo Accounts are mainly containers for Portfolios, which contain the bulk of the financial data. Quovo users can have multiple Accounts, which is equivalent to different logins at different institutions (or even multiple logins at the same institution).

Get all accounts

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/accounts"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "accounts": [
        {
            "brokerage": 21534,
            "brokerage_name": "Test Data Brokerage",
            "config_instructions": null,
            "failures": 0,
            "id": 877247,
            "is_inactive": false,
            "last_good_sync": "2016-03-28T14:00:40.533",
            "nickname": null,
            "opened": "2016-03-26T13:45:00.813",
            "status": "good",
            "update_count": 3,
            "updated": "2016-03-28T14:00:40.533",
            "user": 162703,
            "username": "quovo_test_user",
            "value": 73479.096133
        },
        {
            "brokerage": 21700,
            "brokerage_name": "Test Bank Brokerage",
            "config_instructions": null,
            "failures": 0,
            "id": 877504,
            "is_inactive": false,
            "last_good_sync": "2016-03-28T16:58:30.980",
            "nickname": null,
            "opened": "2016-03-28T16:58:30.980",
            "status": "good",
            "update_count": 1,
            "updated": "2016-03-28T16:58:30.980",
            "user": 162703,
            "username": "quovo_test_user",
            "value": 1744.14
        }
    ]
}

GET https://api.quovo.com/v2/accounts

Description

Retrieves all Accounts across all Users.

Response Fields

Name Type Description
brokerage integer The Quovo institution ID associated with this Account.
brokerage_name string The name of the associated financial institution.
config_instructions string Institution-specific instructions for the end user, which need to be completed before the Account can successfully sync. The end user will usually need to perform some action on their institution’s website, such as enabling an option in their user settings.
failures integer The number of recent unsuccesful sync attempts. This will reset to 0 after every good sync.
id integer The unique Quovo identifier for the Account.
is_inactive boolean If an Account is inactive, it cannot be synced, and its associated Portfolios cannot have data retrieved for them. Note: inactive Accounts are set by Quovo, while inactive Portfolios can be set by you.
last_good_sync string A timestamp of the last time a sync completed successfully, i.e. returned a status of “good”.
nickname string A nickname for the Account retrieved from the financial institution.
opened string A timestamp for when the Account was added to Quovo.
status string The status of the last completed sync attempt, which indicates whether the Account was successfully synced, or if additional steps need to be completed. A table here has a full list of our Account statuses and what they mean. Note: the Account status will not change while there is an ongoing sync attempt; it will continue to show the status of the last completed sync.
update_count integer The total number of completed syncs on the Account.
updated string A timestamp of the last time there was a sync attempt. This is set regardless if the sync returned a “good” or non-“good” status.
user integer The User ID that owns the Account.
username string The username of the associated User.
value decimal The total value of all Portfolios within this Account, which is calculated after any good sync completes.

Create an Account

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"username": "testusername", "brokerage": 21534, "password": "testpassword", "user": 162703}' "https://api.quovo.com/v2/accounts"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
    "account": {
        "brokerage": 21534,
        "brokerage_name": "Test Data Brokerage",
        "config_instructions": null,
        "failures": 0,
        "id": 877247,
        "is_inactive": false,
        "last_good_sync": "2016-03-26T13:45:30.211",
        "nickname": null,
        "opened": "2016-03-26T13:45:00.813",
        "status": "good",
        "update_count": 1,
        "updated": "2016-03-26T13:45:30.211",
        "user": 162703,
        "username": "quovo_test_user",
        "value": 73479.096133
    }
}

POST https://api.quovo.com/v2/accounts

Description

Creates a new Quovo Account.

Request Parameters

Name Type Description
user* integer The Quovo User’s ID this new Account will belong to.
brokerage* integer The Quovo Brokerage ID for the associated financial institution. For example, you would pass 21534 if you wanted to create a new Account on the “Test Data Brokerage.”
username* string The end user’s login username; generally the same one they use to login directly on their institution’s website.
password* string The end user’s login password; generally the same one they use to login directly on their institution’s website.

Response Fields

Name Type Description
brokerage integer The Quovo institution ID associated with this Account.
brokerage_name string The name of the associated financial institution.
config_instructions string Institution-specific instructions for the end user, which need to be completed before the Account can successfully sync. The end user will usually need to perform some action on their institution’s website, such as enabling an option in their user settings.
failures integer The number of recent unsuccesful sync attempts. This will reset to 0 after every good sync.
id integer The unique Quovo identifier for the Account.
is_inactive boolean If an Account is inactive, it cannot be synced, and its associated Portfolios cannot have data retrieved for them. Note: inactive Accounts are set by Quovo, while inactive Portfolios can be set by you.
last_good_sync string A timestamp of the last time a sync completed successfully, i.e. returned a status of “good”.
nickname string A nickname for the Account retrieved from the financial institution.
opened string A timestamp for when the Account was added to Quovo.
status string The status of the last completed sync attempt, which indicates whether the Account was successfully synced, or if additional steps need to be completed. A table here has a full list of our Account statuses and what they mean. Note: the Account status will not change while there is an ongoing sync attempt; it will continue to show the status of the last completed sync.
update_count integer The total number of completed syncs on the Account.
updated string A timestamp of the last time there was a sync attempt. This is set regardless if the sync returned a “good” or non-“good” status.
user integer The User ID that owns the Account.
username string The username of the associated User.
value decimal The total value of all Portfolios within this Account, which is calculated after any good sync completes.

Fetch a single Account

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/accounts/877247"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "account": {
        "brokerage": 21534,
        "brokerage_name": "Test Data Brokerage",
        "config_instructions": null,
        "failures": 0,
        "id": 877247,
        "is_inactive": false,
        "last_good_sync": "2016-03-28T14:00:40.533",
        "nickname": null,
        "opened": "2016-03-26T13:45:00.813",
        "status": "good",
        "update_count": 3,
        "updated": "2016-03-28T14:00:40.533",
        "user": 162703,
        "username": "quovo_test_user",
        "value": 73479.096133
    }
}

GET https://api.quovo.com/v2/accounts/{account_id}

Description

Provides information on a specific Account

Response Fields

Name Type Description
brokerage integer The Quovo institution ID associated with this Account.
brokerage_name string The name of the associated financial institution.
config_instructions string Institution-specific instructions for the end user, which need to be completed before the Account can successfully sync. The end user will usually need to perform some action on their institution’s website, such as enabling an option in their user settings.
failures integer The number of recent unsuccesful sync attempts. This will reset to 0 after every good sync.
id integer The unique Quovo identifier for the Account.
is_inactive boolean If an Account is inactive, it cannot be synced, and its associated Portfolios cannot have data retrieved for them. Note: inactive Accounts are set by Quovo, while inactive Portfolios can be set by you.
last_good_sync string A timestamp of the last time a sync completed successfully, i.e. returned a status of “good”.
nickname string A nickname for the Account retrieved from the financial institution.
opened string A timestamp for when the Account was added to Quovo.
status string The status of the last completed sync attempt, which indicates whether the Account was successfully synced, or if additional steps need to be completed. A table here has a full list of our Account statuses and what they mean. Note: the Account status will not change while there is an ongoing sync attempt; it will continue to show the status of the last completed sync.
update_count integer The total number of completed syncs on the Account.
updated string A timestamp of the last time there was a sync attempt. This is set regardless if the sync returned a “good” or non-“good” status.
user integer The User ID that owns the Account.
username string The username of the associated User.
value decimal The total value of all Portfolios within this Account, which is calculated after any good sync completes.

Modify an Account

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"username": "testusername", "password": "newpassword"}' "https://api.quovo.com/v2/accounts/878793"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "account": {
        "brokerage": 21534,
        "brokerage_name": "Test Data Brokerage",
        "config_instructions": null,
        "failures": 0,
        "id": 878793,
        "is_inactive": false,
        "last_good_sync": "2016-03-29T15:09:47.433",
        "nickname": null,
        "opened": "2016-03-29T15:09:28.617",
        "status": "good",
        "update_count": 1,
        "updated": "2016-03-29T15:09:47.433",
        "user": 162703,
        "username": "quovo_myfirstuser",
        "value": 101596.462388
    }
}

PUT https://api.quovo.com/v2/accounts/{account_id}

Description

Modifies an existing Account.

Request Parameters

Name Type Description
brokerage integer The Quovo Brokerage ID for the associated financial institution. For example, you would pass 21534 if you wanted to change the associated Brokerage on this Account to the “Test Data Brokerage”.
username string The end user’s login username; generally the same one they use to login directly on their institution’s website. If you would like to modify the login username on this Account, you will also have to pass the login password, regardless if it is being changed or not.
password string The end user’s login password; generally the same one they use to login directly on their institution’s website. If you would like to modify the login password on this Account, you will also have to pass the login username, regardless if it is being changed or not.

Response Fields

Name Type Description
brokerage integer The Quovo institution ID associated with this Account.
brokerage_name string The name of the associated financial institution.
config_instructions string Institution-specific instructions for the end user, which need to be completed before the Account can successfully sync. The end user will usually need to perform some action on their institution’s website, such as enabling an option in their user settings.
failures integer The number of recent unsuccesful sync attempts. This will reset to 0 after every good sync.
id integer The unique Quovo identifier for the Account.
is_inactive boolean If an Account is inactive, it cannot be synced, and its associated Portfolios cannot have data retrieved for them. Note: inactive Accounts are set by Quovo, while inactive Portfolios can be set by you.
last_good_sync string A timestamp of the last time a sync completed successfully, i.e. returned a status of “good”.
nickname string A nickname for the Account retrieved from the financial institution.
opened string A timestamp for when the Account was added to Quovo.
status string The status of the last completed sync attempt, which indicates whether the Account was successfully synced, or if additional steps need to be completed. A table here has a full list of our Account statuses and what they mean. Note: the Account status will not change while there is an ongoing sync attempt; it will continue to show the status of the last completed sync.
update_count integer The total number of completed syncs on the Account.
updated string A timestamp of the last time there was a sync attempt. This is set regardless if the sync returned a “good” or non-“good” status.
user integer The User ID that owns the Account.
username string The username of the associated User.
value decimal The total value of all Portfolios within this Account, which is calculated after any good sync completes.

Delete an Account

curl -X DELETE -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/accounts/878793"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Status: 204 No Content

DELETE https://api.quovo.com/v2/accounts/{account_id}

Description

Deletes an existing Quovo Account.

Get MFA Challenges

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/accounts/878793/challenges"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "challenges": [
        {
              "account": 878793,
              "id": 60677,
              "is_answered": false,
              "last_asked": true,
              "should_answer": true,
              "type": "question",
              "question": "What city is your place of birth?"
        }
    ]
}

GET https://api.quovo.com/v2/accounts/{account_id}/challenges

Description

Returns an Account’s MFA Challenges, if any are available.

Response Fields

Name Type Description
account integer The Quovo Account the Challenge belongs to.
choices array (Only available if the Challenge type is “choices”) A list of possible MFA answers; used for MFA with a multiple-choice portion. See below for the fields in the choices objects.
id integer The unique Quovo identifier for this Challenge.
image object (Only available if the Challenge type is “image”) An object that contains a data URI or image URL that should be displayed to the end user; used for MFA that displays an image alongside its MFA question. See below for the fields in the image object.
image_choices array (Only available if the Challenge type is “image_choices”) A combination of “choices” and “image”. This field contains a list of image objects that should be displayed to the end user. See below for the fields in the image objects.
is_answered boolean This field indicates whether a Challenge has already been answered or not. Note: is_answered does not necessarily mean the MFA question was answered successfully, only that it was answered at all.
last_asked boolean This field indicates whether this specific Challenge was encountered during the most recent sync attempt. Multiple Challenges may have last_asked set to true, if multiple MFA questions were asked during the last sync attempt. This field can usually be ignored; instead, you should look to should_answer to determine whether to show an MFA Challenge or not.
question string The full text of the MFA question.
should_answer boolean If should_answer is true, this MFA Challenge is either unanswered or was answered incorrectly. This Challenge should be displayed to the end user so that he/she can update it with the appropriate answer. Note: Multiple Challenges may have should_answer set to true, which means multiple MFA Challenges need to be answered before continuing.
type string Indicates the type of MFA Challenge, which will necessitate different workflows. These different MFA types are explained in more depth here.

choices Object

Name Type Description
category string Sometimes, multiple-choice options are grouped into separate categories. For example, some real-time MFA questions have a “Phone” vs a “Text” category. When not null, these categories must be displayed to the end user. The same value might appear twice under multiple categories, e.g., the same Phone number used in both the “Phone” and “Text” categories.
value string A possible answer for the multiple-choice MFA.

image Object

Name Type Description
html string A full <img> element that should be displayed to the end user.
source string The image URL or data URI of the image. While the html field will contain the same URL, source can be used instead if you cannot safely display the raw html, or if you need to attach different attributes to the <img> element.

Answer MFA Challenges

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"questions": [{"id": 60677, "answer": "New York City"}]}' "https://api.quovo.com/v2/accounts/878793/challenges"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "challenges": [
        {
              "account": 878793,
              "id": 60677,
              "is_answered": true,
              "last_asked": true,
              "should_answer": false,
              "type": "question",
              "question": "What city is your place of birth?"
        }
    ]
}

PUT https://api.quovo.com/v2/accounts/{account_id}/challenges

Description

Answer all available MFA Challenges for an Account.

You can provide either a question and an answer, or a JSON array containing multiple challenge and answer objects (using the questions field). Requests with all three parameters given will ignore the questions parameter. You can also answer individual Challenges by targeting their ID.

For more information on answering MFA questions, see our “Workflows” section here.

Request Parameters

Name Type Description
question string The full text of the MFA Challenge’s question you are attempting to answer. This should contain the entire string as it appears in the original MFA question.
answer string The answer to the MFA Challenge. If this is a multiple-choice MFA, you can either pass the index (starting at 0) of the correct MFA choice or you can send the entire choice object in JSON format.
questions string Useful for answering multiple MFA Challenges at once, in lieu of answering them one-by-one using the question and answer fields. This parameter must be an array of objects each containing an id and answer field, where id is the targeted Challenge’s id.

Response Fields

Name Type Description
account integer The Quovo Account the Challenge belongs to.
choices array (Only available if the Challenge type is “choices”) A list of possible MFA answers; used for MFA with a multiple-choice portion. See below for the fields in the choices objects.
id integer The unique Quovo identifier for this Challenge.
image object (Only available if the Challenge type is “image”) An object that contains a data URI or image URL that should be displayed to the end user; used for MFA that displays an image alongside its MFA question. See below for the fields in the image object.
image_choices array (Only available if the Challenge type is “image_choices”) A combination of “choices” and “image”. This field contains a list of image objects that should be displayed to the end user. See below for the fields in the image objects.
is_answered boolean This field indicates whether a Challenge has already been answered or not. Note: is_answered does not necessarily mean the MFA question was answered successfully, only that it was answered at all.
last_asked boolean This field indicates whether this specific Challenge was encountered during the most recent sync attempt. Multiple Challenges may have last_asked set to true, if multiple MFA questions were asked during the last sync attempt. This field can usually be ignored; instead, you should look to should_answer to determine whether to show an MFA Challenge or not.
question string The full text of the MFA question.
should_answer boolean If should_answer is true, this MFA Challenge is either unanswered or was answered incorrectly. This Challenge should be displayed to the end user so that he/she can update it with the appropriate answer. Note: Multiple Challenges may have should_answer set to true, which means multiple MFA Challenges need to be answered before continuing.
type string Indicates the type of MFA Challenge, which will necessitate different workflows. These different MFA types are explained in more depth here.

choices Object

Name Type Description
category string Sometimes, multiple-choice options are grouped into separate categories. For example, some real-time MFA questions have a “Phone” vs a “Text” category. When not null, these categories must be displayed to the end user. The same value might appear twice under multiple categories, e.g., the same Phone number used in both the “Phone” and “Text” categories.
value string A possible answer for the multiple-choice MFA.

image Object

Name Type Description
html string A full <img> element that should be displayed to the end user.
source string The image URL or data URI of the image. While the html field will contain the same URL, source can be used instead if you cannot safely display the raw html, or if you need to attach different attributes to the <img> element.

Get an MFA Challenge

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/accounts/878793/challenges/60677"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "challenge": {
        "account": 878793,
        "id": 60677,
        "is_answered": false,
        "last_asked": true,
        "should_answer": true,
        "type": "question",
        "question": "What city is your place of birth?"
    }
}

GET https://api.quovo.com/v2/accounts/{account_id}/challenges/{challenge_id}

Description

Retrieves an MFA Challenge.

Response Fields

Name Type Description
account integer The Quovo Account the Challenge belongs to.
choices array (Only available if the Challenge type is “choices”) A list of possible MFA answers; used for MFA with a multiple-choice portion. See below for the fields in the choices objects.
id integer The unique Quovo identifier for this Challenge.
image object (Only available if the Challenge type is “image”) An object that contains a data URI or image URL that should be displayed to the end user; used for MFA that displays an image alongside its MFA question. See below for the fields in the image object.
image_choices array (Only available if the Challenge type is “image_choices”) A combination of “choices” and “image”. This field contains a list of image objects that should be displayed to the end user. See below for the fields in the image objects.
is_answered boolean This field indicates whether a Challenge has already been answered or not. Note: is_answered does not necessarily mean the MFA question was answered successfully, only that it was answered at all.
last_asked boolean This field indicates whether this specific Challenge was encountered during the most recent sync attempt. Multiple Challenges may have last_asked set to true, if multiple MFA questions were asked during the last sync attempt. This field can usually be ignored; instead, you should look to should_answer to determine whether to show an MFA Challenge or not.
question string The full text of the MFA question.
should_answer boolean If should_answer is true, this MFA Challenge is either unanswered or was answered incorrectly. This Challenge should be displayed to the end user so that he/she can update it with the appropriate answer. Note: Multiple Challenges may have should_answer set to true, which means multiple MFA Challenges need to be answered before continuing.
type string Indicates the type of MFA Challenge, which will necessitate different workflows. These different MFA types are explained in more depth here.

choices Object

Name Type Description
category string Sometimes, multiple-choice options are grouped into separate categories. For example, some real-time MFA questions have a “Phone” vs a “Text” category. When not null, these categories must be displayed to the end user. The same value might appear twice under multiple categories, e.g., the same Phone number used in both the “Phone” and “Text” categories.
value string A possible answer for the multiple-choice MFA.

image Object

Name Type Description
html string A full <img> element that should be displayed to the end user.
source string The image URL or data URI of the image. While the html field will contain the same URL, source can be used instead if you cannot safely display the raw html, or if you need to attach different attributes to the <img> element.

Answer a Challenge

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"answer": "New York City"}' "https://api.quovo.com/v2/accounts/878793/challenges/60677"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "challenge": {
        "account": 880701,
        "id": 60677,
        "is_answered": true,
        "last_asked": true,
        "should_answer": false,
        "type": "question",
        "question": "What city is your place of birth?"
    }
}

PUT https://api.quovo.com/v2/accounts/{account_id}/challenges/{challenge_id}

Description

Answer an MFA Challenge.

For more information on answering MFA questions, see our “Workflows” section here.

Request Parameters

Name Type Description
answer* string The answer to the MFA Challenge. If this is a multiple-choice MFA, you can either pass the index (starting at 0) of the correct MFA choice or you can send the entire choice object in JSON format.

Response Fields

Name Type Description
account integer The Quovo Account the Challenge belongs to.
choices array (Only available if the Challenge type is “choices”) A list of possible MFA answers; used for MFA with a multiple-choice portion. See below for the fields in the choices objects.
id integer The unique Quovo identifier for this Challenge.
image object (Only available if the Challenge type is “image”) An object that contains a data URI or image URL that should be displayed to the end user; used for MFA that displays an image alongside its MFA question. See below for the fields in the image object.
image_choices array (Only available if the Challenge type is “image_choices”) A combination of “choices” and “image”. This field contains a list of image objects that should be displayed to the end user. See below for the fields in the image objects.
is_answered boolean This field indicates whether a Challenge has already been answered or not. Note: is_answered does not necessarily mean the MFA question was answered successfully, only that it was answered at all.
last_asked boolean This field indicates whether this specific Challenge was encountered during the most recent sync attempt. Multiple Challenges may have last_asked set to true, if multiple MFA questions were asked during the last sync attempt. This field can usually be ignored; instead, you should look to should_answer to determine whether to show an MFA Challenge or not.
question string The full text of the MFA question.
should_answer boolean If should_answer is true, this MFA Challenge is either unanswered or was answered incorrectly. This Challenge should be displayed to the end user so that he/she can update it with the appropriate answer. Note: Multiple Challenges may have should_answer set to true, which means multiple MFA Challenges need to be answered before continuing.
type string Indicates the type of MFA Challenge, which will necessitate different workflows. These different MFA types are explained in more depth here.

choices Object

Name Type Description
category string Sometimes, multiple-choice options are grouped into separate categories. For example, some real-time MFA questions have a “Phone” vs a “Text” category. When not null, these categories must be displayed to the end user. The same value might appear twice under multiple categories, e.g., the same Phone number used in both the “Phone” and “Text” categories.
value string A possible answer for the multiple-choice MFA.

image Object

Name Type Description
html string A full <img> element that should be displayed to the end user.
source string The image URL or data URI of the image. While the html field will contain the same URL, source can be used instead if you cannot safely display the raw html, or if you need to attach different attributes to the <img> element.

Get Transactions

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/accounts/878793/history"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "history": [
        {
            "account": 877247,
            "currency": null,
            "cusip": "594918104",
            "date": "2014-05-01",
            "expense_category": null,
            "fees": 0.0,
            "fxrate": 1.0,
            "id": 199436905,
            "is_cancel": false,
            "is_pending": false,
            "memo": "Bought MSFT",
            "portfolio": 746745,
            "price": 40.0,
            "quantity": 9.0,
            "ticker": "MSFT",
            "ticker_name": "Microsoft Corporation",
            "tran_category": "B",
            "tran_type": "BUYL",
            "user": 162703,
            "value": -360.0
        },
        {
            "account": 877247,
            "currency": null,
            "cusip": "037833100",
            "date": "2014-05-05",
            "expense_category": null,
            "fees": 0.0,
            "fxrate": 1.0,
            "id": 199436906,
            "is_cancel": false,
            "is_pending": false,
            "memo": "Bought AAPL",
            "portfolio": 746745,
            "price": 600.96,
            "quantity": 11.0,
            "ticker": "AAPL",
            "ticker_name": "Apple Inc",
            "tran_category": "B",
            "tran_type": "BUYL",
            "user": 162703,
            "value": -6610.56
        }
    ]
}

GET https://api.quovo.com/v2/accounts/{account_id}/history

Description

Fetches all of an Account’s transactions, across all its Portfolios.

Request Parameters

Name Type Description
cursor integer This parameter is used for paginated results as a pointer to the next set of transactions. Review the Pagination section in the Introduction to learn more about paginated results.
count integer The max number of transactions you would like to return for this request.
start_date string All transactions returned will have a date greater than the given start_date.
end_date string All transactions returned will have a date less than the given end_date.
start_id integer All transactions returned will have an id greater than the given start_id.
end_id integer All transactions returned will have an id less than the given end_id.

Response Fields

Name Type Description
account integer The Quovo Account that the transaction belongs to.
currency string An ISO 4217 code for transactions in foreign currencies. currency will be null for any transaction priced in USD.
cusip string A 9-character CUSIP indentifier. Note: this may not be available for all securities, and may return null for some transactions that have a ticker.
date string The trade/execution date of the transaction.
expense_category string The expense category of the transaction, such as “Entertainment” or “Groceries”. This only applies to Cash transactions within a subset of Portfolios, depending on their type. See here for a full list of available expense categories.
fees decimal The combined value of all fees (commission, bookkeeping, etc.) applied to the transaction.
fxrate decimal The foreign exchange rate used to translate any foreign currency into USD. This rate will be 1.00 for any transaction priced in USD. To view all prices and values in their local currency, divide price and value by the fxrate (price / fxrate == local_price).
id integer The unique Quovo identifier for the transaction.
is_cancel boolean This field indicates whether the transaction is a Cancel Transaction or not. Cancel Transactions occur when existing transactions are substantially updated or completely removed by the institution. See here for additional information.
is_pending boolean This field indicates whether the transaction is pending or not. Pending transactions are cash transactions that have not yet settled in a bank account. See here for additional information.
memo string A descriptive, long-form text of the transaction, taken from the institution.
portfolio integer The Quovo Portfolio that the transaction belongs to.
price decimal The price per unit of this transaction, as reported by the financial institution. This will be 0 for transactions such as cash deposits or withdrawals.
quantity decimal The number of units transferred, bought, or sold in this transaction, as reported by the financial institution. This will be 0 for transactions such as cash deposits or withdrawals.
ticker string The public symbol for the relevant security in the transaction. Quovo uses several fallback identifiers when the ticker is unavailable: if a CUSIP is specified, it will be used instead; if the security is unique to a specific institution, the ticker will have a prefix of FI: to identify it as such (e.g., “FI:SVF-N”); if we are unable to identify the relevant security, the ticker will have a prefix of UN: (e.g., “UN:0000E3C9”). Any transaction that does not use a security, such as cash deposits or withdrawals, will have an empty string "" as the ticker, not null.
ticker_name string The name of the associated security.
tran_category string A broad category that helps identify the transaction type. See here for additional information on transaction categories.
tran_type string A much more specific and fine-grained identifier of the transaction type. See here for a full list of transaction types.
user integer The Quovo User the Portfolio and Account belong to.
value decimal The total value of the transaction. For example, on buys, this value will generally be equal to quantity * price; for cash deposits, this value will be equal to the total value deposited.

Get Manual Assets

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/accounts/878793/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "manual_assets": [
        {
            "account": 878793,
            "id": 99102189,
            "portfolio": 1042111,
            "portfolio_name": "Real Estate",
            "price": 812500,
            "quantity": 1,
            "ticker": "UN:00070EF7",
            "ticker_name": "Quovo Condo (1042111)",
            "user": 162703,
            "username": "quovo_test_user",
            "value": 812500
        }
    ]
}

GET https://api.quovo.com/v2/accounts/{account_id}/manual_assets

Description

Fetches all Manual Assets for a specific Account.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
id integer A unique Quovo identifier for the Manual Asset. Note: The ID may change after the Asset is updated, so do not use IDs to track Assets.
portfolio integer The Quovo Manual Portfolio the Asset belongs to.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.
ticker string The Quovo-generated symbol for the Asset. All Manual Asset tickers will have a prefix of UN:, like other unidentified holdings.
ticker_name string The name of the Manual Asset as entered by the end user.
user integer The Quovo User the Portfolio and Account belong to.
username string The username of the associated Quovo User.
value decimal The total value of the Asset.

Get Manual Portfolios

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/accounts/878793/manual_portfolios"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "manual_portfolios": [
        {
            "account": 878793,
            "brokerage": 21639,
            "brokerage_name": "Manually Entered Assets",
            "id": 1042111,
            "is_inactive": false,
            "last_change": "2016-07-18T14:07:46.510",
            "portfolio_name": "Real Estate",
            "update_count": 6,
            "user": 162703,
            "username": "quovo_test_user",
            "value": 812500
        },
    ]
}

GET https://api.quovo.com/v2/accounts/{account_id}/manual_portfolios

Description

Fetches the Manual Portfolios for a specific Account.

Response Fields

Name Type Description
account integer The Quovo Account the Manual Portfolio belongs to.
brokerage integer The Quovo Brokerage the Account is associated with. All manually-entered Portfolios will be on Brokerage 21639.
brokerage_name string The name of the associated financial institution. All manually-entered Portfolios will be on the Brokerage “Manually Entered Assets”.
id integer The unique Quovo identifier for the Portfolio.
is_inactive boolean Inactive Manual Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value.
last_change string A timestamp of the last time the Manual Portfolio or its Assets were updated.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
update_count integer The total number of times the Portfolio has been updated by the end user. This includes any time the Portfolio’s Manual Assets were updated.
user integer The Quovo User the Portfolio belongs to.
username string The username of the associated Quovo User.
value decimal The total sum value of all Manual Assets within the Portfolio. This value is calculated after any holding within the Portfolio is updated by the user.

Get Portfolios

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/accounts/878793/portfolios"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "portfolios": [
        {
            "account": 878793,
            "brokerage": 21534,
            "brokerage_name": "Test Data Brokerage",
            "description": null,
            "id": 750007,
            "is_inactive": true,
            "is_taxable": true,
            "last_change": "2016-03-29T15:09:47.447",
            "nickname": null,
            "owner_type": "Individual Account",
            "portfolio_category": "Investment",
            "portfolio_name": "Investment Account",
            "portfolio_type": "Brokerage Account",
            "portfolio_type_confidence": "High",
            "update_count": 0,
            "user": 162703,
            "username": "quovo_myfirstuser",
            "value": 0.0
        }
    ]
}

GET https://api.quovo.com/v2/accounts/{account_id}/portfolios

Description

Provides information on all of an Account’s Portfolios.

Response Fields

Name Type Description
account integer The Quovo Account the Portfolio belongs to.
brokerage integer The Quovo Brokerage the Account is associated with.
brokerage_name string The name of the associated financial institution.
description string A description of the Portfolio, taken from the financial institution. The usage of the description field varies by institution, so this field may return null for some Portfolios.
id integer The unique Quovo identifier for the Portfolio.
is_inactive boolean Inactive Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value. You may want to set a Portfolio’s is_inactive state to true if the end user wants to only utilize a subset of Portfolios within an Account. Note that an inactive Portfolio within an inactive Account cannot be made active (because Quovo controls the Account is_inactive state).
is_taxable boolean Indicates whether a specific Portfolio type is considered to be taxable or non-taxable. The values conform to standard tax treatment for Portfolio types (e.g., Roth IRAs are generally understood to be non-taxable).
last_change string A timestamp of the last time the Portfolio’s information was updated.
nickname string A descriptive name for the Portfolio. While there is a nickname taken from the financial institution, this field may be overriden by end users.
owner_type string The ownership type of the Portfolio. Possible values are “Individual Account”, “Joint Account”, and “Trust Account.”
portfolio_category string A grouping of the Portfolio according to broader industry attributes, as identified by Quovo. Possible values include “Banking”, “Investment”, “Insurance”, and “Loan”. Categories can have multiple corresponding Portfolio types, while Portfolio types can only have one category. See here for a full mapping of portfolio_type to portfolio_category.
portfolio_name string The full Portfolio “name” as found at the financial institution. This field often contains the full account number. Note: Because of the sensitive nature of Users’ financial institution account numbers, the portfolio_name field is obfuscated by default. It may be unobfuscated upon request.
portfolio_type string The type of Portfolio as identified by Quovo, based on its holdings, transactions, and tax eligibility. This value may also be overridden by the end user. Possible values for portfolio_type include “Checking”, “401k”, “IRA”, and more. See here for a full list of values.
portfolio_type_confidence string The level of confidence in the accuracy of the portfolio_type. Confidence levels are split into four tiers: “Very High”, “High”, “Moderate”, and “Low”. This value can be used to decide whether you should use the portfolio_type, or ignore it due to its low confidence level.
update_count integer The total number of times the Portfolio has been successfully updated. Unlike Accounts, Portfolios will only be updated if there was a successful sync.
user integer The Quovo User the Portfolio and its Account belong to.
username string The username of the associated Quovo User.
value decimal The total sum value of all Positions within the Portfolio. This value is calculated after any good sync completes. Because of intraday price updates, it may be best to calculate the Portfolio’s value manually by fetching the Portfolio’s Positions and summing their individual values.

Get Positions

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/accounts/878793/positions"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "positions": [
        {
            "account": 878793,
            "asset_class": "Mid Cap Equity",
            "cost_basis": null,
            "cost_basis_type": null,
            "currency": null,
            "cusip": "067901108",
            "fxrate": 1.0,
            "id": 240356218,
            "last_purchase_date": "2016-01-04",
            "market_code": "NYE",
            "portfolio": 750007,
            "portfolio_name": "***ount",
            "price": 13.61,
            "quantity": 562.0,
            "sector": "Basic Materials",
            "security_type": "Equity",
            "security_type_confidence": "Very High",
            "ticker": "ABX",
            "ticker_name": "Barrick Gold Corp.",
            "user": 162703,
            "username": "quovo_myfirstuser",
            "value": 7648.82
        },
        {
            "account": 878793,
            "asset_class": "Mid Cap Equity",
            "cost_basis": null,
            "cost_basis_type": null,
            "currency": null,
            "cusip": "200525103",
            "fxrate": 1.0,
            "id": 240356219,
            "last_purchase_date": "2016-02-02",
            "market_code": "NSD",
            "portfolio": 750007,
            "portfolio_name": "***ount",
            "price": 44.59,
            "quantity": 465.332164335,
            "sector": null,
            "security_type": "Equity",
            "security_type_confidence": "Very High",
            "ticker": "CBSH",
            "ticker_name": "Commerce Bancshares Inc.",
            "user": 162703,
            "username": "quovo_myfirstuser",
            "value": 20749.1612076977
        }
    ]
}

GET https://api.quovo.com/v2/accounts/{account_id}/positions

Description

Retrieves Positions across all of an Account’s Portfolios.

Request Parameters

Name Type Description
cursor integer This parameter is used for paginated results as a pointer to the next set of Positions. Review the Pagination section in the Introduction to learn more about paginated results.
count integer The max number of Positions you would like to return for this request.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
asset_class string The asset class of the associated security. Note: Some securities may have similar security types and asset classes (such as cash), while others will be quite different (such as ETFs and Mutual Funds) For a list of all available asset classes, see the Asset Classes section.
cost_basis decimal The total cost basis value of the Position (this parameter is not given on a per-share basis).
cost_basis_type string The source of the cost basis value. Possible values are “brokerage”, “quovo-complete”, and “quovo-incomplete”. “brokerage” indicates the cost basis comes directly from the financial institution. “quovo-complete” means we calculated cost basis based on fully available Position history, while “quovo-incomplete” means we calculated the value with only partial Position history available.
currency string An ISO 4217 code for Positions in foreign currencies. currency will be null for any security priced in USD.
cusip string The 9-character CUSIP indentifier. Note: this may not be available for all securities, and may return null for some Positions.
fxrate decimal The foreign exchange rate used to translate any foreign currency into USD. This rate will be 1.00 for any Position priced in USD. To view all prices and values in their local currency, divide price and value by the fxrate (price / fxrate == local_price).
id integer A unique Quovo identifier for the Position. Note: IDs will change on every successful sync, so do not use IDs to track Quovo Positions.
last_purchase_date string The date of the last time this security was purchased in this Portfolio.
market_code string The short name of the stock exchange or market where the security is traded, e.g., “NYE” or “NSD”.
portfolio integer The Quovo Portfolio the Position belongs to.
portfolio_name string The full Portfolio name as found at the financial institution.
price decimal The price per unit of this Position, either retrieved from the Quovo security master or as reported by the financial institution.
quantity decimal The number of units of this Position, as reported by the financial institution.
sector string The industry sector for equities, e.g., “Technology” or “Industrials.” For a list of all available sectors, check the Sectors section.
security_type string The type of the associated security, e.g., “Equity” or “Bond.” For a list of all available security types, check the Security Types section.
security_type_confidence string The level of confidence in the accuracy of the security_type. Confidence levels are split into four tiers: “Very High”, “High”, “Moderate”, and “Low”. This value can be used to decide whether you should use the security_type, or ignore it due to its low confidence level.
ticker string The public symbol for the relevant security in the Position. Quovo uses several fallback identifiers when the ticker is unavailable: if a CUSIP is specified, it will be used instead; if the security is unique to a specific institution, the ticker will have a prefix of FI: to identify it as such (e.g., “FI:SVF-N”); if we are unable to identify the relevant security, the ticker will have a prefix of UN: (e.g., “UN:0000E3C9”). Any cash Position will use a ticker of CUR:USD.
ticker_name string The name of the associated security.
user integer The Quovo user the Portfolio and Account belong to.
username string The username of the associated Quovo user.
value decimal The total value of the Position.

Check sync progress

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/accounts/878793/sync"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "sync": {
        "account": 878793,
        "has_realtime": false,
        "progress": {
            "message": "authenticating",
            "percent": 0.10,
            "state": "authenticating"
        },
        "status": "syncing"
    }
}

GET https://api.quovo.com/v2/accounts/{account_id}/sync

Description

Check the sync progress of an Account.

Response Fields

Name Type Description
account integer The Quovo Account that is being synced.
config_instructions string (Only available if the final sync status is config) Institution-specific instructions for the end user, which need to be completed before the Account can successfully sync. The end user will usually need to perform some action on their institution’s website, such as enabling an option in their user settings.
has_realtime boolean Indicates whether the Account currently has real-time MFA Challenges that need to be answered. See here for more details on the real-time MFA workflow.
progress object A nested object indicating current sync status. See the table below for the object fields and their descriptions.
status string The sync status of the Account. This field will simply be “syncing” while a sync is in progress. After the sync ends, this field will indicate whether the Account was synced successfully (“good”), or if the Account has MFA Challenges to answer (“questions”), and more. See here for a full list of Account sync statuses.

progress Object

Name Type Description
message string A user-friendly message that indicates the current syncing progress.
percent decimal The percentage (from 0.00 to 1.00) of sync completion.
state string A more machine-friendly string that also indicates the current syncing progress. For a list of all possible sync states, see the Data Specs section here.

Start a new sync

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/accounts/880701/sync"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 201 Created
{
    "sync": {
        "account": 880701,
        "has_realtime": false,
        "progress": {
            "message": "queued",
            "percent": 0,
            "state": "queued"
        },
        "status": "syncing"
    }
}

POST https://api.quovo.com/v2/accounts/{account_id}/sync

Description

Initiates a new sync on the Account.

Request Parameters

Name Type Description
account integer The Quovo Account that the sync should be performed on.

Response Fields

Name Type Description
account integer The Quovo Account that is being synced.
config_instructions string (Only available if the final sync status is config) Institution-specific instructions for the end user, which need to be completed before the Account can successfully sync. The end user will usually need to perform some action on their institution’s website, such as enabling an option in their user settings.
has_realtime boolean Indicates whether the Account currently has real-time MFA Challenges that need to be answered. See here for more details on the real-time MFA workflow.
progress object A nested object indicating current sync status. See the table below for the object fields and their descriptions.
status string The sync status of the Account. This field will simply be “syncing” while a sync is in progress. After the sync ends, this field will indicate whether the Account was synced successfully (“good”), or if the Account has MFA Challenges to answer (“questions”), and more. See here for a full list of Account sync statuses.

progress Object

Name Type Description
message string A user-friendly message that indicates the current syncing progress.
percent decimal The percentage (from 0.00 to 1.00) of sync completion.
state string A more machine-friendly string that also indicates the current syncing progress. For a list of all possible sync states, see the Data Specs section here.

/brokerages

A Quovo connection to a specific financial institution (or related sub-portal). Each Account must belong to a single Brokerage in order to sync data.

Fetch all available Brokerages

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/brokerages"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "brokerages": [
        {
            "id": 21534,
            "is_test": true,
            "name": "Test Data Brokerage",
            "notes": null,
            "password": null,
            "popularity_score": 1,
            "status": "available",
            "username": null,
            "website": "www.quovo.com"
        },
        {
            "id": 21700,
            "is_test": true,
            "name": "Test Bank Brokerage",
            "notes": null,
            "password": null,
            "popularity_score": 1,
            "status": "available",
            "username": null,
            "website": "www.quovo.com"
        }
    ]
}

GET https://api.quovo.com/v2/brokerages

Description

Provides information on all of Quovo’s supported Brokerages.

Response Fields

Name Type Description
id integer The unique Quovo identifier for the financial institution.
is_test boolean Several Brokerages are fake institutions meant to help simulate various API responses and workflows. These are for development purposes and should not be displayed to end users.
name string The name of the financial institution.
notes string Brokerage-specific information to help users successfully sync to the institution. These notes can and should be displayed, when available, to the end user.
password string Display text for the password field. This field is used when the “password” field at the institution actually represents another input field, such as a PIN Number. If available, be sure to show this to the end user instead of “Password.”
popularity_score integer A measure of the institution’s popularity based on broad groupings of all Quovo institutions according to their size. This score is useful for ordering available institutions, ensuring the more popular and typical institutions are seen first. Scores range from 1-10, with 10 being the most popular and 1 being the least.
status string The availability status of the institution. status will be “available” if the institution is currently accepting sync requests or “unavailable” if it is not.
username string Display text for the username field. This field is used when the “username” field at the institution actually represents another input field, such as Account Number. If available, be sure to show this to the end user instead of “Username.”
website string The financial institution’s website. This may be helpful to display to end users as they have another field, aside from Brokerage name, to help verify the correct Brokerage.

Get a single Brokerage

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/brokerages/21534"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "brokerage": {
        "id": 21534,
        "is_test": true,
        "name": "Test Data Brokerage",
        "notes": null,
        "password": null,
        "popularity_score": 1,
        "status": "available",
        "username": null,
        "website": "www.quovo.com"
    }
}

GET https://api.quovo.com/v2/brokerages/{brokerage_id}

Description

Provides information on a single Quovo-supported Brokerage.

Response Fields

Name Type Description
id integer The unique Quovo identifier for the financial institution.
is_test boolean Several Brokerages are fake institutions meant to help simulate various API responses and workflows. These are for development purposes and should not be displayed to end users.
name string The name of the financial institution.
notes string Brokerage-specific information to help users successfully sync to the institution. These notes can and should be displayed, when available, to the end user.
password string Display text for the password field. This field is used when the “password” field at the institution actually represents another input field, such as a PIN Number. If available, be sure to show this to the end user instead of “Password.”
popularity_score integer A measure of the institution’s popularity based on broad groupings of all Quovo institutions according to their size. This score is useful for ordering available institutions, ensuring the more popular and typical institutions are seen first. Scores range from 1-10, with 10 being the most popular and 1 being the least.
status string The availability status of the institution. status will be “available” if the institution is currently accepting sync requests or “unavailable” if it is not.
username string Display text for the username field. This field is used when the “username” field at the institution actually represents another input field, such as Account Number. If available, be sure to show this to the end user instead of “Username.”
website string The financial institution’s website. This may be helpful to display to end users as they have another field, aside from Brokerage name, to help verify the correct Brokerage.

/challenges

Challenges are the multi-factor authentication (MFA) questions that institutions may require answering before an Account can be successfully synced. “What was your first pet’s name?”“ is a common example of an MFA question. There are many types of MFA questions, such as multiple-choice MFA or two-step verification. These different Challenge types are explained more in-depth below.

Get MFA Challenges

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/challenges?account=878793"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "challenges": [
        {
              "account": 878793,
              "id": 60677,
              "is_answered": false,
              "last_asked": true,
              "should_answer": true,
              "type": "question",
              "question": "What city is your place of birth?"
        }
    ]
}

GET https://api.quovo.com/v2/challenges

Description

Retrieves any Challenges associated with an Account.

Request Parameters

Name Type Description
account* integer The Quovo Account you want to fetch Challenges for.

Response Fields

Name Type Description
account integer The Quovo Account the Challenge belongs to.
choices array (Only available if the Challenge type is "choices”) A list of possible MFA answers; used for MFA with a multiple-choice portion. See below for the fields in the choices objects.
id integer The unique Quovo identifier for this Challenge.
image object (Only available if the Challenge type is “image”) An object that contains a data URI or image URL that should be displayed to the end user; used for MFA that displays an image alongside its MFA question. See below for the fields in the image object.
image_choices array (Only available if the Challenge type is “image_choices”) A combination of “choices” and “image”. This field contains a list of image objects that should be displayed to the end user. See below for the fields in the image objects.
is_answered boolean This field indicates whether a Challenge has already been answered or not. Note: is_answered does not necessarily mean the MFA question was answered successfully, only that it was answered at all.
last_asked boolean This field indicates whether this specific Challenge was encountered during the most recent sync attempt. Multiple Challenges may have last_asked set to true, if multiple MFA questions were asked during the last sync attempt. This field can usually be ignored; instead, you should look to should_answer to determine whether to show an MFA Challenge or not.
question string The full text of the MFA question.
should_answer boolean If should_answer is true, this MFA Challenge is either unanswered or was answered incorrectly. This Challenge should be displayed to the end user so that he/she can update it with the appropriate answer. Note: Multiple Challenges may have should_answer set to true, which means multiple MFA Challenges need to be answered before continuing.
type string Indicates the type of MFA Challenge, which will necessitate different workflows. These different MFA types are explained in more depth here.

choices Object

Name Type Description
category string Sometimes, multiple-choice options are grouped into separate categories. For example, some real-time MFA questions have a “Phone” vs a “Text” category. When not null, these categories must be displayed to the end user. The same value might appear twice under multiple categories, e.g., the same Phone number used in both the “Phone” and “Text” categories.
value string A possible answer for the multiple-choice MFA.

image Object

Name Type Description
html string A full <img> element that should be displayed to the end user.
source string The image URL or data URI of the image. While the html field will contain the same URL, source can be used instead if you cannot safely display the raw html, or if you need to attach different attributes to the <img> element.

Answer MFA Challenges

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"account": 880701, "questions": [{"id": 60677, "answer": "New York City"}]}' "https://api.quovo.com/v2/challenges"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "challenges": [
        {
              "account": 880701,
              "id": 60677,
              "is_answered": true,
              "last_asked": true,
              "should_answer": false,
              "type": "question",
              "question": "What city is your place of birth?"
        }
    ]
}

PUT https://api.quovo.com/v2/challenges

Description

Answer available MFA Challenges for an Account.

You can provide either a question and an answer, or a JSON array containing multiple challenge and answer objects (using the questions field). Requests with all three parameters given will ignore the questions parameter. You can also answer individual Challenges by targeting their ID.

For more information on answering MFA questions, see our “Workflows” section here.

Request Parameters

Name Type Description
account* integer The Quovo Account the Challenge belongs to.
question string The full text of the MFA Challenge’s question you are attempting to answer. This should contain the entire string as it appears in the original MFA question.
answer string The answer to the MFA Challenge. If this is a multiple-choice MFA, you can either pass the index (starting at 0) of the correct MFA choice or you can send the entire choice object in JSON format.
questions string Useful for answering multiple MFA Challenges at once, in lieu of answering them one-by-one using the question and answer fields. This parameter must be an array of objects each containing an id and answer field, where id is the targeted Challenge’s id.

Response Fields

Name Type Description
account integer The Quovo Account the Challenge belongs to.
choices array (Only available if the Challenge type is “choices”) A list of possible MFA answers; used for MFA with a multiple-choice portion. See below for the fields in the choices objects.
id integer The unique Quovo identifier for this Challenge.
image object (Only available if the Challenge type is “image”) An object that contains a data URI or image URL that should be displayed to the end user; used for MFA that displays an image alongside its MFA question. See below for the fields in the image object.
image_choices array (Only available if the Challenge type is “image_choices”) A combination of “choices” and “image”. This field contains a list of image objects that should be displayed to the end user. See below for the fields in the image objects.
is_answered boolean This field indicates whether a Challenge has already been answered or not. Note: is_answered does not necessarily mean the MFA question was answered successfully, only that it was answered at all.
last_asked boolean This field indicates whether this specific Challenge was encountered during the most recent sync attempt. Multiple Challenges may have last_asked set to true, if multiple MFA questions were asked during the last sync attempt. This field can usually be ignored; instead, you should look to should_answer to determine whether to show an MFA Challenge or not.
question string The full text of the MFA question.
should_answer boolean If should_answer is true, this MFA Challenge is either unanswered or was answered incorrectly. This Challenge should be displayed to the end user so that he/she can update it with the appropriate answer. Note: Multiple Challenges may have should_answer set to true, which means multiple MFA Challenges need to be answered before continuing.
type string Indicates the type of MFA Challenge, which will necessitate different workflows. These different MFA types are explained in more depth here.

choices Object

Name Type Description
category string Sometimes, multiple-choice options are grouped into separate categories. For example, some real-time MFA questions have a “Phone” vs a “Text” category. When not null, these categories must be displayed to the end user. The same value might appear twice under multiple categories, e.g., the same Phone number used in both the “Phone” and “Text” categories.
value string A possible answer for the multiple-choice MFA.

image Object

Name Type Description
html string A full <img> element that should be displayed to the end user.
source string The image URL or data URI of the image. While the html field will contain the same URL, source can be used instead if you cannot safely display the raw html, or if you need to attach different attributes to the <img> element.

Get an MFA Challenge

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/challenges/60677"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "challenge": {
        "account": 878793,
        "id": 60677,
        "is_answered": false,
        "last_asked": true,
        "should_answer": true,
        "type": "question",
        "question": "What city is your place of birth?"
    }
}

GET https://api.quovo.com/v2/challenges/{challenge_id}

Description

Retrieves an MFA Challenge.

Response Fields

Name Type Description
account integer The Quovo Account the Challenge belongs to.
choices array (Only available if the Challenge type is “choices”) A list of possible MFA answers; used for MFA with a multiple-choice portion. See below for the fields in the choices objects.
id integer The unique Quovo identifier for this Challenge.
image object (Only available if the Challenge type is “image”) An object that contains a data URI or image URL that should be displayed to the end user; used for MFA that displays an image alongside its MFA question. See below for the fields in the image object.
image_choices array (Only available if the Challenge type is “image_choices”) A combination of “choices” and “image”. This field contains a list of image objects that should be displayed to the end user. See below for the fields in the image objects.
is_answered boolean This field indicates whether a Challenge has already been answered or not. Note: is_answered does not necessarily mean the MFA question was answered successfully, only that it was answered at all.
last_asked boolean This field indicates whether this specific Challenge was encountered during the most recent sync attempt. Multiple Challenges may have last_asked set to true, if multiple MFA questions were asked during the last sync attempt. This field can usually be ignored; instead, you should look to should_answer to determine whether to show an MFA Challenge or not.
question string The full text of the MFA question.
should_answer boolean If should_answer is true, this MFA Challenge is either unanswered or was answered incorrectly. This Challenge should be displayed to the end user so that he/she can update it with the appropriate answer. Note: Multiple Challenges may have should_answer set to true, which means multiple MFA Challenges need to be answered before continuing.
type string Indicates the type of MFA Challenge, which will necessitate different workflows. These different MFA types are explained in more depth here.

choices Object

Name Type Description
category string Sometimes, multiple-choice options are grouped into separate categories. For example, some real-time MFA questions have a “Phone” vs a “Text” category. When not null, these categories must be displayed to the end user. The same value might appear twice under multiple categories, e.g., the same Phone number used in both the “Phone” and “Text” categories.
value string A possible answer for the multiple-choice MFA.

image Object

Name Type Description
html string A full <img> element that should be displayed to the end user.
source string The image URL or data URI of the image. While the html field will contain the same URL, source can be used instead if you cannot safely display the raw html, or if you need to attach different attributes to the <img> element.

Answer an MFA Challenge

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"answer": "New York City"}' "https://api.quovo.com/v2/challenges/60677"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "challenge": {
        "account": 880701,
        "id": 60677,
        "is_answered": true,
        "last_asked": true,
        "should_answer": false,
        "type": "question",
        "question": "What city is your place of birth?"
    }
}

PUT https://api.quovo.com/v2/challenges/{challenge_id}

Description

Answer an MFA Challenge.

For more information on answering MFA questions, see our “Workflows” section here.

Request Parameters

Name Type Description
answer* string The answer to the MFA Challenge. If this is a multiple-choice MFA, you can either pass the index (starting at 0) of the correct MFA choice or you can send the entire choice object in JSON format.

Response Fields

Name Type Description
account integer The Quovo Account the Challenge belongs to.
choices array (Only available if the Challenge type is “choices”) A list of possible MFA answers; used for MFA with a multiple-choice portion. See below for the fields in the choices objects.
id integer The unique Quovo identifier for this Challenge.
image object (Only available if the Challenge type is “image”) An object that contains a data URI or image URL that should be displayed to the end user; used for MFA that displays an image alongside its MFA question. See below for the fields in the image object.
image_choices array (Only available if the Challenge type is “image_choices”) A combination of “choices” and “image”. This field contains a list of image objects that should be displayed to the end user. See below for the fields in the image objects.
is_answered boolean This field indicates whether a Challenge has already been answered or not. Note: is_answered does not necessarily mean the MFA question was answered successfully, only that it was answered at all.
last_asked boolean This field indicates whether this specific Challenge was encountered during the most recent sync attempt. Multiple Challenges may have last_asked set to true, if multiple MFA questions were asked during the last sync attempt. This field can usually be ignored; instead, you should look to should_answer to determine whether to show an MFA Challenge or not.
question string The full text of the MFA question.
should_answer boolean If should_answer is true, this MFA Challenge is either unanswered or was answered incorrectly. This Challenge should be displayed to the end user so that he/she can update it with the appropriate answer. Note: Multiple Challenges may have should_answer set to true, which means multiple MFA Challenges need to be answered before continuing.
type string Indicates the type of MFA Challenge, which will necessitate different workflows. These different MFA types are explained in more depth here.

choices Object

Name Type Description
category string Sometimes, multiple-choice options are grouped into separate categories. For example, some real-time MFA questions have a “Phone” vs a “Text” category. When not null, these categories must be displayed to the end user. The same value might appear twice under multiple categories, e.g., the same Phone number used in both the “Phone” and “Text” categories.
value string A possible answer for the multiple-choice MFA.

image Object

Name Type Description
html string A full <img> element that should be displayed to the end user.
source string The image URL or data URI of the image. While the html field will contain the same URL, source can be used instead if you cannot safely display the raw html, or if you need to attach different attributes to the <img> element.

/extras

Extras are any supplementary details about a Quovo Portfolio. This includes information about credit cards and loans such as the annual percentage rate (APR), interest rate, loan type, and loan origination date. The fields available for each Portfolio will differ based on its financial institution, and may even differ from Portfolio to Portfolio on the same institution.

Get Extras info for a portfolio

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/portfolios/750007/extras"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "extras": {
        "interest_rate": "5.00000",
        "last_payment": 1021.45,
        "loan_type": "Mortgage",
        "original_principal": 125661,
        "origination_date": "2014-02-18",
        "portfolio": 750007
    }
}

GET https://api.quovo.com/v2/portfolios/{portfolio_id}/extras

Description

Provides supplementary details about the given Portfolio.

Response Fields

Name Type Description
cash_apr string The interest rate on cash advances. Note: This is not the purchase APR.
credit_limit decimal The maximum amount of credit extended by the institutiton to the borrower.
due_date string The due date for the next payment.
interest_rate string The interest rate on loans. For credit cards, this is the purchase APR.
is_overdue boolean true if a payment is currently overdue.
last_payment decimal The amount of the last payment.
last_payment_date string The date of the last payment.
loan_type string The type of loan, e.g. “Auto Loan” or “Consolidation Loans”.
maturity_date string The date on which the loan should be paid in full.
min_payment decimal The minimum payment due for the next billing cycle.
original_principal decimal The original principal balance of the loan.
origination_date string The date on which the loan was initially lent.
owner_address string The address of the Portfolio owner.
owner_name string The name of the Portfolio owner, as listed by the institution.
portfolio integer The Quovo Portfolio that the extra details apply to.
ytd_interest_paid decimal The year to date (YTD) interest paid.
ytd_principal_paid decimal The year to date (YTD) principal paid.

/history

Get all transactions

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/history?account=877247"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "history": [
        {
            "account": 877247,
            "currency": null,
            "cusip": "594918104",
            "date": "2015-05-01",
            "expense_category": null,
            "fees": 0.0,
            "fxrate": 1.0,
            "id": 199436905,
            "is_cancel": false,
            "is_pending": false,
            "memo": "Bought MSFT",
            "portfolio": 746745,
            "price": 40.0,
            "quantity": 9.0,
            "ticker": "MSFT",
            "ticker_name": "Microsoft Corporation",
            "tran_category": "B",
            "tran_type": "BUYL",
            "user": 162703,
            "value": -360.0
        },
        {
            "account": 877247,
            "currency": null,
            "cusip": "037833100",
            "date": "2015-05-05",
            "expense_category": null,
            "fees": 0.0,
            "fxrate": 1.0,
            "id": 199436906,
            "is_cancel": false,
            "is_pending": false,
            "memo": "Bought AAPL",
            "portfolio": 746745,
            "price": 600.96,
            "quantity": 11.0,
            "ticker": "AAPL",
            "ticker_name": "Apple Inc",
            "tran_category": "B",
            "tran_type": "BUYL",
            "user": 162703,
            "value": -6610.56
        }
    ]
}

GET https://api.quovo.com/v2/history

Description

Provides historical transactions across all of your users and their Accounts.

Request Parameters

Name Type Description
user integer If passed, all transactions returned will belong to the given Quovo User.
account integer If passed, all transactions returned will belong to the given Quovo Account.
portfolio integer If passed, all transactions returned will belong to the given Quovo Portfolio.
cursor integer This parameter is used for paginated results as a pointer to the next set of transactions. Review the Pagination section in the Introduction to learn more about paginated results.
count integer The max number of transactions you would like to return for this request.
start_date string All transactions returned will have a date greater than the given start_date.
end_date string All transactions returned will have a date less than the given end_date.
start_id integer All transactions returned will have an id greater than the given start_id.
end_id integer All transactions returned will have an id less than the given end_id.

Response Fields

Name Type Description
account integer The Quovo Account that the transaction belongs to.
currency string An ISO 4217 code for transactions in foreign currencies. currency will be null for any transaction priced in USD.
cusip string A 9-character CUSIP indentifier. Note: this may not be available for all securities, and may return null for some transactions that have a ticker.
date string The trade/execution date of the transaction.
expense_category string The expense category of the transaction, such as “Entertainment” or “Groceries”. This only applies to Cash transactions within a subset of Portfolios, depending on their type. See here for a full list of available expense categories.
fees decimal The combined value of all fees (commission, bookkeeping, etc.) applied to the transaction.
fxrate decimal The foreign exchange rate used to translate any foreign currency into USD. This rate will be 1.00 for any transaction priced in USD. To view all prices and values in their local currency, divide price and value by the fxrate (price / fxrate == local_price).
id integer The unique Quovo identifier for the transaction.
is_cancel boolean This field indicates whether the transaction is a Cancel Transaction or not. Cancel Transactions occur when existing transactions are substantially updated or completely removed by the institution. See here for additional information.
is_pending boolean This field indicates whether the transaction is pending or not. Pending transactions are cash transactions that have not yet settled in a bank account. See here for additional information.
memo string A descriptive, long-form text of the transaction, taken from the institution.
portfolio integer The Quovo Portfolio that the transaction belongs to.
price decimal The price per unit of this transaction, as reported by the financial institution. This will be 0 for transactions such as cash deposits or withdrawals.
quantity decimal The number of units transferred, bought, or sold in this transaction, as reported by the financial institution. This will be 0 for transactions such as cash deposits or withdrawals.
ticker string The public symbol for the relevant security in the transaction. Quovo uses several fallback identifiers when the ticker is unavailable: if a CUSIP is specified, it will be used instead; if the security is unique to a specific institution, the ticker will have a prefix of FI: to identify it as such (e.g., “FI:SVF-N”); if we are unable to identify the relevant security, the ticker will have a prefix of UN: (e.g., “UN:0000E3C9”). Any transaction that does not use a security, such as cash deposits or withdrawals, will have an empty string "" as the ticker, not null.
ticker_name string The name of the associated security.
tran_category string A broad category that helps identify the transaction type. See here for additional information on transaction categories.
tran_type string A much more specific and fine-grained identifier of the transaction type. See here for a full list of transaction types.
user integer The Quovo User the Portfolio and Account belong to.
value decimal The total value of the transaction. For example, on buys, this value will generally be equal to quantity * price; for cash deposits, this value will be equal to the total value deposited.

Update a transaction

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"expense_category": "Entertainment"}' "https://api.quovo.com/v2/history/20223796"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "history": {
        "account": 885511,
        "currency": null,
        "cusip": null,
        "date": "2016-03-28",
        "expense_category": "Entertainment",
        "fees": 0,
        "fxrate": 1,
        "id": 20223796,
        "is_cancel": false,
        "is_pending": false,
        "memo": "Blockbuster Video 7221 Elk Grove Blvd 9167148810",
        "portfolio": 761305,
        "price": 0,
        "quantity": 0,
        "ticker": "",
        "ticker_name": null,
        "tran_category": "C",
        "tran_type": "WITH",
        "user": 162703,
        "value": -17.7
    }
}

PUT https://api.quovo.com/v2/history/{transaction_id}

Description

Update an existing historical transaction. Currently, only used to update a transaction’s expense_category.

Request Parameters

Name Type Description
expense_category string The updated category for the transaction. Only categories found within our total list of expense categories can be used.

Response Fields

Name Type Description
account integer The Quovo Account that the transaction belongs to.
currency string An ISO 4217 code for transactions in foreign currencies. currency will be null for any transaction priced in USD.
cusip string A 9-character CUSIP indentifier. Note: this may not be available for all securities, and may return null for some transactions that have a ticker.
date string The trade/execution date of the transaction.
expense_category string The expense category of the transaction, such as “Entertainment” or “Groceries”. This only applies to Cash transactions within a subset of Portfolios, depending on their type. See here for a full list of available expense categories.
fees decimal The combined value of all fees (commission, bookkeeping, etc.) applied to the transaction.
fxrate decimal The foreign exchange rate used to translate any foreign currency into USD. This rate will be 1.00 for any transaction priced in USD. To view all prices and values in their local currency, divide price and value by the fxrate (price / fxrate == local_price).
id integer The unique Quovo identifier for the transaction.
is_cancel boolean This field indicates whether the transaction is a Cancel Transaction or not. Cancel Transactions occur when existing transactions are substantially updated or completely removed by the institution. See here for additional information.
is_pending boolean This field indicates whether the transaction is pending or not. Pending transactions are cash transactions that have not yet settled in a bank account. See here for additional information.
memo string A descriptive, long-form text of the transaction, taken from the institution.
portfolio integer The Quovo Portfolio that the transaction belongs to.
price decimal The price per unit of this transaction, as reported by the financial institution. This will be 0 for transactions such as cash deposits or withdrawals.
quantity decimal The number of units transferred, bought, or sold in this transaction, as reported by the financial institution. This will be 0 for transactions such as cash deposits or withdrawals.
ticker string The public symbol for the relevant security in the transaction. Quovo uses several fallback identifiers when the ticker is unavailable: if a CUSIP is specified, it will be used instead; if the security is unique to a specific institution, the ticker will have a prefix of FI: to identify it as such (e.g., “FI:SVF-N”); if we are unable to identify the relevant security, the ticker will have a prefix of UN: (e.g., “UN:0000E3C9”). Any transaction that does not use a security, such as cash deposits or withdrawals, will have an empty string "" as the ticker, not null.
ticker_name string The name of the associated security.
tran_category string A broad category that helps identify the transaction type. See here for additional information on transaction categories.
tran_type string A much more specific and fine-grained identifier of the transaction type. See here for a full list of transaction types.
user integer The Quovo User the Portfolio and Account belong to.
value decimal The total value of the transaction. For example, on buys, this value will generally be equal to quantity * price; for cash deposits, this value will be equal to the total value deposited.

/iframe_token

The Quovo iframe widget provides API users a ready-made solution for syncing and Account management. While you will not have the same level of control as syncing and managing the Accounts directly through the API, you can quickly deploy an Account dashboard and avoid managing the various edge cases that may occur while syncing new Accounts.

Creating an iframe token

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"user": 162703}' "https://api.quovo.com/v2/iframe_token"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
    "iframe_token": {
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvbmVfdGltZV91c2UiOnRydWUsImlwX3Jlc3RyaWN0ZWQiOmZhbHNlLCJzdWIiOiIxNjI3MDMiLCJleHAiOjE0ODQ5NTIyNTIsImlwIjoiMTI3LjAuMC4xIiwiaWF0IjoxNDg0OTQ4NjUyLCJ0eXBlIjoiaWZyYW1lIiwiaWQiOiJiM2U4OGNjOTE3NjIzMjIxMTRlNTZiNWQ0M2ZjOTU3ZmIwMjgyNzdkIiwidXNlciI6MTYyNzAzfQ.1maK8nlT0DWBw28SVVBEmofNtwQbc0FjrhFcM5_w_EU",
        "user": 162703
    }
}

POST https://api.quovo.com/v2/iframe_token

Description

Use this endpoint to create a single-use iframe token for a User. This token will provide a User access to their iframe widget and all of their associated Accounts on Quovo.

Look to our Workflows section here for more information on iframe usage.

Request Parameters

Name Type Description
user integer The Quovo User you are generating the iframe token for. The token will be used to direct the iframe to log in as this User.

Response Fields

Name Type Description
token string The single-use access token to be included in the iframe URL. The iframe URL should be structured like https://embed.quovo.com/auth/{iframe_token}.
user integer The Quovo User to whom the iframe token belongs.

/manual_assets

A Manual Asset is an end user-created holding, used to account for any untrackable assets. They are strictly contained within Manual Portfolios. Unlike typical Quovo Positions, which are automatically created and updated anytime an Account syncs, Manual Assets are managed directly by the end user.

Get Manual Assets

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "manual_assets": [
        {
            "account": 1010651,
            "id": 99102189,
            "portfolio": 1042111,
            "portfolio_name": "Real Estate",
            "price": 812500,
            "quantity": 1,
            "ticker": "UN:00070EF7",
            "ticker_name": "Quovo Condo (1042111)",
            "user": 162703,
            "username": "quovo_test_user",
            "value": 812500
        }
    ]
}

GET https://api.quovo.com/v2/manual_assets

Description

Fetches all Manual Assets across all Users and Portfolios.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
id integer A unique Quovo identifier for the Manual Asset. Note: The ID may change after the Asset is updated, so do not use IDs to track Assets.
portfolio integer The Quovo Manual Portfolio the Asset belongs to.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.
ticker string The Quovo-generated symbol for the Asset. All Manual Asset tickers will have a prefix of UN:, like other unidentified holdings.
ticker_name string The name of the Manual Asset as entered by the end user.
user integer The Quovo User the Portfolio and Account belong to.
username string The username of the associated Quovo User.
value decimal The total value of the Asset.

Create a Manual Asset

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -d '{"name": "Quovo Condo", "value": 812500, "quantity": 1, "price": 812500, "portfolio": 1042111}' "https://api.quovo.com/v2/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
    "manual_asset": {
        "account": 1010651,
        "id": 99102189,
        "portfolio": 1042111,
        "portfolio_name": "Real Estate",
        "price": 812500,
        "quantity": 1,
        "ticker": "UN:00070EF7",
        "ticker_name": "Quovo Condo (1042111)",
        "user": 162703,
        "username": "quovo_test_user",
        "value": 812500
    }
}

POST https://api.quovo.com/v2/manual_assets

Description

Creates a new Manual Asset.

Request Parameters

Name Type Description
portfolio* integer The Manual Portfolio the Asset will belong to.
name* string The name of the Manual Asset. This should describe what the Asset represents, e.g. “My Condo” or “Boat I”.
value* decimal The total value of the Manual Asset.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
id integer A unique Quovo identifier for the Manual Asset. Note: The ID may change after the Asset is updated, so do not use IDs to track Quovo Manual Assets.
portfolio integer The Quovo Manual Portfolio the Asset belongs to.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.
ticker string The Quovo-generated symbol for the Asset. All Manual Asset tickers will have a prefix of UN:, like other unidentified holdings.
ticker_name string The name of the Manual Asset as entered by the end user.
user integer The Quovo User the Portfolio and Account belong to.
username string The username of the associated Quovo User.
value decimal The total value of the Asset.

Update a Manual Asset

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"portfolio": 1042111, "ticker": "UN:00070EF7", "value": 825500, "quantity": 1}' "https://api.quovo.com/v2/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "manual_asset": {
        "account": 1010651,
        "id": 99102189,
        "portfolio": 1042111,
        "portfolio_name": "Real Estate",
        "price": 825500,
        "quantity": 1,
        "ticker": "UN:00070EF7",
        "ticker_name": "Quovo Condo (1042111)",
        "user": 162703,
        "username": "quovo_test_user",
        "value": 825500
    }
}

PUT https://api.quovo.com/v2/manual_assets

Description

Updates an existing Manual Asset.

Request Parameters

Name Type Description
portfolio* integer The targeted Asset’s Portfolio ID.
ticker* string The targeted Asset to update. This should be the Quovo-generated symbol for the target Asset.
price decimal The updated price per unit of the Asset.
quantity decimal The updated number of units of the Asset.
value decimal The updated total value of the Asset. Note: If value is given, an associated price or quantity must also be given.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
id integer A unique Quovo identifier for the Manual Asset. Note: The ID may change after the Asset is updated, so do not use IDs to track Quovo Manual Assets.
portfolio integer The Quovo Manual Portfolio the Asset belongs to.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.
ticker string The Quovo-generated symbol for the Asset. All Manual Asset tickers will have a prefix of UN:, like other unidentified holdings.
ticker_name string The name of the Manual Asset as entered by the end user.
user integer The Quovo User the Portfolio and Account belong to.
username string The username of the associated Quovo User.
value decimal The total value of the Asset.

Delete a Manual Asset

curl -X DELETE -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -d '{"portfolio": 1042111, "ticker" : "UN:00070EF7"}' "https://api.quovo.com/v2/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Status: 204 No Content

DELETE https://api.quovo.com/v2/manual_assets

Description

Deletes an existing Manual Asset.

Request Parameters

Name Type Description
portfolio* integer The targeted Asset’s Portfolio ID.
ticker* string The targeted Asset to delete. This should be the Quovo-generated symbol for the target Asset.

/manual_portfolios

A Manual Portfolio is an end user-created Portfolio, used as a container for Manual Assets. Unlike typical Quovo Portfolios, which are automatically created and updated when an Account syncs, Manual Portfolios are managed directly by the end user.

Get All Manual Portfolios

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/manual_portfolios"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "manual_portfolios": [
        {
            "account": 1010651,
            "brokerage": 21639,
            "brokerage_name": "Manually Entered Assets",
            "id": 1042111,
            "is_inactive": false,
            "last_change": "2016-07-18T14:07:46.510",
            "portfolio_name": "Real Estate",
            "update_count": 6,
            "user": 162703,
            "username": "quovo_test_user",
            "value": 812500
        },
    ]
}

GET https://api.quovo.com/v2/manual_portfolios

Description

Fetches all Manual Portfolios across all Users.

Response Fields

Name Type Description
account integer The Quovo Account the Manual Portfolio belongs to.
brokerage integer The Quovo Brokerage the Account is associated with. All manually-entered Portfolios will be on Brokerage 21639.
brokerage_name string The name of the associated financial institution. All manually-entered Portfolios will be on the Brokerage “Manually Entered Assets”.
id integer The unique Quovo identifier for the Portfolio.
is_inactive boolean Inactive Manual Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value.
last_change string A timestamp of the last time the Manual Portfolio or its Assets were updated.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
update_count integer The total number of times the Portfolio has been updated by the end user. This includes any time the Portfolio’s Manual Assets were updated.
user integer The Quovo User the Portfolio belongs to.
username string The username of the associated Quovo User.
value decimal The total sum value of all Manual Assets within the Portfolio. This value is calculated after any holding within the Portfolio is updated by the user.

Create a Manual Portfolio

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"user": 162703, "name" : "Real Estate"}' "https://api.quovo.com/v2/manual_portfolios"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
    "manual_portfolio": {
        "account": 1010651,
        "brokerage": 21639,
        "brokerage_name": "Manually Entered Assets",
        "id": 1042111,
        "is_inactive": false,
        "last_change": "2016-07-17T12:12:31.980",
        "portfolio_name": "Real Estate",
        "update_count": 1,
        "user": 162703,
        "username": "quovo_test_user",
        "value": 0
    }
}

POST https://api.quovo.com/v2/manual_portfolios

Description

Creates a Manual Asset Portfolio.

Request Parameters

Name Type Description
user* integer The Quovo User this new Manual Portfolio will belong to.
name* string The name of the Manual Asset Portfolio. This will typically describe the assets or holdings to be entered within the Portfolio, e.g. “Real Estate” or “My Boats”.

Response Fields

Name Type Description
account integer The Quovo Account the Manual Portfolio belongs to.
brokerage integer The Quovo Brokerage the Account is associated with. All manually-entered Portfolios will be on Brokerage 21639.
brokerage_name string The name of the associated financial institution. All manually-entered Portfolios will be on the Brokerage “Manually Entered Assets”.
id integer The unique Quovo identifier for the Portfolio.
is_inactive boolean Inactive Manual Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value.
last_change string A timestamp of the last time the Manual Portfolio or its Assets were updated.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
update_count integer The total number of times the Portfolio has been updated by the end user. This includes any time the Portfolio’s Manual Assets were updated.
user integer The Quovo User the Portfolio belongs to.
username string The username of the associated Quovo User.
value decimal The total sum value of all Manual Assets within the Portfolio. This value is calculated after any holding within the Portfolio is updated by the user.

Get a Manual Portfolio

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/manual_portfolios/1042111"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "manual_portfolio": {
        "account": 1010651,
        "brokerage": 21639,
        "brokerage_name": "Manually Entered Assets",
        "id": 1042111,
        "is_inactive": false,
        "last_change": "2016-07-18T14:07:46.510",
        "portfolio_name": "Real Estate",
        "update_count": 6,
        "user": 162703,
        "username": "quovo_test_user",
        "value": 812500
    }
}

GET https://api.quovo.com/v2/manual_portfolios/{portfolio_id}

Description

Provides information on a single manual Portfolio.

Response Fields

Name Type Description
account integer The Quovo Account the Manual Portfolio belongs to.
brokerage integer The Quovo Brokerage the Account is associated with. All manually-entered Portfolios will be on Brokerage 21639.
brokerage_name string The name of the associated financial institution. All manually-entered Portfolios will be on the Brokerage “Manually Entered Assets”.
id integer The unique Quovo identifier for the Portfolio.
is_inactive boolean Inactive Manual Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value.
last_change string A timestamp of the last time the Manual Portfolio or its Assets were updated.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
update_count integer The total number of times the Portfolio has been updated by the end user. This includes any time the Portfolio’s Manual Assets were updated.
user integer The Quovo User the Portfolio belongs to.
username string The username of the associated Quovo User.
value decimal The total sum value of all Manual Assets within the Portfolio. This value is calculated after any holding within the Portfolio is updated by the user.

Update a Manual Portfolio

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"name" : "Real Estate II"}' "https://api.quovo.com/v2/manual_portfolios/1042111"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "manual_portfolio": {
        "account": 1010651,
        "brokerage": 21639,
        "brokerage_name": "Manually Entered Assets",
        "id": 1042111,
        "is_inactive": false,
        "last_change": "2016-07-20T14:07:46.510",
        "portfolio_name": "Real Estate II",
        "update_count": 6,
        "user": 162703,
        "username": "quovo_test_user",
        "value": 812500
    }
}

PUT https://api.quovo.com/v2/manual_portfolios/{portfolio_id}

Description

Updates an existing Manual Asset Portfolio.

Request Parameters

Name Type Description
name string The new name for the Manual Asset Portfolio.
is_inactive boolean Use this to set a Portfolio to inactive. Inactive Manual Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value.

Response Fields

Name Type Description
account integer The Quovo Account the Manual Portfolio belongs to.
brokerage integer The Quovo Brokerage the Account is associated with. All manually-entered Portfolios will be on Brokerage 21639.
brokerage_name string The name of the associated financial institution. All manually-entered Portfolios will be on the Brokerage “Manually Entered Assets”.
id integer The unique Quovo identifier for the Portfolio.
is_inactive boolean Inactive Manual Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value.
last_change string A timestamp of the last time the Manual Portfolio or its Assets were updated.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
update_count integer The total number of times the Portfolio has been updated by the end user. This includes any time the Portfolio’s Manual Assets were updated.
user integer The Quovo User the Portfolio belongs to.
username string The username of the associated Quovo User.
value decimal The total sum value of all Manual Assets within the Portfolio. This value is calculated after any holding within the Portfolio is updated by the user.

Delete a Manual Portfolio

curl -X DELETE -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/manual_portfolios/1042111"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Status: 204 No Content

DELETE https://api.quovo.com/v2/manual_portfolios/{portfolio_id}

Description

Deletes an existing Manual Asset Portfolio.

Get Manual Assets

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/manual_portfolios/1042111/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "manual_assets": [
        {
            "account": 1010651,
            "id": 99102189,
            "portfolio": 1042111,
            "portfolio_name": "Real Estate",
            "price": 812500,
            "quantity": 1,
            "ticker": "UN:00070EF7",
            "ticker_name": "Quovo Condo (1042111)",
            "user": 162703,
            "username": "quovo_test_user",
            "value": 812500
        }
    ]
}

GET https://api.quovo.com/v2/manual_portfolios/{portfolio_id}/manual_assets

Description

Fetches all of the Portfolio’s Manual Assets.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
id integer A unique Quovo identifier for the Manual Asset. Note: The ID may change after the Asset is updated, so do not use IDs to track Assets.
portfolio integer The Quovo Manual Portfolio the Asset belongs to.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.
ticker string The Quovo-generated symbol for the Asset. All Manual Asset tickers will have a prefix of UN:, like other unidentified holdings.
ticker_name string The name of the Manual Asset as entered by the end user.
user integer The Quovo User the Portfolio and Account belong to.
username string The username of the associated Quovo User.
value decimal The total value of the Asset.

Create a Manual Asset

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -d '{"name": "Quovo Condo", "value": 812500, "quantity": 1, "price": 812500}' "https://api.quovo.com/v2/manual_portfolios/1042111/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
    "manual_asset": {
        "account": 1010651,
        "id": 99102189,
        "portfolio": 1042111,
        "portfolio_name": "Real Estate",
        "price": 812500,
        "quantity": 1,
        "ticker": "UN:00070EF7",
        "ticker_name": "Quovo Condo (1042111)",
        "user": 162703,
        "username": "quovo_test_user",
        "value": 812500
    }
}

POST https://api.quovo.com/v2/manual_portfolios/{portfolio_id}/manual_assets

Description

Creates a new Manual Asset for the given Manual Portfolio.

Request Parameters

Name Type Description
name* string The name of the Manual Asset. This should describe what the Asset represents, e.g. “My Condo” or “Boat I”.
value* decimal The total value of the Manual Asset.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
id integer A unique Quovo identifier for the Manual Asset. Note: The ID may change after the Asset is updated, so do not use IDs to track Assets.
portfolio integer The Quovo Manual Portfolio the Asset belongs to.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.
ticker string The Quovo-generated symbol for the Asset. All Manual Asset tickers will have a prefix of UN:, like other unidentified holdings.
ticker_name string The name of the Manual Asset as entered by the end user.
user integer The Quovo User the Portfolio and Account belong to.
username string The username of the associated Quovo User.
value decimal The total value of the Asset.

Update a Manual Asset

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"ticker": "UN:00070EF7", "value": 825500, "quantity": 1}' "https://api.quovo.com/v2/manual_portfolios/1042111/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "manual_asset": {
        "account": 1010651,
        "id": 99102189,
        "portfolio": 1042111,
        "portfolio_name": "Real Estate",
        "price": 825500,
        "quantity": 1,
        "ticker": "UN:00070EF7",
        "ticker_name": "Quovo Condo (1042111)",
        "user": 162703,
        "username": "quovo_test_user",
        "value": 825500
    }
}

PUT https://api.quovo.com/v2/portfolios/{portfolio_id}/manual_assets

Description

Updates an existing Manual Asset for a specific Manual Portfolio.

Request Parameters

Name Type Description
ticker* string The targeted Asset to update. This should be the Quovo-generated symbol for the target Asset.
price decimal The updated price per unit of the Asset.
quantity decimal The updated number of units of the Asset.
value decimal The updated total value of the Asset. Note: If value is given, an associated price or quantity must also be given.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
id integer A unique Quovo identifier for the Manual Asset. Note: The ID may change after the Asset is updated, so do not use IDs to track Assets.
portfolio integer The Quovo Manual Portfolio the Asset belongs to.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.
ticker string The Quovo-generated symbol for the Asset. All Manual Asset tickers will have a prefix of UN:, like other unidentified holdings.
ticker_name string The name of the Manual Asset as entered by the end user.
user integer The Quovo User the Portfolio and Account belong to.
username string The username of the associated Quovo User.
value decimal The total value of the Asset.

Delete a Manual Asset

curl -X DELETE -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -d '{"ticker" : "UN:00070EF7"}' "https://api.quovo.com/v2/manual_portfolios/1042111/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Status: 204 No Content

DELETE https://api.quovo.com/v2/manual_portfolios/{portfolio_id}/manual_assets

Description

Deletes an existing Manual Asset for a specific Manual Portfolio.

Request Parameters

Name Type Description
ticker* string The targeted Asset to delete. This should be the Quovo-generated symbol for the target Asset.

/me

“Me” represents the API user, i.e. the user making the current request.

To authenticate to the /v2/me endpoint, pass your API user credentials using Client-side Basic Auth.

Get your API User info

curl -X GET --user "fake_username:fake_password" "https://api.quovo.com/v2/me"
Authorization: Basic ZmFrZV91c2VybmFtZTpmYWtlX3Bhc3N3b3Jk
Status: 200 OK
Content-Type: application/json
{
    "me": {
        "email": "test_user@example.com",
        "endpoints": [
            "accounts",
            "brokerages",
            "challenges",
            "history",
            "iframe_token",
            "me",
            "portfolios",
            "positions",
            "requests",
            "sync",
            "terms_of_use",
            "tokens",
            "users",
            "webhooks"
        ],
        "username": "fake_username"
    }
}

GET https://api.quovo.com/v2/me

Description

Fetch information about your Quovo API user.

Response Fields

Name Type Description
email string The email registered with your API user.
endpoints array An array of available API endpoints.
username string The username of your API user.

Update your password

curl -X PUT --user "fake_username:fake_password" -H "Content-Type: application/json" -d '{"password": "new_password"}' "https://api.quovo.com/v2/me"
Authorization: Basic ZmFrZV91c2VybmFtZTpmYWtlX3Bhc3N3b3Jk
Content-Type: application/json
Status: 204 No Content

PUT https://api.quovo.com/v2/me

Description

Update your API password. All future requests to /v2/tokens must use the new password to properly authenticate, although changing your password will not affect current, live access tokens.

New API passwords have several requirements:

Request Parameters

Name Type Description
password* string Your new API Password.

/portfolios

A Quovo Portfolio represents the sub-accounts found within a financial institution login. A Quovo Account will in many cases contain mulitple Portfolios. For example, within a single bank account there might be a Portfolio for Savings, a Portfolio for Checking, and a Portfolio for a Mortgage.

Get all Portfolios

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/portfolios"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "portfolios": [
        {
            "account": 877247,
            "brokerage": 21534,
            "brokerage_name": "Test Data Brokerage",
            "description": "A Sample Portfolio",
            "id": 746745,
            "is_inactive": false,
            "is_taxable": true,
            "last_change": "2016-03-28T14:00:40.550",
            "nickname": "My Portfolio II",
            "owner_type": "Individual Account",
            "portfolio_category": "Investment",
            "portfolio_name": "Investment Account",
            "portfolio_type": "Brokerage Account",
            "portfolio_type_confidence": "High",
            "update_count": 3,
            "user": 162703,
            "username": "quovo_test_user",
            "value": 73479.091633
        },
        {
            "account": 878793,
            "brokerage": 21700,
            "brokerage_name": "Test Bank Brokerage",
            "description": "A Sample Portfolio",
            "id": 750007,
            "is_inactive": false,
            "is_taxable": true,
            "last_change": "2016-03-29T15:09:47.447",
            "nickname": null,
            "owner_type": "Individual Account",
            "portfolio_category": "Banking",
            "portfolio_name": "Checking Account",
            "portfolio_type": "Checking",
            "portfolio_type_confidence": "High",
            "update_count": 2,
            "user": 162703,
            "username": "quovo_test_user",
            "value": 101596.462388
        }
    ]
}

GET https://api.quovo.com/v2/portfolios

Description

Fetches all Portfolios across all Accounts and users.

Response Fields

Name Type Description
account integer The Quovo Account the Portfolio belongs to.
brokerage integer The Quovo Brokerage the Account is associated with.
brokerage_name string The name of the associated financial institution.
description string A description of the Portfolio, taken from the financial institution. The usage of the description field varies by institution, so this field may return null for some Portfolios.
id integer The unique Quovo identifier for the Portfolio.
is_inactive boolean Inactive Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value. You may want to set a Portfolio’s is_inactive state to true if the end user wants to only utilize a subset of Portfolios within an Account. Note that an inactive Portfolio within an inactive Account cannot be made active (because Quovo controls the Account is_inactive state).
is_taxable boolean Indicates whether a specific Portfolio type is considered to be taxable or non-taxable. The values conform to standard tax treatment for Portfolio types (e.g., Roth IRAs are generally understood to be non-taxable).
last_change string A timestamp of the last time the Portfolio’s information was updated.
nickname string A descriptive name for the Portfolio. While there is a nickname taken from the financial institution, this field may be overriden by end users.
owner_type string The ownership type of the Portfolio. Possible values are “Individual Account”, “Joint Account”, and “Trust Account.”
portfolio_category string A grouping of the Portfolio according to broader industry attributes, as identified by Quovo. Possible values include “Banking”, “Investment”, “Insurance”, and “Loan”. Categories can have multiple corresponding Portfolio types, while Portfolio types can only have one category. See here for a full mapping of portfolio_type to portfolio_category.
portfolio_name string The full Portfolio “name” as found at the financial institution. This field often contains the full account number. Note: Because of the sensitive nature of Users’ financial institution account numbers, the portfolio_name field is obfuscated by default. It may be unobfuscated upon request.
portfolio_type string The type of Portfolio as identified by Quovo, based on its holdings, transactions, and tax eligibility. This value may also be overridden by the end user. Possible values for portfolio_type include “Checking”, “401k”, “IRA”, and more. See here for a full list of values.
portfolio_type_confidence string The level of confidence in the accuracy of the portfolio_type. Confidence levels are split into four tiers: “Very High”, “High”, “Moderate”, and “Low”. This value can be used to decide whether you should use the portfolio_type, or ignore it due to its low confidence level.
update_count integer The total number of times the Portfolio has been successfully updated. Unlike Accounts, Portfolios will only be updated if there was a successful sync.
user integer The Quovo User the Portfolio and its Account belong to.
username string The username of the associated Quovo User.
value decimal The total sum value of all Positions within the Portfolio. This value is calculated after any good sync completes. Because of intraday price updates, it may be best to calculate the Portfolio’s value manually by fetching the Portfolio’s Positions and summing their individual values.

Get Portfolio

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/portfolios/750007"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "portfolio": {
        "account": 878793,
        "brokerage": 21700,
        "brokerage_name": "Test Bank Brokerage",
        "description": "A Sample Portfolio",
        "id": 750007,
        "is_inactive": false,
        "is_taxable": true,
        "last_change": "2016-03-29T15:09:47.447",
        "nickname": null,
        "owner_type": "Individual Account",
        "portfolio_category": "Banking",
        "portfolio_name": "Checking Account",
        "portfolio_type": "Checking",
        "portfolio_type_confidence": "High",
        "update_count": 2,
        "user": 162703,
        "username": "quovo_test_user",
        "value": 101596.462388
    }
}

GET https://api.quovo.com/v2/portfolios/{portfolio_id}

Description

Provides information on a single Portfolio.

Response Fields

Name Type Description
account integer The Quovo Account the Portfolio belongs to.
brokerage integer The Quovo Brokerage the Account is associated with.
brokerage_name string The name of the associated financial institution.
description string A description of the Portfolio, taken from the financial institution. The usage of the description field varies by institution, so this field may return null for some Portfolios.
id integer The unique Quovo identifier for the Portfolio.
is_inactive boolean Inactive Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value. You may want to set a Portfolio’s is_inactive state to true if the end user wants to only utilize a subset of Portfolios within an Account. Note that an inactive Portfolio within an inactive Account cannot be made active (because Quovo controls the Account is_inactive state).
is_taxable boolean Indicates whether a specific Portfolio type is considered to be taxable or non-taxable. The values conform to standard tax treatment for Portfolio types (e.g., Roth IRAs are generally understood to be non-taxable).
last_change string A timestamp of the last time the Portfolio’s information was updated.
nickname string A descriptive name for the Portfolio. While there is a nickname taken from the financial institution, this field may be overriden by end users.
owner_type string The ownership type of the Portfolio. Possible values are “Individual Account”, “Joint Account”, and “Trust Account.”
portfolio_category string A grouping of the Portfolio according to broader industry attributes, as identified by Quovo. Possible values include “Banking”, “Investment”, “Insurance”, and “Loan”. Categories can have multiple corresponding Portfolio types, while Portfolio types can only have one category. See here for a full mapping of portfolio_type to portfolio_category.
portfolio_name string The full Portfolio “name” as found at the financial institution. This field often contains the full account number. Note: Because of the sensitive nature of Users’ financial institution account numbers, the portfolio_name field is obfuscated by default. It may be unobfuscated upon request.
portfolio_type string The type of Portfolio as identified by Quovo, based on its holdings, transactions, and tax eligibility. This value may also be overridden by the end user. Possible values for portfolio_type include “Checking”, “401k”, “IRA”, and more. See here for a full list of values.
portfolio_type_confidence string The level of confidence in the accuracy of the portfolio_type. Confidence levels are split into four tiers: “Very High”, “High”, “Moderate”, and “Low”. This value can be used to decide whether you should use the portfolio_type, or ignore it due to its low confidence level.
update_count integer The total number of times the Portfolio has been successfully updated. Unlike Accounts, Portfolios will only be updated if there was a successful sync.
user integer The Quovo User the Portfolio and its Account belong to.
username string The username of the associated Quovo User.
value decimal The total sum value of all Positions within the Portfolio. This value is calculated after any good sync completes. Because of intraday price updates, it may be best to calculate the Portfolio’s value manually by fetching the Portfolio’s Positions and summing their individual values.

Modify a portfolio

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"is_inactive": true}' "https://api.quovo.com/v2/portfolios/750007"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "portfolio": {
        "account": 878793,
        "brokerage": 21700,
        "brokerage_name": "Test Bank Brokerage",
        "description": "A Sample Portfolio",
        "id": 750007,
        "is_inactive": true,
        "is_taxable": true,
        "last_change": "2016-03-29T15:09:47.447",
        "nickname": null,
        "owner_type": "Individual Account",
        "portfolio_category": "Banking",
        "portfolio_name": "Checking Account",
        "portfolio_type": "Checking",
        "portfolio_type_confidence": "High",
        "update_count": 2,
        "user": 162703,
        "username": "quovo_test_user",
        "value": 101596.462388
    }
}

PUT https://api.quovo.com/v2/portfolios/{portfolio_id}

Description

Modifies an existing Portfolio.

Request Parameters

Name Type Description
nickname string An alternate name for the Portfolio. This is helpful for users to better tag and identify their available Portfolios.
portfolio_type string Manually override the Portfolio’s type. This can only be set to one of the Portfolio Types made available by Quovo. The Portfolio’s category will automatically update to reflect the new portfolio_type.
is_inactive boolean Use this to set a Portfolio to inactive. Inactive Portfolios will not yield any data, i.e. their transactions and positions will not be returned. Their values will also be excluded when calculating total Account and user value. This may be useful if the end user wants to only utilize a subset of Portfolios within in an Account.

Response Fields

Name Type Description
account integer The Quovo Account the Portfolio belongs to.
brokerage integer The Quovo Brokerage the Account is associated with.
brokerage_name string The name of the associated financial institution.
description string A description of the Portfolio, taken from the financial institution. The usage of the description field varies by institution, so this field may return null for some Portfolios.
id integer The unique Quovo identifier for the Portfolio.
is_inactive boolean Inactive Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value. You may want to set a Portfolio’s is_inactive state to true if the end user wants to only utilize a subset of Portfolios within an Account. Note that an inactive Portfolio within an inactive Account cannot be made active (because Quovo controls the Account is_inactive state).
is_taxable boolean Indicates whether a specific Portfolio type is considered to be taxable or non-taxable. The values conform to standard tax treatment for Portfolio types (e.g., Roth IRAs are generally understood to be non-taxable).
last_change string A timestamp of the last time the Portfolio’s information was updated.
nickname string A descriptive name for the Portfolio. While there is a nickname taken from the financial institution, this field may be overriden by end users.
owner_type string The ownership type of the Portfolio. Possible values are “Individual Account”, “Joint Account”, and “Trust Account.”
portfolio_category string A grouping of the Portfolio according to broader industry attributes, as identified by Quovo. Possible values include “Banking”, “Investment”, “Insurance”, and “Loan”. Categories can have multiple corresponding Portfolio types, while Portfolio types can only have one category. See here for a full mapping of portfolio_type to portfolio_category.
portfolio_name string The full Portfolio “name” as found at the financial institution. This field often contains the full account number. Note: Because of the sensitive nature of Users’ financial institution account numbers, the portfolio_name field is obfuscated by default. It may be unobfuscated upon request.
portfolio_type string The type of Portfolio as identified by Quovo, based on its holdings, transactions, and tax eligibility. This value may also be overridden by the end user. Possible values for portfolio_type include “Checking”, “401k”, “IRA”, and more. See here for a full list of values.
portfolio_type_confidence string The level of confidence in the accuracy of the portfolio_type. Confidence levels are split into four tiers: “Very High”, “High”, “Moderate”, and “Low”. This value can be used to decide whether you should use the portfolio_type, or ignore it due to its low confidence level.
update_count integer The total number of times the Portfolio has been successfully updated. Unlike Accounts, Portfolios will only be updated if there was a successful sync.
user integer The Quovo User the Portfolio and its Account belong to.
username string The username of the associated Quovo User.
value decimal The total sum value of all Positions within the Portfolio. This value is calculated after any good sync completes. Because of intraday price updates, it may be best to calculate the Portfolio’s value manually by fetching the Portfolio’s Positions and summing their individual values.

Get Transactions

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/portfolios/750007/history"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "history": [
        {
            "account": 878793,
            "currency": null,
            "cusip": "896522109",
            "date": "2016-03-16",
            "expense_category": null,
            "fees": 0.0,
            "fxrate": 1.0,
            "id": 200646871,
            "is_cancel": false,
            "is_pending": false,
            "memo": "sell stock",
            "portfolio": 750007,
            "price": 17.817658523,
            "quantity": -69.0,
            "ticker": "TRN",
            "ticker_name": "Trinity Industries Inc.",
            "tran_category": "S",
            "tran_type": "SELL",
            "user": 523479,
            "value": 1229.41843809
        },
        {
            "account": 878793,
            "currency": null,
            "cusip": "02376R102",
            "date": "2015-11-12",
            "expense_category": null,
            "fees": 0.0,
            "fxrate": 1.0,
            "id": 200646872,
            "is_cancel": false,
            "is_pending": false,
            "memo": "sell stock",
            "portfolio": 750007,
            "price": 41.3178297469,
            "quantity": -170.0,
            "ticker": "AAL",
            "ticker_name": "American Airlines Group Inc.",
            "tran_category": "S",
            "tran_type": "SELL",
            "user": 523479,
            "value": 7024.03105698
        }
    ]
}

GET https://api.quovo.com/v2/portfolios/{portfolio_id}/history

Description

Fetch all of a Portfolio’s transactions.

Request Parameters

Name Type Description
cursor integer This parameter is used for paginated results as a pointer to the next set of transactions. Review the Pagination section in the Introduction to learn more about paginated results.
count integer The max number of transactions you would like to return for this request.
start_date string All transactions returned will have a date greater than the given start_date.
end_date string All transactions returned will have a date less than the given end_date.
start_id integer All transactions returned will have an id greater than the given start_id.
end_id integer All transactions returned will have an id less than the given end_id.

Response Fields

Name Type Description
account integer The Quovo Account that the transaction belongs to.
currency string An ISO 4217 code for transactions in foreign currencies. currency will be null for any transaction priced in USD.
cusip string A 9-character CUSIP indentifier. Note: this may not be available for all securities, and may return null for some transactions that have a ticker.
date string The trade/execution date of the transaction.
expense_category string The expense category of the transaction, such as “Entertainment” or “Groceries”. This only applies to Cash transactions within a subset of Portfolios, depending on their type. See here for a full list of available expense categories.
fees decimal The combined value of all fees (commission, bookkeeping, etc.) applied to the transaction.
fxrate decimal The foreign exchange rate used to translate any foreign currency into USD. This rate will be 1.00 for any transaction priced in USD. To view all prices and values in their local currency, divide price and value by the fxrate (price / fxrate == local_price).
id integer The unique Quovo identifier for the transaction.
is_cancel boolean This field indicates whether the transaction is a Cancel Transaction or not. Cancel Transactions occur when existing transactions are substantially updated or completely removed by the institution. See here for additional information.
is_pending boolean This field indicates whether the transaction is pending or not. Pending transactions are cash transactions that have not yet settled in a bank account. See here for additional information.
memo string A descriptive, long-form text of the transaction, taken from the institution.
portfolio integer The Quovo Portfolio that the transaction belongs to.
price decimal The price per unit of this transaction, as reported by the financial institution. This will be 0 for transactions such as cash deposits or withdrawals.
quantity decimal The number of units transferred, bought, or sold in this transaction, as reported by the financial institution. This will be 0 for transactions such as cash deposits or withdrawals.
ticker string The public symbol for the relevant security in the transaction. Quovo uses several fallback identifiers when the ticker is unavailable: if a CUSIP is specified, it will be used instead; if the security is unique to a specific institution, the ticker will have a prefix of FI: to identify it as such (e.g., “FI:SVF-N”); if we are unable to identify the relevant security, the ticker will have a prefix of UN: (e.g., “UN:0000E3C9”). Any transaction that does not use a security, such as cash deposits or withdrawals, will have an empty string "" as the ticker, not null.
ticker_name string The name of the associated security.
tran_category string A broad category that helps identify the transaction type. See here for additional information on transaction categories.
tran_type string A much more specific and fine-grained identifier of the transaction type. See here for a full list of transaction types.
user integer The Quovo User the Portfolio and Account belong to.
value decimal The total value of the transaction. For example, on buys, this value will generally be equal to quantity * price; for cash deposits, this value will be equal to the total value deposited.

Get Manual Assets

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/portoflios/1042111/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "manual_assets": [
        {
            "account": 1010651,
            "id": 99102189,
            "portfolio": 1042111,
            "portfolio_name": "Real Estate",
            "price": 812500,
            "quantity": 1,
            "ticker": "UN:00070EF7",
            "ticker_name": "Quovo Condo (1042111)",
            "user": 162703,
            "username": "quovo_test_user",
            "value": 812500
        }
    ]
}

GET https://api.quovo.com/v2/portfolios/{portfolio_id}/manual_assets

Description

Fetches all of the Portfolio’s Manual Assets.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
id integer A unique Quovo identifier for the Manual Asset. Note: The ID may change after the Asset is updated, so do not use IDs to track Assets.
portfolio integer The Quovo Manual Portfolio the Asset belongs to.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.
ticker string The Quovo-generated symbol for the Asset. All Manual Asset tickers will have a prefix of UN:, like other unidentified holdings.
ticker_name string The name of the Manual Asset as entered by the end user.
user integer The Quovo User the Portfolio and Account belong to.
username string The username of the associated Quovo User.
value decimal The total value of the Asset.

Create a Manual Asset

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -d '{"name": "Quovo Condo", "value": 812500, "quantity": 1, "price": 812500}' "https://api.quovo.com/v2/portfolios/1042111/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
    "manual_asset": {
        "account": 1010651,
        "id": 99102189,
        "portfolio": 1042111,
        "portfolio_name": "Real Estate",
        "price": 812500,
        "quantity": 1,
        "ticker": "UN:00070EF7",
        "ticker_name": "Quovo Condo (1042111)",
        "user": 162703,
        "username": "quovo_test_user",
        "value": 812500
    }
}

POST https://api.quovo.com/v2/portfolios/{portfolio_id}/manual_assets

Description

Creates a new Manual Asset for the given Portfolio.

Request Parameters

Name Type Description
name* string The name of the Manual Asset. This should describe what the Asset represents, e.g. “My Condo” or “Boat I”.
value* decimal The total value of the Manual Asset.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
id integer A unique Quovo identifier for the Manual Asset. Note: The ID may change after the Asset is updated, so do not use IDs to track Assets.
portfolio integer The Quovo Manual Portfolio the Asset belongs to.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.
ticker string The Quovo-generated symbol for the Asset. All Manual Asset tickers will have a prefix of UN:, like other unidentified holdings.
ticker_name string The name of the Manual Asset as entered by the end user.
user integer The Quovo User the Portfolio and Account belong to.
username string The username of the associated Quovo User.
value decimal The total value of the Asset.

Update a Manual Asset

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"ticker": "UN:00070EF7", "value": 825500, "quantity": 1}' "https://api.quovo.com/v2/portfolios/1042111/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "manual_asset": {
        "account": 1010651,
        "id": 99102189,
        "portfolio": 1042111,
        "portfolio_name": "Real Estate",
        "price": 825500,
        "quantity": 1,
        "ticker": "UN:00070EF7",
        "ticker_name": "Quovo Condo (1042111)",
        "user": 162703,
        "username": "quovo_test_user",
        "value": 825500
    }
}

PUT https://api.quovo.com/v2/portfolios/{portfolio_id}/manual_assets

Description

Updates an existing Manual Asset for a specific Portfolio.

Request Parameters

Name Type Description
ticker* string The targeted Asset to update. This should be the Quovo-generated symbol for the target Asset.
price decimal The updated price per unit of the Asset.
quantity decimal The updated number of units of the Asset.
value decimal The updated total value of the Asset. Note: If value is given, an associated price or quantity must also be given.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
id integer A unique Quovo identifier for the Manual Asset. Note: The ID may change after the Asset is updated, so do not use IDs to track Assets.
portfolio integer The Quovo Manual Portfolio the Asset belongs to.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.
ticker string The Quovo-generated symbol for the Asset. All Manual Asset tickers will have a prefix of UN:, like other unidentified holdings.
ticker_name string The name of the Manual Asset as entered by the end user.
user integer The Quovo User the Portfolio and Account belong to.
username string The username of the associated Quovo User.
value decimal The total value of the Asset.

Delete a Manual Asset

curl -X DELETE -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -d '{"ticker" : "UN:00070EF7"}' "https://api.quovo.com/v2/portfolios/1042111/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Status: 204 No Content

DELETE https://api.quovo.com/v2/portfolios/{portfolio_id}/manual_assets

Description

Deletes an existing Manual Asset for a specific Portfolio.

Request Parameters

Name Type Description
ticker* string The targeted Asset to delete. This should be the Quovo-generated symbol for the target Asset.

Get Positions

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/portfolios/750007/positions"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "positions": [
        {
            "account": 878793,
            "asset_class": "Mid Cap Equity",
            "cost_basis": null,
            "cost_basis_type": null,
            "currency": null,
            "cusip": "067901108",
            "fxrate": 1.0,
            "id": 240356218,
            "last_purchase_date": "2016-01-04",
            "market_code": "NYE",
            "portfolio": 750007,
            "portfolio_name": "***ount",
            "price": 13.61,
            "quantity": 562.0,
            "sector": "Basic Materials",
            "security_type": "Equity",
            "security_type_confidence": "Very High",
            "ticker": "ABX",
            "ticker_name": "Barrick Gold Corp.",
            "user": 523479,
            "username": "quovo_myfirstuser",
            "value": 7648.82
        },
        {
            "account": 878793,
            "asset_class": "Mid Cap Equity",
            "cost_basis": null,
            "cost_basis_type": null,
            "currency": null,
            "cusip": "200525103",
            "fxrate": 1.0,
            "id": 240356219,
            "last_purchase_date": "2016-02-02",
            "market_code": "NSD",
            "portfolio": 750007,
            "portfolio_name": "***ount",
            "price": 44.59,
            "quantity": 465.332164335,
            "sector": null,
            "security_type": "Equity",
            "security_type_confidence": "Very High",
            "ticker": "CBSH",
            "ticker_name": "Commerce Bancshares Inc.",
            "user": 523479,
            "username": "quovo_myfirstuser",
            "value": 20749.1612076977
        }
    ]
}

GET https://api.quovo.com/v2/portfolios/{portfolio_id}/positions

Description

Fetch all of a Portfolio’s positions.

Request Parameters

Name Type Description
cursor integer This parameter is used for paginated results as a pointer to the next set of Positions. Review the Pagination section in the Introduction to learn more about paginated results.
count integer The max number of Positions you would like to return for this request.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
asset_class string The asset class of the associated security. Note: Some securities may have similar security types and asset classes (such as cash), while others will be quite different (such as ETFs and Mutual Funds) For a list of all available asset classes, see the Asset Classes section.
cost_basis decimal The total cost basis value of the Position (this parameter is not given on a per-share basis).
cost_basis_type string The source of the cost basis value. Possible values are “brokerage”, “quovo-complete”, and “quovo-incomplete”. “brokerage” indicates the cost basis comes directly from the financial institution. “quovo-complete” means we calculated cost basis based on fully available Position history, while “quovo-incomplete” means we calculated the value with only partial Position history available.
currency string An ISO 4217 code for Positions in foreign currencies. currency will be null for any security priced in USD.
cusip string The 9-character CUSIP indentifier. Note: this may not be available for all securities, and may return null for some Positions.
fxrate decimal The foreign exchange rate used to translate any foreign currency into USD. This rate will be 1.00 for any Position priced in USD. To view all prices and values in their local currency, divide price and value by the fxrate (price / fxrate == local_price).
id integer A unique Quovo identifier for the Position. Note: IDs will change on every successful sync, so do not use IDs to track Quovo Positions.
last_purchase_date string The date of the last time this security was purchased in this Portfolio.
market_code string The short name of the stock exchange or market where the security is traded, e.g., “NYE” or “NSD”.
portfolio integer The Quovo Portfolio the Position belongs to.
portfolio_name string The full Portfolio name as found at the financial institution.
price decimal The price per unit of this Position, either retrieved from the Quovo security master or as reported by the financial institution.
quantity decimal The number of units of this Position, as reported by the financial institution.
sector string The industry sector for equities, e.g., “Technology” or “Industrials.” For a list of all available sectors, check the Sectors section.
security_type string The type of the associated security, e.g., “Equity” or “Bond.” For a list of all available security types, check the Security Types section.
security_type_confidence string The level of confidence in the accuracy of the security_type. Confidence levels are split into four tiers: “Very High”, “High”, “Moderate”, and “Low”. This value can be used to decide whether you should use the security_type, or ignore it due to its low confidence level.
ticker string The public symbol for the relevant security in the Position. Quovo uses several fallback identifiers when the ticker is unavailable: if a CUSIP is specified, it will be used instead; if the security is unique to a specific institution, the ticker will have a prefix of FI: to identify it as such (e.g., “FI:SVF-N”); if we are unable to identify the relevant security, the ticker will have a prefix of UN: (e.g., “UN:0000E3C9”). Any cash Position will use a ticker of CUR:USD.
ticker_name string The name of the associated security.
user integer The Quovo user the Portfolio and Account belong to.
username string The username of the associated Quovo user.
value decimal The total value of the Position.

/positions

Positions are the individual financial holdings within a Portfolio. For example, a single investment Portfolio may have positions in AAPL, GOOG, a mutual fund, and cash. Another Portfolio (a bank account) may only have a cash position.

Get all Positions

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/positions?account=877247"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "positions": [
        {
            "account": 877247,
            "asset_class": "Large Cap Equity",
            "cost_basis": null,
            "cost_basis_type": null,
            "currency": null,
            "cusip": "594918104",
            "fxrate": 1.0,
            "id": 237432133,
            "last_purchase_date": "2015-05-01",
            "market_code": "NSD",
            "portfolio": 746745,
            "portfolio_name": "test port",
            "price": 53.54,
            "quantity": 9.0,
            "sector": null,
            "security_type": "Equity",
            "security_type_confidence": "Very High",
            "ticker": "MSFT",
            "ticker_name": "Microsoft Corporation",
            "user": 162703,
            "username": "quovo_test_user",
            "value": 481.86
        },
        {
            "account": 877247,
            "asset_class": "Large Cap Equity",
            "cost_basis": null,
            "cost_basis_type": null,
            "currency": null,
            "cusip": "037833100",
            "fxrate": 1.0,
            "id": 237432134,
            "last_purchase_date": "2015-05-05",
            "market_code": "NSD",
            "portfolio": 746745,
            "portfolio_name": "test port",
            "price": 105.19,
            "quantity": 12.0,
            "sector": "Technology",
            "security_type": "Equity",
            "security_type_confidence": "Very High",
            "ticker": "AAPL",
            "ticker_name": "Apple Inc",
            "user": 162703,
            "username": "quovo_test_user",
            "value": 1262.28
        }
    ]
}

GET https://api.quovo.com/v2/positions

Description

Fetches on all Positions across all Portfolios and Accounts.

Request Parameters

Name Type Description
user integer If passed, all holdings returned will belong to the given Quovo User.
account integer If passed, all holdings returned will belong to the given Quovo Account.
portfolio integer If passed, all holdings returned will belong to the given Quovo Portfolio.
cursor integer This parameter is used for paginated results as a pointer to the next set of Positions. Review the Pagination section in the Introduction to learn more about paginated results.
count integer The max number of Positions you would like to return for this request.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
asset_class string The asset class of the associated security. Note: Some securities may have similar security types and asset classes (such as cash), while others will be quite different (such as ETFs and Mutual Funds) For a list of all available asset classes, see the Asset Classes section.
cost_basis decimal The total cost basis value of the Position (this parameter is not given on a per-share basis).
cost_basis_type string The source of the cost basis value. Possible values are “brokerage”, “quovo-complete”, and “quovo-incomplete”. “brokerage” indicates the cost basis comes directly from the financial institution. “quovo-complete” means we calculated cost basis based on fully available Position history, while “quovo-incomplete” means we calculated the value with only partial Position history available.
currency string An ISO 4217 code for Positions in foreign currencies. currency will be null for any security priced in USD.
cusip string The 9-character CUSIP indentifier. Note: this may not be available for all securities, and may return null for some Positions.
fxrate decimal The foreign exchange rate used to translate any foreign currency into USD. This rate will be 1.00 for any Position priced in USD. To view all prices and values in their local currency, divide price and value by the fxrate (price / fxrate == local_price).
id integer A unique Quovo identifier for the Position. Note: IDs will change on every successful sync, so do not use IDs to track Quovo Positions.
last_purchase_date string The date of the last time this security was purchased in this Portfolio.
market_code string The short name of the stock exchange or market where the security is traded, e.g., “NYE” or “NSD”.
portfolio integer The Quovo Portfolio the Position belongs to.
portfolio_name string The full Portfolio name as found at the financial institution.
price decimal The price per unit of this Position, either retrieved from the Quovo security master or as reported by the financial institution.
quantity decimal The number of units of this Position, as reported by the financial institution.
sector string The industry sector for equities, e.g., “Technology” or “Industrials.” For a list of all available sectors, check the Sectors section.
security_type string The type of the associated security, e.g., “Equity” or “Bond.” For a list of all available security types, check the Security Types section.
security_type_confidence string The level of confidence in the accuracy of the security_type. Confidence levels are split into four tiers: “Very High”, “High”, “Moderate”, and “Low”. This value can be used to decide whether you should use the security_type, or ignore it due to its low confidence level.
ticker string The public symbol for the relevant security in the Position. Quovo uses several fallback identifiers when the ticker is unavailable: if a CUSIP is specified, it will be used instead; if the security is unique to a specific institution, the ticker will have a prefix of FI: to identify it as such (e.g., “FI:SVF-N”); if we are unable to identify the relevant security, the ticker will have a prefix of UN: (e.g., “UN:0000E3C9”). Any cash Position will use a ticker of CUR:USD.
ticker_name string The name of the associated security.
user integer The Quovo user the Portfolio and Account belong to.
username string The username of the associated Quovo user.
value decimal The total value of the Position.

/requests

Use this endpoint to request a new financial institution outside of Quovo’s current universe of available institutions. We track these requests to help prioritize new institution builds.

Request a new Brokerage

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e"  -H "Content-Type: application/json" -d '{"username": "testusername", "password": "testpassword", "brokerage_name": "U.S. Bank", "brokerage_url": "usbank.com", "user": 523479}' "https://api.quovo.com/v2/requests"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 204 No Content

POST https://api.quovo.com/v2/requests

Description

Requests a new financial institution for Quovo to retrieve data from.

Request Parameters

Name Type Description
user* integer The Quovo User that submitted the Brokerage request.
brokerage_name* string The name of the requested Brokerage.
brokerage_url* string The URL of the requested Brokerage; ideally the full URL where the end user actually logs in to view their account data.
username* string The end user’s login username; the same one they use to login directly on their institution’s website.
password* string The end user’s login password; the same one they use to login directly on their institution’s website.

/sync

A sync represents an ongoing attempt to update a Quovo Account and retrieve new data from a Brokerage.

All Quovo Accounts are refreshed nightly automatically, so there is no need to manually sync an Account after the initial sync.

Get Sync progress

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/sync?account=878793"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "sync": {
        "account": 878793,
        "has_realtime": false,
        "progress": {
            "message": "authenticating",
            "percent": 0.10,
            "state": "authenticating"
        },
        "status": "syncing"
    }
}

GET https://api.quovo.com/v2/sync?account={account_id}

Description

Check the ongoing sync progress of an Account.

Request Parameters

Name Type Description
account* integer The Quovo Account you would like to check the sync status for.

Response Fields

Name Type Description
account integer The Quovo Account that is being synced.
config_instructions string (Only available if the final sync status is config) Institution-specific instructions for the end user, which need to be completed before the Account can successfully sync. The end user will usually need to perform some action on their institution’s website, such as enabling an option in their user settings.
has_realtime boolean Indicates whether the Account currently has real-time MFA Challenges that need to be answered. See here for more details on the real-time MFA workflow.
progress object A nested object indicating current sync status. See the table below for the object fields and their descriptions.
status string The sync status of the Account. This field will simply be “syncing” while a sync is in progress. After the sync ends, this field will indicate whether the Account was synced successfully (“good”), or if the Account has MFA Challenges to answer (“questions”), and more. See here for a full list of Account sync statuses.

progress Object

Name Type Description
message string A user-friendly message that indicates the current syncing progress.
percent decimal The percentage (from 0.00 to 1.00) of sync completion.
state string A more machine-friendly string that also indicates the current syncing progress. For a list of all possible sync states, see the Data Specs section here.

Create Sync

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"account": 878793}' "https://api.quovo.com/v2/sync"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
    "sync": {
        "account": 880701,
        "has_realtime": false,
        "progress": {
            "message": "queued",
            "percent": 0,
            "state": "queued"
        },
        "status": "syncing"
    }
}

POST https://api.quovo.com/v2/sync

Description

Creates and initiates a new Account sync.

Request Parameters

Name Type Description
account* integer The Quovo Account for which you would like to initiate a new sync.

Response Fields

Name Type Description
account integer The Quovo Account that is being synced.
config_instructions string (Only available if the final sync status is config) Institution-specific instructions for the end user, which need to be completed before the Account can successfully sync. The end user will usually need to perform some action on their institution’s website, such as enabling an option in their user settings.
has_realtime boolean Indicates whether the Account currently has real-time MFA Challenges that need to be answered. See here for more details on the real-time MFA workflow.
progress object A nested object indicating current sync status. See the table below for the object fields and their descriptions.
status string The sync status of the Account. This field will simply be “syncing” while a sync is in progress. After the sync ends, this field will indicate whether the Account was synced successfully (“good”), or if the Account has MFA Challenges to answer (“questions”), and more. See here for a full list of Account sync statuses.

progress Object

Name Type Description
message string A user-friendly message that indicates the current syncing progress.
percent decimal The percentage (from 0.00 to 1.00) of sync completion.
state string A more machine-friendly string that also indicates the current syncing progress. For a list of all possible sync states, see the Data Specs section here.

/terms_of_use

Terms of Use (“TOU”) is the agreement to use Quovo’s system according to our defined usage rules. These endpoints allow you to expose Quovo’s TOU to your end users, and, if necessary, log an acceptance of the TOU.

Check TOU Acceptance

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" "https://api.quovo.com/v2/terms_of_use?user=162703"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "terms_of_use": {
        "accepted": false,
        "user": 162703
    }
}

GET https://api.quovo.com/v2/terms_of_use?user={user_id}

Description

Check whether or not a User has accepted Quovo’s terms of use.

Request Parameters

Name Type Description
user integer The Quovo User for whom you are checking TOU acceptance.

Response Fields

Name Type Description
accepted boolean true if a User has accepted the Terms of Use.
user integer The Quovo User associated with this Terms of Use agreement.

Update TOU Acceptance

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"user": 162703, "accepted": true}' "https://api.quovo.com/v2/terms_of_use"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "terms_of_use": {
        "accepted": true,
        "user": 162703
    }
}

PUT https://api.quovo.com/v2/terms_of_use

Description

Update whether or not a User has accepted Quovo’s terms of use.

Request Parameters

Name Type Description
user integer The Quovo User you would like to update TOU acceptance for.
accepted boolean If the User has accepted the Terms of Use, pass true.

Response Fields

Name Type Description
accepted boolean true if a User has accepted the Terms of Use.
user integer The Quovo User associated with this Terms of Use agreement.

/tokens

Access tokens provide access to all other endpoints within the API. These tokens allow API users to authenticate and identify themselves without repeatedly passing their API credentials back and forth for every API call.

To authenticate to the /v2/tokens endpoint, pass your API user credentials using Client-side Basic Auth.

Get all access tokens

curl -X GET --user "my_api_username:my_api_password" "https://api.quovo.com/v2/tokens"
Authorization: Basic ZmFrZXVzZXJuYW1lOmZha2VwYXNzd29yZA==
Content-Type: application/json
Status: 200 OK
{
    "access_tokens": [
        {
            "created": "2016-03-30T03:00:00Z",
            "expires": "2016-03-30T04:00:00Z",
            "name": "test_token"
        },
        {
            "created": "2016-03-29T19:20:03Z",
            "expires": "2016-03-29T20:20:03Z",
            "name": "main_token"
        }
    ]
}

GET https://api.quovo.com/v2/tokens

Description

Retrieves all of your access tokens.

Response Fields

Name Type Description
created string A timestamp that indicates when the access token was created (in UTC time).
expires string A timestamp that indicates when the access token will expire (in UTC time). By default, access tokens expire after one hour.
name string The unique name of the access token.

Create an access token

curl -X POST --user "my_api_username:my_api_password" -H "Content-Type: application/json" -d '{"name": "main_token"}' "https://api.quovo.com/v2/tokens"
Authorization: Basic ZmFrZXVzZXJuYW1lOmZha2VwYXNzd29yZA==
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
    "access_token": {
        "created": "2016-03-31T17:45:09Z",
        "expires": "2016-03-31T18:45:09Z",
        "name": "main_token",
        "token": "a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e"
    }
}

POST https://api.quovo.com/v2/tokens

Description

Creates and returns an access token.

Request Parameters

Name Type Description
name* string The unique name of the access token you are creating. This can be any string you choose, as long as it does not duplicate the names of your other existing access tokens.
expires string The datetime string (in ISO 8601 format) that indicates when the token will expire.

Response Fields

Name Type Description
created string A timestamp that indicates when the access token was created (in UTC time).
expires string A timestamp that indicates when the access token will expire (in UTC time). By default, access tokens expire after one hour.
name string The unique name of the access token.

Update an access token

curl -X POST --user "my_api_username:my_api_password" -H "Content-Type: application/json" -d '{"name": "main_token", "new_name": "test_token"}' "https://api.quovo.com/v2/tokens"
Authorization: Basic ZmFrZXVzZXJuYW1lOmZha2VwYXNzd29yZA==
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "access_token": {
        "created": "2016-03-31T17:45:09Z",
        "expires": "2016-03-31T18:45:09Z",
        "name": "test_token"
    }
}

PUT https://api.quovo.com/v2/tokens

Description

Updates the name of an existing access token.

Request Parameters

Name Type Description
name* string The name of the access token you want to update.
new_name* string The new, unique name for the selected access token. This can be any string you choose, as long as it does not duplicate the names of your other existing access tokens.

Response Fields

Name Type Description
created string A timestamp that indicates when the access token was created (in UTC time).
expires string A timestamp that indicates when the access token will expire (in UTC time). By default, access tokens expire after one hour.
name string The unique name of the access token.

Delete an Access Token

curl -X DELETE --user "my_api_username:my_api_password" -H "Content-Type: application/json" -d '{"name": "main_token"}' "https://api.quovo.com/v2/tokens"
Authorization: Basic ZmFrZXVzZXJuYW1lOmZha2VwYXNzd29yZA==
Content-Type: application/json
Status: 204 No Content

DELETE https://api.quovo.com/v2/tokens

Description

Deletes an existing access token.

Request Parameters

Name Type Description
name* string The name of the access token you want to delete.

/users

Users are the owners of Accounts within Quovo. In most cases, they will reflect any end users within your internal system.

Get all Users

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/users"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "users": [
        {
            "email": "testuser@quovo.com",
            "id": 162703,
            "name": "Quovo Testuser",
            "phone": null,
            "username": "quovo_test_user",
            "value": 173471.15110
        },
        {
            "email": "another.testuser@quovo.com",
            "id": 162713,
            "name": "Quovo Testuser II",
            "phone": null,
            "username": "quovo_test_user_2",
            "value": 2944.11
        }
    ]
}

GET https://api.quovo.com/v2/users

Description

Fetches all of your Users.

Request Parameters

Name Type Description
username string If passed, only the Quovo User with the given username will be returned.

Response Fields

Name Type Description
email string The User’s email address.
id integer The unique Quovo identifier for this user.
name string The full name of the User.
phone string The User’s phone number.
username string The User’s Quovo username. This is not the username used to log into Accounts.
value decimal The total value of all Portfolios that belong to this User. Note: If the User does not own any Accounts and Portfolios, this may be null.

Create a User

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"username": "quovo_myfirstuser", "name": "Test User 1", "email": "fakeemail@quovo.com"}' "https://api.quovo.com/v2/users"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
    "user": {
        "email": "fakeemail@quovo.com",
        "id": 165703,
        "name": "Test User 1",
        "phone": null,
        "username": "quovo_myfirstuser",
        "value": null
    }
}

POST https://api.quovo.com/v2/users

Description

Creates a Quovo User.

Request Parameters

Name Type Description
username* string The User’s Quovo username. This is separate from the usernames used to log into brokerage accounts. We suggest that you have a clear mapping from your internal username to the connected Quovo username.
name string The name of the User. ‘Firstname Lastname’ is common, but any descriptive identifier will do.
email string The User’s email address.
phone string The User’s phone number.

Response Fields

Name Type Description
email string The User’s email address.
id integer The unique Quovo identifier for this User.
name string The full name of the User.
phone string The User’s phone number.
username string The User’s Quovo username. This is not the username used to log into Accounts.
value decimal The total value of all Portfolios that belong to this User. Note: If the User does not own any Accounts and Portfolios, this may be null.

Get User

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/users/162703"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "user": {
        "email": "testuser@quovo.com",
        "id": 162703,
        "name": "Quovo Testuser",
        "phone": null,
        "username": "quovo_test_user",
        "value": 173471.15110
    }
}

GET https://api.quovo.com/v2/users/{user_id}

Description

Provides information on a single User.

Response Fields

Name Type Description
email string The User’s email address.
id integer The unique Quovo identifier for this User.
name string The full name of the User.
phone string The User’s phone number.
username string The User’s Quovo username. This is not the username used to log into Accounts.
value decimal The total value of all Portfolios that belong to this User. Note: If the User does not own any Accounts and Portfolios, this may be null.

Modify an existing User

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"name": "An Actual Name", "email": "notafakeemail@quovo.com"}' "https://api.quovo.com/v2/users/165703"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
    "user": {
        "email": "notafakeemail@quovo.com",
        "id": 165703,
        "name": "An Actual Name",
        "phone": null,
        "username": "quovo_myfirstuser",
        "value": null
    }
}

PUT https://api.quovo.com/v2/users/{user_id}

Description

Modifies an existing user.

Request Parameters

Name Type Description
email string The User’s email address.
name string The name of the User, ‘Firstname Lastname’ is common, but any descriptive identifier will do.
phone string The User’s phone number.

Response Fields

Name Type Description
email string The User’s email address.
id integer The unique Quovo identifier for this User.
name string The full name of the User.
phone string The User’s phone number.
username string The User’s Quovo username. This is not the username used to log into Accounts.
value decimal The total value of all Portfolios that belong to this User. Note: If the User does not own any Accounts and Portfolios, this may be null.

Delete a User

curl -X DELETE -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/users/523479"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Status: 204 No Content

DELETE https://api.quovo.com/v2/users/{user_id}

Description

Deletes a Quovo User.

Get Accounts

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/users/523479/accounts"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
  "accounts": [
    {
      "brokerage": 21700,
      "brokerage_name": "Test Bank Brokerage",
      "config_instructions": null,
      "failures": 0,
      "id": 878797,
      "is_inactive": false,
      "last_good_sync": "2016-03-29T15:11:12.093",
      "nickname": null,
      "opened": "2016-03-29T15:10:43.880",
      "status": "good",
      "update_count": 1,
      "updated": "2016-03-29T15:11:12.093",
      "user": 523479,
      "username": "quovo_myfirstuser",
      "value": 2467.23
    }
  ]
}

GET https://api.quovo.com/v2/users/{user_id}/accounts

Description

Returns all of a User’s Accounts.

Response Fields

Name Type Description
brokerage integer The Quovo institution ID associated with this Account.
brokerage_name string The name of the associated financial institution.
config_instructions string Institution-specific instructions for the end user, which need to be completed before the Account can successfully sync. The end user will usually need to perform some action on their institution’s website, such as enabling an option in their user settings.
failures integer The number of recent unsuccesful sync attempts. This will reset to 0 after every good sync.
id integer The unique Quovo identifier for the Account.
is_inactive boolean If an Account is inactive, it cannot be synced, and its associated Portfolios cannot have data retrieved for them. Note: inactive Accounts are set by Quovo, while inactive Portfolios can be set by you.
last_good_sync string A timestamp of the last time a sync completed successfully, i.e. returned a status of “good”.
nickname string A nickname for the Account retrieved from the financial institution.
opened string A timestamp for when the Account was added to Quovo.
status string The status of the last completed sync attempt, which indicates whether the Account was successfully synced, or if additional steps need to be completed. A table here has a full list of our Account statuses and what they mean. Note: the Account status will not change while there is an ongoing sync attempt; it will continue to show the status of the last completed sync.
update_count integer The total number of completed syncs on the Account.
updated string A timestamp of the last time there was a sync attempt. This is set regardless if the sync returned a “good” or non-“good” status.
user integer The User ID that owns the Account.
username string The username of the associated User.
value decimal The total value of all Portfolios within this Account, which is calculated after any good sync completes.

Create an Account

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"username": "testusername", "brokerage": 21534, "password": "testpassword"}' "https://api.quovo.com/v2/users/523479/accounts"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
  "account": {
    "brokerage": 21534,
    "brokerage_name": "Test Data Brokerage",
    "config_instructions": null,
    "failures": 0,
    "id": 878805,
    "is_inactive": false,
    "last_good_sync": null,
    "nickname": null,
    "opened": "2016-03-29T15:14:46.847",
    "status": null,
    "update_count": 0,
    "updated": "2016-03-29T15:14:46.847",
    "user": 523479,
    "username": "quovo_myfirstuser",
    "value": null
  }
}

POST https://api.quovo.com/v2/users/{user_id}/accounts

Description

Creates an Account for a User.

Request Parameters

Name Type Description
brokerage* integer The Quovo Brokerage ID for the associated financial institution. For example, you would pass 21534 if you wanted to create a new Account on the “Test Data Brokerage.”
username* string The end user’s login username; generally the same one they use to login directly on their institution’s website.
password* string The end user’s login password; generally the same one they use to login directly on their institution’s website.

Response Fields

Name Type Description
brokerage integer The Quovo institution ID associated with this Account.
brokerage_name string The name of the associated financial institution.
config_instructions string Institution-specific instructions for the end user, which need to be completed before the Account can successfully sync. The end user will usually need to perform some action on their institution’s website, such as enabling an option in their user settings.
failures integer The number of recent unsuccesful sync attempts. This will reset to 0 after every good sync.
id integer The unique Quovo identifier for the Account.
is_inactive boolean If an Account is inactive, it cannot be synced, and its associated Portfolios cannot have data retrieved for them. Note: inactive Accounts are set by Quovo, while inactive Portfolios can be set by you.
last_good_sync string A timestamp of the last time a sync completed successfully, i.e. returned a status of “good”.
nickname string A nickname for the Account retrieved from the financial institution.
opened string A timestamp for when the Account was added to Quovo.
status string The status of the last completed sync attempt, which indicates whether the Account was successfully synced, or if additional steps need to be completed. A table here has a full list of our Account statuses and what they mean. Note: the Account status will not change while there is an ongoing sync attempt; it will continue to show the status of the last completed sync.
update_count integer The total number of completed syncs on the Account.
updated string A timestamp of the last time there was a sync attempt. This is set regardless if the sync returned a “good” or non-“good” status.
user integer The User ID that owns the Account.
username string The username of the associated User.
value decimal The total value of all Portfolios within this Account, which is calculated after any good sync completes.

Get Transactions

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/users/523479/history"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
  "history": [
      {
          "account": 878797,
          "currency": null,
          "cusip": null,
          "date": "2016-02-29",
          "expense_category": "ATM/Cash",
          "fees": 0.0,
          "fxrate": 1.0,
          "id": 200647043,
          "is_cancel": false,
          "is_pending": false,
          "memo": "ATM CHECK DEPOSIT MEMO=6154528589",
          "portfolio": 750018,
          "price": 0.0,
          "quantity": 0.0,
          "ticker": "",
          "ticker_name": null,
          "tran_category": "C",
          "tran_type": "DEPO",
          "user": 523479,
          "value": 4096.0
      },
      {
          "account": 878797,
          "currency": null,
          "cusip": null,
          "date": "2016-03-14",
          "expense_category": "ATM/Cash",
          "fees": 0.0,
          "fxrate": 1.0,
          "id": 200647044,
          "is_cancel": false,
          "is_pending": false,
          "memo": "ATM CHECK DEPOSIT MEMO=6608346411",
          "portfolio": 750018,
          "price": 0.0,
          "quantity": 0.0,
          "ticker": "",
          "ticker_name": null,
          "tran_category": "C",
          "tran_type": "DEPO",
          "user": 523479,
          "value": 4096.0
      }
  ]
}

GET https://api.quovo.com/v2/users/{user_id}/history

Description

Fetches all of a User’s transactions, across all of their Portfolios.

Request Parameters

Name Type Description
cursor integer This parameter is used for paginated results as a pointer to the next set of transactions. Review the Pagination section in the Introduction to learn more about paginated results.
count integer The max number of transactions you would like to return for this request.
start_date string All transactions returned will have a date greater than the given start_date.
end_date string All transactions returned will have a date less than the given end_date.
start_id integer All transactions returned will have an id greater than the given start_id.
end_id integer All transactions returned will have an id less than the given end_id.

Response Fields

Name Type Description
account integer The Quovo Account that the transaction belongs to.
currency string An ISO 4217 code for transactions in foreign currencies. currency will be null for any transaction priced in USD.
cusip string A 9-character CUSIP indentifier. Note: this may not be available for all securities, and may return null for some transactions that have a ticker.
date string The trade/execution date of the transaction.
expense_category string The expense category of the transaction, such as “Entertainment” or “Groceries”. This only applies to Cash transactions within a subset of Portfolios, depending on their type. See here for a full list of available expense categories.
fees decimal The combined value of all fees (commission, bookkeeping, etc.) applied to the transaction.
fxrate decimal The foreign exchange rate used to translate any foreign currency into USD. This rate will be 1.00 for any transaction priced in USD. To view all prices and values in their local currency, divide price and value by the fxrate (price / fxrate == local_price).
id integer The unique Quovo identifier for the transaction.
is_cancel boolean This field indicates whether the transaction is a Cancel Transaction or not. Cancel Transactions occur when existing transactions are substantially updated or completely removed by the institution. See here for additional information.
is_pending boolean This field indicates whether the transaction is pending or not. Pending transactions are cash transactions that have not yet settled in a bank account. See here for additional information.
memo string A descriptive, long-form text of the transaction, taken from the institution.
portfolio integer The Quovo Portfolio that the transaction belongs to.
price decimal The price per unit of this transaction, as reported by the financial institution. This will be 0 for transactions such as cash deposits or withdrawals.
quantity decimal The number of units transferred, bought, or sold in this transaction, as reported by the financial institution. This will be 0 for transactions such as cash deposits or withdrawals.
ticker string The public symbol for the relevant security in the transaction. Quovo uses several fallback identifiers when the ticker is unavailable: if a CUSIP is specified, it will be used instead; if the security is unique to a specific institution, the ticker will have a prefix of FI: to identify it as such (e.g., “FI:SVF-N”); if we are unable to identify the relevant security, the ticker will have a prefix of UN: (e.g., “UN:0000E3C9”). Any transaction that does not use a security, such as cash deposits or withdrawals, will have an empty string "" as the ticker, not null.
ticker_name string The name of the associated security.
tran_category string A broad category that helps identify the transaction type. See here for additional information on transaction categories.
tran_type string A much more specific and fine-grained identifier of the transaction type. See here for a full list of transaction types.
user integer The Quovo User the Portfolio and Account belong to.
value decimal The total value of the transaction. For example, on buys, this value will generally be equal to quantity * price; for cash deposits, this value will be equal to the total value deposited.

Create an iframe token

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/users/523479/iframe_token"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 201 Created
{
    "iframe_token": {
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvbmVfdGltZV91c2UiOnRydWUsImlwX3Jlc3RyaWN0ZWQiOmZhbHNlLCJzdWIiOiI1MjM0NzkiLCJleHAiOjE0ODQ5NTIzNjQsImlwIjoiMTI3LjAuMC4xIiwiaWF0IjoxNDg0OTQ4NzY0LCJ0eXBlIjoiaWZyYW1lIiwiaWQiOiIzZWI1ZjJjNTIxMjdiODU2NDUzMDM1NTU1MGRhMTM5MTczODE0MGQ4IiwidXNlciI6NTIzNDc5fQ.XT-lOL5GBTASXAX8CFOaNO_fOr2W6BhrPe1Pfa695SE",
        "user": 523479
    }
}

POST https://api.quovo.com/v2/users/{user_id}/iframe_token

Description

Use this endpoint to create a single-use iframe token for a User. This token will provide a User access to their iframe widget and all of their associated Accounts on Quovo.

Look to our Workflows section here for more information on iframe usage.

Response Fields

Name Type Description
token string The single-use access token to be included in the iframe URL. The iframe URL should be structured like https://embed.quovo.com/auth/{iframe_token}.
user integer The Quovo User to whom the iframe token belongs.

Get Manual Assets

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/users/523479/manual_assets"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "manual_assets": [
        {
            "account": 1010651,
            "id": 99102189,
            "portfolio": 1042111,
            "portfolio_name": "Real Estate",
            "price": 812500,
            "quantity": 1,
            "ticker": "UN:00070EF7",
            "ticker_name": "Quovo Condo (1042111)",
            "user": 523479,
            "username": "quovo_test_user",
            "value": 812500
        }
    ]
}

GET https://api.quovo.com/v2/users/{user_id}/manual_assets

Description

Fetches all Manual Assets for a specific User.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
id integer A unique Quovo identifier for the Manual Asset. Note: The ID may change after the Asset is updated, so do not use IDs to track Assets.
portfolio integer The Quovo Manual Portfolio the Asset belongs to.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
price decimal The price per unit of the Asset.
quantity decimal The number of units of the Asset.
ticker string The Quovo-generated symbol for the Asset. All Manual Asset tickers will have a prefix of UN:, like other unidentified holdings.
ticker_name string The name of the Manual Asset as entered by the end user.
user integer The Quovo User the Portfolio and Account belong to.
username string The username of the associated Quovo User.
value decimal The total value of the Asset.

Get Manual Portfolios

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/users/523479/manual_portfolios"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
    "manual_portfolios": [
        {
            "account": 1010651,
            "brokerage": 21639,
            "brokerage_name": "Manually Entered Assets",
            "id": 1042111,
            "is_inactive": false,
            "last_change": "2016-07-18T14:07:46.510",
            "portfolio_name": "Real Estate",
            "update_count": 6,
            "user": 523479,
            "username": "quovo_test_user",
            "value": 812500
        },
    ]
}

GET https://api.quovo.com/v2/users/{user_id}/manual_portfolios

Description

Fetches the User’s Manual Portfolios.

Response Fields

Name Type Description
account integer The Quovo Account the Manual Portfolio belongs to.
brokerage integer The Quovo Brokerage the Account is associated with. All manually-entered Portfolios will be on Brokerage 21639.
brokerage_name string The name of the associated financial institution. All manually-entered Portfolios will be on the Brokerage “Manually Entered Assets”.
id integer The unique Quovo identifier for the Portfolio.
is_inactive boolean Inactive Manual Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value.
last_change string A timestamp of the last time the Manual Portfolio or its Assets were updated.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
update_count integer The total number of times the Portfolio has been updated by the end user. This includes any time the Portfolio’s Manual Assets were updated.
user integer The Quovo User the Portfolio belongs to.
username string The username of the associated Quovo User.
value decimal The total sum value of all Manual Assets within the Portfolio. This value is calculated after any holding within the Portfolio is updated by the user.

Create a Manual Portfolio

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"name" : "Real Estate"}' "https://api.quovo.com/v2/users/523479/manual_portfolios"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
    "manual_portfolio": {
        "account": 1010651,
        "brokerage": 21639,
        "brokerage_name": "Manually Entered Assets",
        "id": 1042111,
        "is_inactive": false,
        "last_change": "2016-07-17T12:12:31.980",
        "portfolio_name": "Real Estate",
        "update_count": 1,
        "user": 523479,
        "username": "quovo_test_user",
        "value": 0
    }
}

POST https://api.quovo.com/v2/users/{user_id}/manual_portfolios

Description

Creates a Manual Asset Portfolio for the User.

Request Parameters

Name Type Description
name* string The name of the Manual Asset Portfolio. This will typically describe the assets or holdings to be entered within the Portfolio, e.g. “Real Estate” or “My Boats”.

Response Fields

Name Type Description
account integer The Quovo Account the Manual Portfolio belongs to.
brokerage integer The Quovo Brokerage the Account is associated with. All manually-entered Portfolios will be on Brokerage 21639.
brokerage_name string The name of the associated financial institution. All manually-entered Portfolios will be on the Brokerage “Manually Entered Assets”.
id integer The unique Quovo identifier for the Portfolio.
is_inactive boolean Inactive Manual Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value.
last_change string A timestamp of the last time the Manual Portfolio or its Assets were updated.
portfolio_name string The full Portfolio name as entered by the end user. This may be updated at any time by the Portfolio’s owner.
update_count integer The total number of times the Portfolio has been updated by the end user. This includes any time the Portfolio’s Manual Assets were updated.
user integer The Quovo User the Portfolio belongs to.
username string The username of the associated Quovo User.
value decimal The total sum value of all Manual Assets within the Portfolio. This value is calculated after any holding within the Portfolio is updated by the user.

Get Portfolios

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/users/523479/portfolios"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
  "portfolios": [
    {
      "account": 878797,
      "brokerage": 21700,
      "brokerage_name": "Test Bank Brokerage",
      "description": null,
      "id": 750018,
      "is_inactive": false,
      "is_taxable": true,
      "last_change": "2016-03-29T15:11:12.100",
      "nickname": null,
      "owner_type": "Individual Account",
      "portfolio_category": "Banking",
      "portfolio_name": "Checking Account",
      "portfolio_type": "Checking",
      "portfolio_type_confidence": "High",
      "update_count": 0,
      "user": 523479,
      "username": "quovo_myfirstuser",
      "value": 2467.23
    }
  ]
}

GET https://api.quovo.com/v2/users/{user_id}/portfolios

Description

Returns all of a User’s Portfolios, across all of their Accounts.

Response Fields

Name Type Description
account integer The Quovo Account the Portfolio belongs to.
brokerage integer The Quovo Brokerage the Account is associated with.
brokerage_name string The name of the associated financial institution.
description string A description of the Portfolio, taken from the financial institution. The usage of the description field varies by institution, so this field may return null for some Portfolios.
id integer The unique Quovo identifier for the Portfolio.
is_inactive boolean Inactive Portfolios will not yield any data, including transactions and positions. Their values will also be excluded when calculating total Account and User value. You may want to set a Portfolio’s is_inactive state to true if the end user wants to only utilize a subset of Portfolios within an Account. Note that an inactive Portfolio within an inactive Account cannot be made active (because Quovo controls the Account is_inactive state).
is_taxable boolean Indicates whether a specific Portfolio type is considered to be taxable or non-taxable. The values conform to standard tax treatment for Portfolio types (e.g., Roth IRAs are generally understood to be non-taxable).
last_change string A timestamp of the last time the Portfolio’s information was updated.
nickname string A descriptive name for the Portfolio. While there is a nickname taken from the financial institution, this field may be overriden by end users.
owner_type string The ownership type of the Portfolio. Possible values are “Individual Account”, “Joint Account”, and “Trust Account.”
portfolio_category string A grouping of the Portfolio according to broader industry attributes, as identified by Quovo. Possible values include “Banking”, “Investment”, “Insurance”, and “Loan”. Categories can have multiple corresponding Portfolio types, while Portfolio types can only have one category. See here for a full mapping of portfolio_type to portfolio_category.
portfolio_name string The full Portfolio “name” as found at the financial institution. This field often contains the full account number. Note: Because of the sensitive nature of Users’ financial institution account numbers, the portfolio_name field is obfuscated by default. It may be unobfuscated upon request.
portfolio_type string The type of Portfolio as identified by Quovo, based on its holdings, transactions, and tax eligibility. This value may also be overridden by the end user. Possible values for portfolio_type include “Checking”, “401k”, “IRA”, and more. See here for a full list of values.
portfolio_type_confidence string The level of confidence in the accuracy of the portfolio_type. Confidence levels are split into four tiers: “Very High”, “High”, “Moderate”, and “Low”. This value can be used to decide whether you should use the portfolio_type, or ignore it due to its low confidence level.
update_count integer The total number of times the Portfolio has been successfully updated. Unlike Accounts, Portfolios will only be updated if there was a successful sync.
user integer The Quovo User the Portfolio and its Account belong to.
username string The username of the associated Quovo User.
value decimal The total sum value of all Positions within the Portfolio. This value is calculated after any good sync completes. Because of intraday price updates, it may be best to calculate the Portfolio’s value manually by fetching the Portfolio’s Positions and summing their individual values.

Get Positions

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/users/523479/positions"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
  "positions": [
    {
      "account": 878797,
      "asset_class": "Cash",
      "cost_basis": null,
      "cost_basis_type": null,
      "currency": null,
      "cusip": "ECP998015",
      "fxrate": 1.0,
      "id": 240356232,
      "last_purchase_date": null,
      "market_code": "CUR",
      "portfolio": 750018,
      "portfolio_name": "***ount",
      "price": 1.0,
      "quantity": 2467.23,
      "sector": null,
      "security_type": "Cash",
      "security_type_confidence": "Very High",
      "ticker": "CUR:USD",
      "ticker_name": "U S Dollar",
      "user": 523479,
      "username": "quovo_myfirstuser",
      "value": 2467.23
    }
  ]
}

GET https://api.quovo.com/v2/users/523479/positions

Description

Fetches all of a User’s Positions, across all of their Portfolios.

Request Parameters

Name Type Description
cursor integer This parameter is used for paginated results as a pointer to the next set of Positions. Review the Pagination section in the Introduction to learn more about paginated results.
count integer The max number of Positions you would like to return for this request.

Response Fields

Name Type Description
account integer The Quovo Account that the associated Portfolio belongs to.
asset_class string The asset class of the associated security. Note: Some securities may have similar security types and asset classes (such as cash), while others will be quite different (such as ETFs and Mutual Funds) For a list of all available asset classes, see the Asset Classes section.
cost_basis decimal The total cost basis value of the Position (this parameter is not given on a per-share basis).
cost_basis_type string The source of the cost basis value. Possible values are “brokerage”, “quovo-complete”, and “quovo-incomplete”. “brokerage” indicates the cost basis comes directly from the financial institution. “quovo-complete” means we calculated cost basis based on fully available Position history, while “quovo-incomplete” means we calculated the value with only partial Position history available.
currency string An ISO 4217 code for Positions in foreign currencies. currency will be null for any security priced in USD.
cusip string The 9-character CUSIP indentifier. Note: this may not be available for all securities, and may return null for some Positions.
fxrate decimal The foreign exchange rate used to translate any foreign currency into USD. This rate will be 1.00 for any Position priced in USD. To view all prices and values in their local currency, divide price and value by the fxrate (price / fxrate == local_price).
id integer A unique Quovo identifier for the Position. Note: IDs will change on every successful sync, so do not use IDs to track Quovo Positions.
last_purchase_date string The date of the last time this security was purchased in this Portfolio.
market_code string The short name of the stock exchange or market where the security is traded, e.g., “NYE” or “NSD”.
portfolio integer The Quovo Portfolio the Position belongs to.
portfolio_name string The full Portfolio name as found at the financial institution.
price decimal The price per unit of this Position, either retrieved from the Quovo security master or as reported by the financial institution.
quantity decimal The number of units of this Position, as reported by the financial institution.
sector string The industry sector for equities, e.g., “Technology” or “Industrials.” For a list of all available sectors, check the Sectors section.
security_type string The type of the associated security, e.g., “Equity” or “Bond.” For a list of all available security types, check the Security Types section.
security_type_confidence string The level of confidence in the accuracy of the security_type. Confidence levels are split into four tiers: “Very High”, “High”, “Moderate”, and “Low”. This value can be used to decide whether you should use the security_type, or ignore it due to its low confidence level.
ticker string The public symbol for the relevant security in the Position. Quovo uses several fallback identifiers when the ticker is unavailable: if a CUSIP is specified, it will be used instead; if the security is unique to a specific institution, the ticker will have a prefix of FI: to identify it as such (e.g., “FI:SVF-N”); if we are unable to identify the relevant security, the ticker will have a prefix of UN: (e.g., “UN:0000E3C9”). Any cash Position will use a ticker of CUR:USD.
ticker_name string The name of the associated security.
user integer The Quovo user the Portfolio and Account belong to.
username string The username of the associated Quovo user.
value decimal The total value of the Position.

Request a Brokerage

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e"  -H "Content-Type: application/json" -d '{"username": "testusername", "password": "testpassword", "brokerage_name": "U.S. Bank", "brokerage_url": "usbank.com"}' "https://api.quovo.com/v2/users/523479/requests"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 204 No Content

Description

Requests a new financial institution for Quovo to retrieve data from.

Request Parameters

Name Type Description
brokerage_name* string The name of the requested Brokerage.
brokerage_url* string The URL of the requested Brokerage; ideally the full URL where the end user actually logs in to view their account data.
username* string The end user’s login username; the same one they use to login directly on their institution’s website.
password* string The end user’s login password; the same one they use to login directly on their institution’s website.

Check TOU Acceptance

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/users/162703/terms_of_use"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
  "terms_of_use": {
    "accepted": false,
    "user": 162703
  }
}

GET https://api.quovo.com/v2/users/{user_id}/terms_of_use

Description

Check whether or not a User has accepted Quovo’s Terms of Use.

Response Fields

Name Type Description
accepted boolean true if a User has accepted the Terms of Use.
user integer The Quovo User associated with this Terms of Use agreement.

Update User TOU

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"accepted": false}' "https://api.quovo.com/v2/users/162703/terms_of_use"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
  "terms_of_use": {
    "accepted": true,
    "user": 162703
  }
}

PUT https://api.quovo.com/v2/users/{user_id}/terms_of_use

Description

Update whether or not a User has accepted Quovo’s Terms of Use.

Request Parameters

Name Type Description
accepted boolean If the User has accepted the Terms of Use, pass true.

Response Fields

Name Type Description
accepted boolean true if a User has accepted the Terms of Use.
user integer The Quovo User associated with this Terms of Use agreement.

/webhooks

Webhooks are custom HTTP callbacks. They allow you to subscribe to specific “events” and receive a related JSON payload at a specified URL every time that “event” happens. For example, you can subscribe to Account events and get notified every time a user adds a new Account.

The available events for webhooks are:

Event Description
account Receive a payload anytime an Account is created or deleted.
sync Triggers when an Account sync starts, progresses, or completes. Note: this only applies to syncs that are initiated from the API or iframe.
portfolios Receive a payload when an Account’s portfolios are updated. This event fires before a sync completely finishes, sending updated portfolio balances without waiting for positions and transactions to fully load. Note: this only applies to syncs that are initiated from the API or iframe.
request Receive a payload anytime a user submits a request for a new financial institution.

To see how to verify incoming webhook payloads, look at our webhook workflow section.

Get all Webhooks

curl -X GET -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" "https://api.quovo.com/v2/webhooks"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 200 OK
{
  "webhooks": [
    {
      "events": [
        "*"
      ],
      "is_active": true,
      "name": "main_webhook",
      "url": "https://quovo.com/webhooks"
    }
  ]
}

GET https://api.quovo.com/v2/webhooks

Description

Retrieve your registered webhooks. Note: secret is intentionally omitted from all GET requests. It is only returned after being updated or after a new webhook is created.

Response Fields

Name Type Description
events array A list of subscribed events. This may also just contain ["*"], which indicates the webhook is subscribed to all events.
is_active boolean Whether the webhook is enabled or not.
name string A unique name for the webhook.
url string The URL the webhook will POST data to. The given endpoint must follow HTTPS protocol.

Register a New Webhook​

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"name": "main_webhook", "url": "https://quovo.com/webhooks", "secret": "mysupersecretsecret"}' "https://api.quovo.com/v2/webhooks"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
  "webhook": {
    "events": [
      "*"
    ],
    "is_active": true,
    "name": "main_webhook",
    "secret": "mysupersecretsecret",
    "url": "https://quovo.com/webhooks"
  }
}

POST https://api.quovo.com/v2/webhooks

Description

Used to register new webhooks.

Request Parameters

Name Type Description
events array A list of events you want to subscribe to. Defaults to ["*"], which means the webhook is subscribed to all events.
is_active boolean Whether the webhook is enabled or not. Pass false if you do not want the webhook to immediately start watching for events.
secret* string The string used to calculate the signature on each webhook delivery. This signature verifies incoming payloads are actually coming from Quovo, and not a third party.
name* string A unique name for the webhook. Note: This is used to identify webhooks, so it cannot be modified after the webhook is created.
url* string The URL the webhook should POST data to. The given endpoint must follow HTTPS protocol.

Response Fields

Name Type Description
events array A list of subscribed events. This may also just contain ["*"], which indicates the webhook is subscribed to all events.
is_active boolean Whether the webhook is enabled or not.
name string A unique name for the webhook.
secret string The string used to calculate the signature on each webhook delivery.
url string The URL the webhook will POST data to. The given endpoint must follow HTTPS protocol.

Modify a Webhook

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"name": "main_webhook", "secret": "mynewsecret"}' "https://api.quovo.com/v2/webhooks"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 200 OK
{
  "webhook": {
    "events": [
      "*"
    ],
    "is_active": true,
    "name": "main_webhook",
    "secret": "mynewsecret",
    "url": "https://quovo.com/webhooks"
  }
}

PUT https://api.quovo.com/v2/webhooks

Description

Used to update an existing webhook.

Request Parameters

Name Type Description
events array A list of events you want to subscribe to. Defaults to ["*"], which means the webhook is subscribed to all events.
is_active boolean Whether the webhook is enabled or not. Pass false if you do not want the webhook to be watching for events.
secret string The string used to calculate the signature on each webhook delivery. This signature verifies incoming payloads are actually coming from Quovo, and not a third party.
name* string The name of the webhook you would like to update.
url string The URL the webhook should POST data to. The given endpoint must follow HTTPS protocol.

Response Fields

Name Type Description
events array A list of subscribed events. This may also just contain ["*"], which indicates the webhook is subscribed to all events.
is_active boolean Whether the webhook is enabled or not.
name string A unique name for the webhook.
secret string The string used to calculate the signature on each webhook delivery. Note: this is only returned after being modified in a PUT request. It will not appear otherwise.
url string The URL the webhook will POST data to. The given endpoint must follow HTTPS protocol.

Delete a Webhook

curl -X DELETE -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"name": "main_webhook"}' "https://api.quovo.com/v2/webhooks"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Status: 204 No Content

DELETE https://api.quovo.com/v2/webhooks

Description

Deletes an existing webhook.

Request Parameters

Name Type Description
name* string The name of the webhook you would like to delete.

Workflows - Basic

Getting started

The Quovo Aggregation API

All Quovo API requests should use the base URL https://api.quovo.com/v2.

HTTP Errors (i.e., 401, 403)

Any non-200-level HTTP status codes represent an error or authentication error specific to the API itself. They will not relate to Account or Portfolio-specific issues; those have specific codes and values within the API, and relevant requests will still return an HTTP status code of 200.

API Username & Password

These credentials are used to generate and manage access tokens for API calls. Note: your API user credentials are not the same as User-level Account credentials (i.e., the credentials that your end users use to sync outside financial account data to Quovo). Your API username and password are given to you directly by Quovo. If you have not received these API credentials directly from us, you cannot generate access tokens and cannot make any other calls to the API.

Tokens

An access token is your key to all subsequent API calls. This token authenticates your API user without having to send API user credentials in every request. It is what will be referenced at the start of an API call (in the header) to access your data. When sending the token in the header, only pass along the token itself (which should look like a string of numbers and letters), not the entire token JSON object.

Test Brokerages

There are several test Brokerages that can help you test your syncing workflows. None of them require actual account credentials, so you can ensure your syncing process works correctly without using any personal information. For this sample workflow, we will use Brokerage 21534, which is the “Test Data Brokerage”. Accounts synced to this fake institution will yield several sample holdings and historical transactions.

You can view a full list of test institutions here.

Postman

In addition to the curl examples alongside each workflow step, we have also provided a corresponding Postman collection containing an API call for each step. Postman is a tool that helps generate and test API calls by providing a clean interface to build and save HTTP requests, and to check and test API responses. Find out more about accessing the Quovo API using Postman here.

DOWNLOAD POSTMAN WORKFLOWS

1. Get an access Token

Curly braces { } represent variables and should not be included in the actual request

* Note that all API calls and parameters can be viewed in the base API collection sections of this documentation. The below instructions are provided as a sample workflow and are by no means comprehensive.

curl -X POST --user "my_api_username:my_api_password" -H "Content-Type: application/json" -d '{"name": "main_token"}' "https://api.quovo.com/v2/tokens"
{
    "access_token": {
        "created": "2016-03-30T20:28:47Z",
        "expires": "2016-03-30T21:28:47Z",
        "name": "main_token",
        "token": "c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613"
    }
}

The access token is used to authenticate all subsequent calls to the API

Send your API user credentials in a POST call to https://api.quovo.com/v2/tokens

Check the response body for your newly created access token. We can see in the sample response our token is c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613.

2. Create a User

curl -X POST -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" -H "Content-Type: application/json" -d '{"username": "example_username", "name": "Example User", "email": "example.user@quovo.com"}' "https://api.quovo.com/v2/users"
{
    "user": {
        "email": "example.user@quovo.com",
        "id": 524162,
        "name": "Example User",
        "phone": null,
        "username": "example_username",
        "value": null
    }
}

Send a POST request to https://api.quovo.com/v2/users

Note your newly created Quovo User’s ID. In our example it’s 524162.

3. Create an Account

curl -X POST -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" -H "Content-Type: application/json" -d '{"brokerage": 21534, "username": "testusername", "password": "testpass"}' "https://api.quovo.com/v2/users/524162/accounts"
{
    "account": {
        "brokerage": 21534,
        "brokerage_name": "Test Data Brokerage",
        "config_instructions": null,
        "failures": 0,
        "id": 880542,
        "is_inactive": false,
        "last_good_sync": null,
        "opened": "2016-03-30T16:49:45.780",
        "nickname": null,
        "status": null,
        "updated": "2016-03-30T16:49:45.780",
        "update_count": 0,
        "user": 524162,
        "username": "example_username",
        "value": null
    }
}

Accounts represent a single login or connection to a financial institution, owned by one of your Users.

Send a POST request to https://api.quovo.com/v2/users/{user_id}/accounts. Use the User ID you created in the previous step for {user_id}.

Note the id of your newly created Account. In our example it’s 880542.

4. Sync an Account

curl -X POST -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/880542/sync"
{
    "sync": {
        "account": 880542,
        "has_realtime": false,
        "progress": {
            "message": "queued",
            "percent": 0.0,
            "state": "queued"
        },
        "status": "syncing"
    }
}
curl -X GET -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/880542/sync"
{
    "sync": {
        "account": 880542,
        "has_realtime": false,
        "progress": {
            "message": "authenticating",
            "percent": 0.10,
            "state": "authenticating"
        },
        "status": "syncing"
    }
}
{
    "sync": {
        "account": 880542,
        "has_realtime": false,
        "progress": null,
        "status": "good"
    }
}

Syncs are an ongoing update attempt on an Account

Send a POST request to https://api.quovo.com/v2/accounts/{account_id}/sync. Use the Account ID you created in the previous step for {account_id}.

Then, check the status of your new sync by calling GET https://api.quovo.com/v2/accounts/{account_id}/sync.

Repeatedly using the GET call will update us on the syncing progress in real time. Eventually, our GET call return a final Account status of “good”, with a progress of null. This signifies the end of our sync.

5. Get Portfolios

curl -X GET -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/880542/portfolios"
{
    "portfolios": [
        {
            "account": 880542,
            "brokerage": 21534,
            "brokerage_name": "Test Data Brokerage",
            "description": null,
            "id": 752963,
            "is_inactive": false,
            "is_taxable": true,
            "last_change": "2016-03-30T16:52:39.023",
            "nickname": null,
            "owner_type": "Individual Account",
            "portfolio_category": "Investment",
            "portfolio_name": "Investment Account",
            "portfolio_type": "Brokerage Account",
            "portfolio_type_confidence": "High",
            "update_count": 0,
            "user": 524162,
            "username": "example_username",
            "value": 73479.096133
        }
    ]
}

Portfolios are the sub-accounts found within a financial institution login. These are automatically created by Quovo after an initial Account sync.

Make a GET request to https://api.quovo.com/v2/accounts/{account_id}/portfolios. Use the same Account ID you used in the previous steps for {account_id}.

Note the returned Portfolio IDs. In this case, we only have one Portfolio with the ID 752963.

6. Get Positions and History

curl -X GET -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/portfolios/752963/positions"
{
    "positions": [
        {
            "account": 880542,
            "asset_class": "Micro Cap Equity",
            "cost_basis": null,
            "cost_basis_type": null,
            "currency": null,
            "cusip": "09227Q100",
            "fxrate": 1,
            "id": 242964657,
            "last_purchase_date": "2015-12-14",
            "market_code": "NSD",
            "portfolio": 752963,
            "portfolio_name": "***ount",
            "price": 62.69,
            "quantity": 105,
            "sector": null,
            "security_type": "Equity",
            "security_type_confidence": "Very High",
            "ticker": "BLKB",
            "ticker_name": "Blackbaud Inc.",
            "user": 524162,
            "username": "example_username",
            "value": 6582.45
        },
        {
            "account": 880542,
            "asset_class": "Micro Cap Equity",
            "cost_basis": null,
            "cost_basis_type": null,
            "currency": null,
            "cusip": "05566U108",
            "fxrate": 1,
            "id": 242964658,
            "last_purchase_date": "2016-03-07",
            "market_code": "NSD",
            "portfolio": 752963,
            "portfolio_name": "***ount",
            "price": 21.27,
            "quantity": 646.263730008,
            "sector": null,
            "security_type": "Equity",
            "security_type_confidence": "Very High",
            "ticker": "BOFI",
            "ticker_name": "BofI Holding Inc.",
            "user": 524162,
            "username": "example_username",
            "value": 13746.02953727
        }
    ]
}
curl -X GET -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/portfolios/752963/history"
{
    "history": [
        {
            "account": 880542,
            "currency": null,
            "cusip": null,
            "date": "2016-03-17",
            "expense_category": null,
            "fees": 0,
            "fxrate": 1,
            "id": 202417758,
            "is_cancel": false,
            "is_pending": false,
            "memo": "sell stock",
            "portfolio": 752963,
            "price": 10.2989521524,
            "quantity": -480,
            "ticker": "WCIIX",
            "ticker_name": "WF Conservative Income Fund - Inst",
            "tran_category": "S",
            "tran_type": "SELL",
            "user": 524162,
            "value": 4943.49703314
        },
        {
            "account": 880542,
            "currency": null,
            "cusip": "G0692U109",
            "date": "2015-10-07",
            "expense_category": null,
            "fees": 0,
            "fxrate": 1,
            "id": 202417759,
            "is_cancel": false,
            "is_pending": false,
            "memo": "sell stock",
            "portfolio": 752963,
            "price": 56.4934812518,
            "quantity": 0,
            "ticker": "AXS",
            "ticker_name": "AXIS Capital Holdings Ltd",
            "tran_category": "S",
            "tran_type": "SELL",
            "user": 524162,
            "value": 0
        }
    ]
}

Positions and History are the holdings and transactions found within your Portfolios.

To fetch Positions for a single Portfolio, call GET https://api.quovo.com/v2/portfolios/{portfolio_id}/positions. Use the Portfolio ID you discovered in the previous step. In our case, it’s 752963.

To fetch History for a Portfolio, call GET https://api.quovo.com/v2/portfolios/{portfolio_id}/history, using the same Portfolio ID.

Workflows - MFA

Multifactor Authentication (MFA) is the process of verifying a login with credentials beyond just a username and password. Often this process takes the form of client-selected questions such as “What was your first car?”“ or "In what city were you born?”“

For this workflow example, we assume that an access token has been generated and a User has been created. For information on these steps see these workflows. For ease, we will not mention passing the access token with each request, but make sure to do so in your actual requests.

1. Create an Account

curl -X GET -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/"
{
    "account": {
        "brokerage": 19817,
        "brokerage_name": "Test Sync (Questions)",
        "config_instructions": null,
        "failures": 0,
        "id": 880604,
        "is_inactive": false,
        "last_good_sync": null,
        "nickname": null,
        "opened": "2016-03-30T17:46:46.353",
        "status": null,
        "update_count": 0,
        "updated": "2016-03-30T17:46:46.353",
        "user": 524162,
        "username": "example_username",
        "value": null
    }
}

Create an Account on our test MFA Brokerage

Send a POST request to https://api.quovo.com/v2/users/{user_id}/accounts

2. Initiate a Sync

curl -X POST -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/880604/sync"
{
    "sync": {
        "account": 880604,
        "has_realtime": false,
        "progress": {
            "message": "queued",
            "percent": 0.0,
            "state": "queued"
        },
        "status": "syncing"
    }
}

Initiate a sync on the newly created Account

Send a POST request to https://api.quovo.com/v2/accounts/{account_id}/sync.

3. Check the sync status

curl -X GET -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/880604/sync"
{
    "sync": {
        "account": 880604,
        "has_realtime": false,
        "progress": null,
        "status": "questions"
    }
}

Check the ongoing sync progress

Check the status of your new sync by calling GET https://api.quovo.com/v2/accounts/{account_id}/sync.

4. Get MFA questions

curl -X GET -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/880604/challenges"
{
    "challenges": [
        {
            "account": 880604,
            "id": 60611,
            "is_answered": false,
            "last_asked": true,
            "should_answer": true,
            "type": "question",
            "question": "How are you?"
        }
    ]
}

Get the Account’s MFA questions

Now that the Account has finished syncing and has a status of “questions,” you need to retrieve and answer the newly added MFA Challenges.

Send a GET request to https://api.quovo.com/v2/accounts/{account_id}/challenges.

5. Answer MFA questions

curl -X PUT -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613"  -H "Content-Type: application/json" -d '{"answer": "great"}' "https://api.quovo.com/v2/challenges/60611"
{
    "challenge": {
        "account": 880604,
        "id": 60611,
        "is_answered": true,
        "last_asked": true,
        "should_answer": false,
        "type": "question",
        "question": "How are you?"
    }
}

Answering the Account’s MFA questions

To answer a Challenge, you have to send a PUT request to https://api.quovo.com/v2/challenges/{challenge_id}.

For our test Brokerage, the correct answer to the Challenge is “great”.

6. Initiate Another Sync

curl -X POST -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/880604/sync"
{
    "sync": {
        "account": 880604,
        "has_realtime": false,
        "progress": {
            "message": "queued",
            "percent": 0.0,
            "state": "queued"
        },
        "status": "syncing"
    }
}

Initiate a another sync on the Account

The Challenge is answered now. In order to see if it has been correctly answered, you need to initiate another sync on the Account.

Send another POST to https://api.quovo.com/v2/accounts/{account_id}/sync to trigger a new sync.

7. Check the sync status

curl -X GET -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/880604/sync"
{
    "sync": {
        "account": 880604,
        "has_realtime": false,
        "progress": {
          "message": "fetching history",
          "percent": 0.5,
          "state": "fetching_history"
        },
        "status": "syncing"
    }
}
curl -X GET -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/880604/sync"
{
    "sync": {
        "account": 880604,
        "has_realtime": false,
        "progress": null,
        "status": "good"
    }
}

Check the sync status of the Account (again)

Now check the sync status by calling GET https://api.quovo.com/v2/accounts/{account_id}/sync.

If you get another “questions” Account status, there are either additional MFA questions that have been discovered, or you have incorrectly answered the first MFA question. In either case, you will need to repeat steps 4 and 5.

If you get a “good” status, then the Account was successfully synced! You can now check out the Positions and History retrieved during the sync.

Workflows - Real-time MFA

Real-time MFA questions are becoming increasingly popular as additional security protocols on financial institution websites. This section describes how to sync an Account that utilizes real-time MFA. Real-time MFA is a bit more involved than typical MFA questions.

For this workflow example, we assume that an access token has been generated, a User has been created, and a real-time Account has been created for the User. For information on these steps see the basic API workflow. For ease, we will not mention passing the access token with each request, but make sure to do so in your actual requests.

Answer the Pre-real-time Challenge

{
    "challenges": [
        {
            "account": 881205,
            "choices": [
                {
                    "category": "Voice",
                    "value": "(xxx) xxx-1111"
                },
                {
                    "category": "Voice",
                    "value": "(xxx) xxx-2222"
                },
                {
                    "category": "Text",
                    "value": "(xxx) xxx-1111"
                },
                {
                    "category": "Text",
                    "value": "(xxx) xxx-2222"
                },
                {
                    "category": "Email",
                    "value": "f******k@fake.com"
                },
                {
                    "category": "Email",
                    "value": "n****b@aol.com"
                }
            ],
            "id": 62701,
            "is_answered": false,
            "last_asked": true,
            "question": "Your brokerage requires that you enter a temporary PIN number sent to you by one of the following methods:",
            "should_answer": true,
            "type": "prerealtime"
        }
    ]
}

Several institutions have a pre-real-time Challenge that needs to be answered before the actual real-time process begins. This is especially common with two-factor authentication, where the institution sends a temporary PIN number or access code to the end user. The pre-real-time Challenge for two-factor authentication involves choosing how that access code should be sent, whether by text or email.

There is nothing special about pre-real-time Challenges compared to basic MFA Challenges. They simply warn you that a real-time Challenge will appear after answering the pre-real-time question. That said, not all real-time Challenges will be preempted by a pre-real-time Challenge. Some institutions will immediately send an access code, forgoing the prompt to decide how the code should be sent. Others require solving a CAPTCHA before the sync can continue successfully. In these scenarios, the real-time Challenge will appear on the Account without any prior warning. You should therefore be prepared to handle a real-time Challenge on any sync, regardless if there was a pre-real-time Challenge or not.

Our test Brokerage for real-time MFA does include a pre-real-time Challenge. Answer it as you would any basic MFA Challenge (see the Basic MFA section to review that workflow). Our example real-time workflow starts after the pre-real-time Challenge has been answered.

1. Start the sync

curl -X POST -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/881205/sync"
{
    "sync": {
        "account": 881205,
        "has_realtime": false,
        "progress": {
            "message": "queued",
            "percent": 0.0,
            "state": "queued"
        },
        "status": "syncing"
    }
}

Initiate a sync on the Account

Let’s start the syncing process. Make a POST call to https://api.quovo.com/v2/accounts/{account_id}/sync.

2. Check for realtime

curl -X GET -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/881205/sync"
{
    "sync": {
        "account": 881205,
        "has_realtime": false,
        "progress": {
            "message": "authenticating",
            "percent": 0.10,
            "state": "authenticating"
        },
        "status": "syncing"
    }
}
{
    "sync": {
        "account": 881205,
        "has_realtime": true,
        "progress": {
            "message": "authenticating (real-time)",
            "percent": 0.17,
            "state": "authenticating"
        },
        "status": "syncing"
    }
}

While checking the ongoing process of the sync, make sure to look for real-time

To see the ongoing sync progress, call GET https://api.quovo.com/v2/accounts/{account_id}/sync.

While tracking the progress of the sync, you should also check if there are any real-time Challenges. If has_realtime is true, the Account has real-time MFA Challenges that need answering.

3. Get Real-time MFA

curl -X GET -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/881205/challenges"
{
    "challenges": [
        {
            "account": 881205,
            "choices": [
                {
                    "category": "Voice",
                    "value": "(xxx) xxx-1111"
                },
                {
                    "category": "Voice",
                    "value": "(xxx) xxx-2222"
                },
                {
                    "category": "Text",
                    "value": "(xxx) xxx-1111"
                },
                {
                    "category": "Text",
                    "value": "(xxx) xxx-2222"
                },
                {
                    "category": "Email",
                    "value": "f******k@fake.com"
                },
                {
                    "category": "Email",
                    "value": "n****b@aol.com"
                }
            ],
            "id": 62701,
            "is_answered": true,
            "last_asked": false,
            "question": "Your brokerage requires that you enter a temporary PIN number sent to you by one of the following methods:",
            "should_answer": false,
            "type": "prerealtime"
        },
        {
            "account": 881205,
            "id": 62712,
            "is_answered": false,
            "last_asked": true,
            "question": "Your brokerage will contact you through your preferred option. Enter the PIN once you've received it:",
            "should_answer": true,
            "type": "realtime"
        }
    ]
}

Fetch the Account’s MFA questions

This process will be similar to the Basic MFA workflow.

Send a GET request to https://api.quovo.com/v2/accounts/{account_id}/challenges.

You will get back a challenges array with all of the MFA questions associated with the Account. To find the real-time Challenge, search for the Challenge with a type of “realtime”. Alternatively, you can rely on the should_answer flag to determine which MFA Challenge to display, which in this case will still be the real-time MFA question.

4. Answer Real-time MFA

curl -X PUT -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613"  -H "Content-Type: application/json" -d '{"answer": "1234"}' "https://api.quovo.com/v2/challenges/62712"
{
    "challenges": [
        {
            "account": 881205,
            "choices": [
                {
                    "category": "Voice",
                    "value": "(xxx) xxx-1111"
                },
                {
                    "category": "Voice",
                    "value": "(xxx) xxx-2222"
                },
                {
                    "category": "Text",
                    "value": "(xxx) xxx-1111"
                },
                {
                    "category": "Text",
                    "value": "(xxx) xxx-2222"
                },
                {
                    "category": "Email",
                    "value": "f******k@fake.com"
                },
                {
                    "category": "Email",
                    "value": "n****b@aol.com"
                }
            ],
            "id": 62701,
            "is_answered": true,
            "last_asked": false,
            "question": "Your brokerage requires that you enter a temporary PIN number sent to you by one of the following methods:",
            "should_answer": false,
            "type": "prerealtime"
        },
        {
            "account": 881205,
            "id": 62712,
            "is_answered": true,
            "last_asked": true,
            "question": "Your brokerage will contact you through your preferred option. Enter the PIN once you've received it:",
            "should_answer": false,
            "type": "realtime"
        }
    ]
}

Answer the Real-time MFA Challenge

To answer the Challenge, send a PUT request to https://api.quovo.com/v2/challenges/{challenge_id}.

For the real-time test Brokerage, the correct answer is “1234”.

5. Check the Sync Progress

curl -X GET -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/accounts/881205/sync"
{
    "sync": {
        "account": 881205,
        "has_realtime": false,
        "progress": {
            "message": "fetching portfolios",
            "percent": 0.30,
            "state": "fetching_portfolios"
        },
        "status": "syncing"
    }
}
{
    "sync": {
        "account": 881205,
        "has_realtime": false,
        "progress": null,
        "status": "good"
    }
}

Go back to checking the sync progress to see if the MFA answer was correct

Again, call GET https://api.quovo.com/v2/accounts/{account_id}/sync to check the ongoing sync progress.

If the real-time answer was correct, the sync will continue and begin fetching data for the Account. It should eventually complete with a status of “good”, indicating the Account was succesfully synced.

Workflows - Iframe

The Quovo iframe widget provides API users a ready-made solution for syncing and Account management. While you will not have the same level of control as syncing and managing Accounts directly through the API, you can use the iframe widget to quickly deploy an Account dashboard and avoid managing the various edge cases that may occur while syncing new Accounts.

We are assuming that an access token has already been generated. For info on these steps see the basic API workflow. For ease, we will not mention passing the access token with each request, but make sure to do so in your actual requests.

1. Create a User

curl -X POST -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" -H "Content-Type: application/json" -d '{"username": "example_username", "name": "Example User", "email": "example.user@quovo.com"}' "https://api.quovo.com/v2/users"
{
    "user": {
        "email": "example.user@quovo.com",
        "id": 524162,
        "name": "Example User",
        "phone": null,
        "username": "example_username",
        "value": null
    }
}

To use the iframe, you’ll need a valid Quovo user

Let’s create one:

After sending the request, be sure to check the response body for the newly created user’s id.

2. Create an iframe token

curl -X POST -H "Authorization: Bearer c8c96ba4cee33ad6f81bdd36a700b39e20eaec97f4eb6d0a5e1da4f45694f613" "https://api.quovo.com/v2/users/524162/iframe_token"
{
    "iframe_token": {
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvbmVfdGltZV91c2UiOnRydWUsImlwX3Jlc3RyaWN0ZWQiOmZhbHNlLCJzdWIiOiI1MjQxNjIiLCJleHAiOjE0ODQ5NTI0MDEsImlwIjoiMTI3LjAuMC4xIiwiaWF0IjoxNDg0OTQ4ODAxLCJ0eXBlIjoiaWZyYW1lIiwiaWQiOiI1ZjNkNGQ1YTgwNTZiYzQzZjY2ZjlhM2Y4ODE2YmM3ZDhjNzkyY2JlIiwidXNlciI6NTI0MTYyfQ.yfGCF80vbuEvrZJ9sQ60SVNCVkaGA4s7p-NCK_VAW3o",
        "user": 524162
    }
}

Create a single-use iframe token for this user

To create an iframe token, send a POST request to https://api.quovo.com/v2/users/{user_id}/iframe_token, where {user_id} is the ID of the user you just created.

From that request, you will receive the iframe_token object, which will contain your iframe access token.

3. Use the iframe

https://embed.quovo.com/auth/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvbmVfdGltZV91c2UiOnRydWUsImlwX3Jlc3RyaWN0ZWQiOmZhbHNlLCJzdWIiOiI1MjQxNjIiLCJleHAiOjE0ODQ5NTI0MDEsImlwIjoiMTI3LjAuMC4xIiwiaWF0IjoxNDg0OTQ4ODAxLCJ0eXBlIjoiaWZyYW1lIiwiaWQiOiI1ZjNkNGQ1YTgwNTZiYzQzZjY2ZjlhM2Y4ODE2YmM3ZDhjNzkyY2JlIiwidXNlciI6NTI0MTYyfQ.yfGCF80vbuEvrZJ9sQ60SVNCVkaGA4s7p-NCK_VAW3o

Login as the user through the Quovo iframe

To login as the Quovo user, simply navigate to the URL:

https://embed.quovo.com/auth/{iframe_token}

After navigating to the URL, you should see the Quovo syncing dashboard and can start syncing and managing the user’s Accounts.

4. Customize the iframe (optional)


https://embed.quovo.com/auth/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9?css=https%3A%2F%2Fexample.com%2Fassets%2Foverrides.css

Customize the iframe widget

You may want to personalize the iframe widget to better match your internal style guides. To apply custom styles to the widget, add the query parameter css to the iframe login URL. The value of the css parameter should be a URL pointing to a publicly-available CSS file, hosted on an HTTPS-enabled server.

https://embed.quovo.com/auth/{iframe_token}?css={css_url}

Your custom stylesheet will be applied after the widget’s default stylesheets load, allowing you to override any default styles you would like to customize.

https://embed.quovo.com/auth/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9?test-institutions=1

Enable test institutions

During development you may want to try out sample syncs on our available test institutions. To enable test institutions within the iframe widget, add the query parameter test-institutions with a value of 1 to the iframe login URL.

https://embed.quovo.com/auth/{iframe_token}?test-institutions=1

The tests institutions will be available on the institution search page.

https://embed.quovo.com/auth/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9?institution=21700

Preselect an Institution

If you would like a user to add an Account onto a specific institution, you can preselect an institution and bypass the search page entirely. To direct users to a specific institution, add the query parameter institution to the iframe login URL. The value of the institution parameter should be a Quovo Brokerage ID.

https://embed.quovo.com/auth/{iframe_token}?institution={brokerage_id}

The iframe widget will open on the “Enter Your Credentials” page with the institution already chosen for them.

https://embed.quovo.com/auth/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9?error-redirect=https%3A%2F%2Fexample.com%2Ferror_landing.html

Redirect to a custom error page

You may want to redirect users to a custom error page if there are any authentication errors, instead of redirecting to Quovo’s default error page. To enable custom redirects, add the query parameter error-redirect to the iframe login URL. The value of the error-redirect parameter should be the full URL of your custom error page.

https://embed.quovo.com/auth/{iframe_token}?error-redirect={error_page_url}

The iframe widget will redirect to your specificed page if it encounters any issues during login, e.g., the iframe token is invalid.

Workflows - Webhooks

{
    "account": {
        "brokerage": 2,
        "brokerage_name": "Fidelity",
        "config_instructions": null,
        "failures": 0,
        "id": 877247,
        "is_inactive": false,
        "last_good_sync": "2016-03-28T15:40:54.463",
        "nickname": null,
        "opened": "2016-03-28T15:40:54.463",
        "status": "good",
        "update_count": 11,
        "updated": "2016-03-28T15:40:54.463",
        "user": 162703,
        "username": "quovo_test_user",
        "value": 8692.926
    },
    "action": "started",
    "event": "sync",
    "sync": {
        "account": 877247,
        "has_realtime": false,
        "progress": {
            "message": "queued",
            "percent": 0.0,
            "state": "queued"
        },
        "status": "syncing"
    },
    "user": {
        "email": null,
        "id": 162703,
        "name": "Quovo Testuser",
        "phone": null,
        "username": "quovo_test_user",
        "value": 18321.23
    }
}

Webhooks are custom HTTP callbacks. They allow you to subscribe to specific “events” and receive a related JSON payload at a specified URL every time that “event” happens. For example, you can subscribe to Account events and get notified every time a user adds a new Account.

The available events for webhooks are:

Event Description
account Receive a payload anytime an Account is created or deleted.
sync Triggers when an Account sync starts, progresses, or completes. Note: this only applies to syncs that are initiated from the API or iframe.
portfolios Receive a payload when an Account’s portfolios are updated. This event fires before a sync completely finishes, sending updated portfolio balances without waiting for positions and transactions to fully load. Note: this only applies to syncs that are initiated from the API or iframe.
request Receive a payload anytime a user submits a request for a new financial institution.

Webhook payloads contain an event field, an action field, and other related object data. The action field indicates whether the Account was “created” or “deleted”; whether the sync has “started”, “progressed”, or “completed”; or whether the portfolios have been “updated”. Related object data will be very similar to the objects you fetch in the relevant GET requests (with the exception of payloads where the event is “sync” and the action is “progressed”). Due to the frequency of “sync” events and “progressed” actions, the payload’s Account and user objects will be stripped down to a few key fields, such as id and username.

1. Register a webhook

curl -X POST -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e" -H "Content-Type: application/json" -d '{"name": "main_webhook", "url": "https://quovo.com/webhooks", "secret": "mysupersecretsecret"}' "https://api.quovo.com/v2/webhooks"
Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b09e
Content-Type: application/json
Content-Type: application/json
Status: 201 Created
{
  "webhook": {
    "events": [
      "*"
    ],
    "is_active": true,
    "name": "main_webhook",
    "secret": "mysupersecretsecret",
    "url": "https://quovo.com/webhooks"
  }
}

To add a new webhook, make a POST call to https://api.quovo.com/v2/webhooks

This will create an active webhook that is subscribed to all events.

(Look at the /webhooks section for more information on registering webhooks.)

2. Verify the payload

Webhook-Event: sync
Webhook-Signature: 300f4f6efc5a3535488e6cdc5a1469e9d16f64d0
Content-Type: application/json
{"account": {"brokerage": 21700, "brokerage_name": "Test Bank Brokerage", "config_instructions": null, "failures": 0, "id": 1344470, "is_inactive": false, "last_good_sync": null, "nickname": null, "opened": "2016-12-12T17:44:04.007", "status": null, "update_count": 0, "updated": "2016-12-12T17:44:04.007", "user": 162703, "username": "quovo_test_user", "value": null}, "action": "started", "event": "sync", "sync": {"account": 1344470, "has_realtime": false, "progress": {"message": "queued", "percent": 0.0, "state": "queued"}, "status": "syncing"}, "user": {"email": null, "id": 162703, "name": "Quovo Testuser", "phone": null, "username": "quovo_test_user", "value": 342194.93}}
import hmac
from hashlib import sha1

def verify_payload(payload, secret, signature):
  hashed = hmac.new(secret, payload, sha1)
  return hmac.compare_digest(hashed.hexdigest(), signature)

Webhook payloads always contain two important header fields:

To verify a payload, calculate the signature using the payload’s body and the secret you registered with the webhook. If the signature you calculate matches the signature in the request header, the POST request was genuinely sent by Quovo.

You can check out a sample verify_payload function in Python on the right. The sample Signature was created using the secret “mysupersecretsecret”.

Data Specs

Quovo Terminology

Quovo uses a specific taxonomy for syncing financial accounts. It is important to note the difference between a Brokerage, an Account, and a Portfolio:

Brokerage

A Brokerage is a financial institution. Brokerages are usually associated with a unique URL where the end user logs in to view data about his/her financial account(s) (e.g., https://us.etrade.com/home for E*TRADE).

Account

The unique “login” or set of credentials at a specific Brokerage. A user will only have multiple E*TRADE “Accounts” if he/she has multiple sets of username and passwords at E*TRADE.

Portfolio

Any sub-account found within an Account at a Brokerage. Each Account may have multiple Portfolios attached. For example, within a specific bank Account, there might be a Portfolio for Savings, a Portfolio for Checking, and a Portfolio for a Mortgage.

Test Institutions

There are several test institutions that can help you test your syncing workflows. None of them require actual account credentials, so you can ensure your syncing process works correctly without using any personal information.

Use the GET /v2/brokerages/{brokerage_id} call to see a more in-depth description and instructions for each test Brokerage. For example, Test Sync (Questions) can either sync successfully or create an additional MFA question depending on the answer to the first MFA question.

Brokerage Name Description
19815 Test Sync (Good) Successfully syncs an Account with limited Portfolio, Positions, and History data. If you want the Account to return a status of login on a subsequent sync, change the password to “gobad”.
19816 Test Sync (Login) Returns a status of login (i.e., the Account was given incorrect credentials). Use the password “qwerty” to successfully login on a subsequent sync.
19817 Test Sync (Questions) Returns a status of questions (i.e., the Account has additional MFA questions to answer). Use the answer “great” to the first MFA question to successfully login. Use the answer “bad” to receive another MFA question. For subsequent MFA questions, use the answer “cause” to successfully login.
19818 Test Sync (Config) Returns a status of config (e.g., the Account requires the user to change a setting on the institution website). Any additional sync will login successfully.
19819 Test Sync (Postponed) Returns a status of postponed (e.g., the institution is down for maintenance). Any additional sync will login successfully.
19820 Test Sync (No Portfolio) Successfully syncs an Account with no Portfolios.
19822 Test Sync (Bad) Returns a status of bad (i.e., there were Quovo-side issues syncing the Account). Any additional sync will login successfully.
19875 Test Sync (Real-time) Returns an Account that requires completing real-time MFA to successfully sync. It does not matter which option you choose for the “where should we send the pin” question. Use “1234” for the pin number during the real-time portion.
21030 Test Sync (Multiple Choice) MFA Challenges on this Brokerage have multiple-choice options, instead of a free-form input. Select the “42” option to successfully sync an Account.
21031 Test Sync (HTML) MFA Challenges on this Brokerage require displaying an <img> element. Enter “red” to successfully sync.
21534 Test Data Brokerage Successfully syncs an Account with a randomly generated investment Portfolio containing around 7 holdings and 6 months of history. The data will be randomly generated with every subsequent sync.
21700 Test Bank Brokerage Successfully syncs an Account with a randomly generated bank Portfolio containing a cash balance and 2 months of history, with expense categories. The data will be randomly generated with every subsequent sync.
21711 Test Sync (Captcha) This Brokerage requires completing a CAPTCHA to successfully sync, which involves both displaying an <img> and completing real-time MFA. The answer to the CAPTCHA question is “3U3NTSB5”.
21989 Test Sync (Multiple Questions) Similar to “Test Sync (Questions)”, except this institution yields multiple MFA questions on the initial sync. Answer “great” to the “How are you?” question and “sunny” to the “How is the weather?” question to successfully login.
22167 Test Institution Multiple Portfolios Similar to both “Test Data Brokerage” and “Test Bank Brokerage”, except this institution returns an Account with multiple portfolios of various portfolio types. Possible portfolio types include “401k”, “IRA”, “Brokerage Account”, “Checking”, “Savings”, “Mortgage”, and “Credit Card”. The number of portfolios is randomly generated during the initial sync, and the transactions within each portfolio are randomly generated on every subsequent sync.

Account Statuses

Account syncs can end with a wide variety of final statuses. Below are the various status codes, their descriptions, and whether the status requires any action by the end user. Note: An Account’s current status is always the last updated status from a sync; it is only updated at the end of a sync attempt.

Status Description Requires User Action
good The Account was properly synced. False
login The credentials for the Account are incorrect. True
questions There are additional MFA Challenges that need to be answered. True
config The institution requires the end user to log into their Account and resolve an issue. These instructions are institution-specific, and can be found in config_instructions on an Account object. True
postponed The institution is inaccessible at the moment. Quovo will attempt another sync at the end of the day. False
bad There were Quovo-side issues while syncing the Account. False
no portfolio There were no Portfolios found within the Account. False
unavailable Quovo cannot currently get data from the institution and does not have a timeline for restoring connectivity. False
(null value) The Account was created, but no sync attempt has ever been made. False

Challenge Types

The different MFA Challenge types represent the different workflows or display options you will need to support for syncing all Accounts. While most MFA Challenges only require displaying the question (“question” type), some institutions have different requirements. Note: Institutions regularly change their methods for credential authentication, so this list may change over time, and Challenge types may change even at the same institution.

Type Description
choices A multiple-choice MFA Challenge. Display the choices found in the choices field of the Challenge object to the end user. When answering “choices” MFA, you can either send the index of the choice (starting at index 0), or the full choice object.
image An MFA Challenge that has an associated image to display. Check the image field in the Challenge object for the image URL or data URI.
image_choices A combination of “choices” and “image”. There are multiple images to display, while the end user should only select one.
prerealtime (deprecated) Indicates that there will be a “realtime” Challenge on the Account. Since some real-time MFA questions happen without warning (like CAPTCHAs), this will not preempt all real-time questions.
realtime A time-sensitive MFA Challenge. While most MFA questions can be answered at any time, real-time MFA Challenges require immediate action by the end user. See here for more details on the real-time MFA workflow.
question A typical MFA Challenge. Only the question needs to be presented to the end user.

Sync States

Sync states are the different steps that may happen during an Account sync, located in the progress.state field.

Portfolio Types

Portfolio types describe various attributes related to a Portfolio’s holdings, transactions, and tax eligibility. These types are a subset of Portfolio Categories and have a one-to-one relationship with a categorty. In cases where a given Portfolio does not have a strong type match, it will have a type of “Unknown”.

Type Category Taxable
401a Investment false
401k Investment false
403b Investment false
457b Investment false
529 Investment false
Brokerage Account Investment true
Education Savings Account Investment false
Health Reimbursement Arrangement Investment false
Health Savings Account Investment false
IRA Investment false
Minor Custodial Account Investment false
Non-Taxable Brokerage Account Investment false
Pension Investment true
Profit Sharing Plan Investment false
Roth 401k Investment false
Roth IRA Investment false
SEP IRA Investment false
Simple IRA Investment false
Stock Plan Investment false
Thrift Savings Plan Investment false
UGMA Investment false
UTMA Investment false
Variable Annuity Investment true
Certificate of Deposit Banking true
Checking Banking true
Credit Card Banking true
Savings Banking true
Annuity Insurance false
Fixed Annuity Insurance false
Insurance Insurance false
Term Life Insurance Insurance true
Universal Life Insurance Insurance true
Variable Life Insurance Insurance true
Whole Life Insurance Insurance true
Auto Loan Loan true
Loan Loan true
Mortgage Loan true
Student Loan Loan true
Alternative Other true
Limited Partnership Other true
Misc Other true
Real Estate Other true
Unknown Unknown true

Portfolio Owner Types

Transaction Categories

Within Quovo, transactions are categorized at a broad level into five different categories. While they are split further into individual transaction types, transaction categories may be useful for knowing the general kind of transaction you’re working with. Quovo defines its transaction categories by the algorithmic impact that the transaction has within calculations such as Portfolio performance or value over time.

Code Name
B Buy
C Cash
I Dividends/Interest/Fees
P Pending
S Sell
T Transfer
X Cancel

Transaction Types

Below is a list of all transaction types (or “trantypes”): their code, full name, and what transaction category they fall under.

Type Name Category
ACFE Account Fee C, I
ADFE Administrative Fee C, I, S
ADJU Adjustment I
ALFE Actuarial Fee C, I
APFE Appraisal Fee C, I
ASSN Assignment B, T
BTC Buy to Close B
BTCC Buy to Close Call B
BTCP Buy to Close Put B
BTO Buy to Open B
BTOC Buy to Open Call B
BTOP Buy to Open Put B
BUYL Buy Long B
BUYS Buy Short B
BUYX Buy Exchange B
CTFE Contract Fee C, I
CTRB Contribution B, C, I
DEPO Deposit C
DPFC Dividend Paid From Cash I
DTRB Distribution S
DV2C Dividend I
FNFE Fund Fee S
FTAX Foreign Tax C, I
FTXW Foreign Tax Withheld C, I
IP2C Interest I
IPFC Interest Paid From Cash I
IREC Interest Receivable I
ISRV Interest Reinvestment B
LG2C Long-term Capital Gain to Cash I
LGFE Legal Fee C, I
LGRV Long-term Capital Gain Reinvestment B
LPMT Loan Payment B, S
MCFE Miscellaneous Fee C, I, S
MERG Merge T
MEXP Margin Expense C, I
MGFE Management Fee C, I
NQDV Non-qualified Dividend I
NTAX Non-resident Tax C, I
PENC Pending Credit P
PEND Pending Debit P
QPC Quovo Phantom Cancel X
QUDV Qualified Dividend I
REIN Dividend Reinvestment B
RTOP Return of Principal I
SASS Sell Assigned S
SDTB Stock Distribution I
SELL Sell S
SELX Sell Exchange S
SG2C Short-term Capital Gain to Cash I
SGRV Short-term Capital Gain Reinvestment B
SPIN Spin Off T
SPLT Split T
STC Sell to Close S
STCC Sell to Close Call S
STCP Sell to Close Put S
STO Sell to Open S
STOC Sell to Open Call S
STOP Sell to Open Put S
STXW State Tax Withheld C, I
TAXW Tax Withheld C, I
TDFE Trading Fee C, I
TRFE Transfer Fee C, I
TUFE Trust Fee C, I
UG2C Unqualified Gain to Cash I
WITH Withdrawal C
XFER Transfer T
XPRD Expired T
XRCS Exercise (Option) S, T

Cancel Transactions

{
    "account": 2146993,
    "currency": null,
    "cusip": "487836108",
    "date": "2017-01-03",
    "fees": 0,
    "fxrate": 1,
    "id": 501683213,
    "is_cancel": false,
    "is_pending": false,
    "memo": "BUY KELLOGG COMPANY",
    "portfolio": 2631856,
    "price": 70.0245,
    "quantity": 10.057623,
    "ticker": "K",
    "ticker_name": "Kellogg Company",
    "tran_category": "B",
    "tran_type": "CTRB",
    "user": 871126,
    "value": -704.28
}
{
    "account": 2146993,
    "currency": null,
    "cusip": "487836108",
    "date": "2017-01-03",
    "fees": 0,
    "fxrate": 1,
    "id": 677543214,
    "is_cancel": true,
    "is_pending": false,
    "memo": "QPC CANCEL 501683213 BUY KELLOGG COMPANY",
    "portfolio": 2631856,
    "price": 70.0245,
    "quantity": -10.0576,
    "ticker": "K",
    "ticker_name": "Kellogg Company",
    "tran_category": "X",
    "tran_type": "QPC",
    "user": 871126,
    "value": 704.28
}

Cancel Transactions occur when existing transactions are substantially updated or completely removed by the financial institution.

Instead of modifying the original transaction, Quovo generates a new Cancel Transaction which reverses the original transaction. In scenarios where we cancel a transaction due to new, updated transaction details, we will send a brand new transaction with the changes. You should treat this like you would any other new transaction, without any ties to the Cancel Transaction or the original one.

A Cancel Transaction has its own unique transaction ID and includes information that allows you to identify the original transaction. Most of the Cancel Transaction’s fields will match those in the original transaction, aside from those noted below:

By negating the quantity and value fields, we can auto-reconcile the original transaction. For instance, to cancel out a buy into a security (positive quantity, negative value), the Cancel Transaction will have a negative quantity and a positive value.

Pending Transactions

{
    "account": 2146759,
    "currency": null,
    "cusip": null,
    "date": "2017-04-11",
    "fees": 0,
    "fxrate": 1,
    "id": null,
    "is_cancel": false,
    "is_pending": true,
    "memo": "AT&T BILL PAYMENT",
    "portfolio": 2631502,
    "price": 0,
    "quantity": 0,
    "ticker": "",
    "ticker_name": null,
    "tran_category": "P",
    "tran_type": "PEND",
    "user": 871126,
    "value": -67.22
}
{
    "account": 2146759,
    "currency": null,
    "cusip": null,
    "date": "2017-04-11",
    "fees": 0,
    "fxrate": 1,
    "id": null,
    "is_cancel": false,
    "is_pending": true,
    "memo": "Payment",
    "portfolio": 2631502,
    "price": 0,
    "quantity": 0,
    "ticker": "",
    "ticker_name": null,
    "tran_category": "P",
    "tran_type": "PENC",
    "user": 871126,
    "value": 290.81
}

Pending transactions are cash transactions that have not yet settled in a bank account. Investment transactions that settle after their trade date (“T+3”) for example, are not included in this definition.

Since pending transactions are temporary, they are treated a bit differently from normal ones. Quovo will clear out and reinsert all pending transactions on every successful Account sync. Therefore, pending transactions will not have an ID and should not be treated like a normal transaction. It is considered best practice to clear out all pending transactions and reinsert them on a daily basis. Once a transaction has settled, it will flow through the Portfolio’s history like any other transaction.

A pending transaction will yield the same information as a normal transaction except for the following fields:

Security Types

Security Types define the nature of a holding within a Portfolio. This information is sometimes identical to the security’s asset class, but not necessarily (e.g., for pooled vehicles such as ETFs and Mutual Funds).

Asset Classes

Sectors

Sector information is only relevant to equity securities.

Expense Categories

Expense categories are categorizations of cash transactions, generally occurring in bank and credit card Portfolios. They can be useful for Budgeting or Expense tracking purposes.

Proxy Tickers

{
     "account": 877247,
     "asset_class": "Unknown",
     "cost_basis": null,
     "cost_basis_type": null,
     "currency": null,
     "cusip": "037833100",
     "fxrate": 1.0,
     "id": 237432134,
     "last_purchase_date": null,
     "market_code": null,
     "portfolio": 746745,
     "portfolio_name": "test_portolio",
     "price": 1,
     "proxy_confidence": "Very High",
     "proxy_ticker": "DODIX",
     "quantity": 1262.28,
     "sector": null,
     "security_type": "Mutual Fund",
     "security_type_confidence": "Very High",
     "ticker": "FI:OFDZ",
     "ticker_name": "Dodge & Cox Income Fund",
     "user": 162703,
     "username": "quovo_test_user",
     "value": 1262.28
}

Proxy Tickers are Quovo’s closest match to a public ticker in situations where a public ticker is not explicitly provided by the custodian or the ticker provided is not accurate on pricing. A common occurrence of this problem is mutual funds which are related to a publicly known fund but are identified by ‘unknown’ (UN:) or institution specific (FI:) tickers because pricing has to be differentiated. The proxy ticker system will preserve pricing accuracy at the expense of losing ticker specific information. We would suggest use of the proxy to populate asset classing, sector typing and comparative pricing among other things.

Adding proxy tickers will yield the same information as a normal position except for the additional following fields:

Name Type Description
proxy_ticker string Quovo’s closest match to a public ticker.
proxy_confidence string The level of confidence in the accuracy of the proxy_ticker. Confidence levels are split into four tiers: “Very High”, “High”, “Moderate”, and “Low”. This value can be used to decide whether you should use the proxy_ticker, or ignore it due to its low confidence level.

FAQs

Financial Institution Coverage

What financial institutions does Quovo cover? Where can I find a list of these institutions?

Once you have access to our API, you can get a list of institutions covered by Quovo through the /brokerages endpoint.

Note: A Quovo Brokerage refers to any type of financial institution, not just brokerage firms; available financial institutions include banks, credit card providers, loan providers, investment companies, and brokerage companies.

What happens if you do not cover a financial institution I need?

While Quovo is constantly adding new institutions, you can request a specific new connection through the /requests endpoint in our API. Your end users may also request new connections through our Connect widget.

Front End

Is there a simple way for my clients to sync accounts directly on Quovo?

Yes, you can implement Quovo Connect, a premade JavaScript widget built to handle the intricacies of syncing. Connect will handle the process of adding and syncing an account, including handling any MFA questions that may appear. More information on the Connect widget can be found here.

Additionally, we have built Postman libraries to help with testing API calls. You can find more information on using and downloading our Postman libraries here.

Test Institutions

Is there a way for me to test the API without using real accounts?

Yes, Quovo provides test institutions that cover all syncing workflows and are populated with test data (for bank, loan, and investment accounts) so you can thoroughly test all API endpoints. A full list of our test institutions can be found here.

Account Syncs

Do I need to manually sync all of my accounts daily?

No, Quovo will attempt to sync all of your accounts nightly, so you will have access to updated data every morning. However, you will need to sync each account when it is first added to Quovo to make it “active”. Once the account has been synced initially, Quovo will sync it nightly to ensure you get the most up to date information. Note: Accounts added to Quovo via our Connect widget will sync automatically during the user credential entry process.

Why does my Account not have a “good” status?

Any non-“good” status means the last attempted sync could not complete successfully. There are several reasons for an unsuccessful sync:

Unanswered MFA questions are a common cause of syncing issues. When the end institution requires MFA questions to be answered before a sync can continue, Quovo will return a status of “questions”. As with “login” statuses, “questions” statuses can be resolved by entering additional Account information or fixing previously-entered, incorrect Account information.

If there were previously successful syncs on an Account (i.e. syncs that returned a status of “good”), the data retrieved from the last “good” sync will not be removed or impacted by subsequent unsuccessful sync attempts. Any previously fetched portfolios, holdings, and transactions will still be available via the API. The visible data may be somewhat stale, but it is not corrupted or affected by failed syncs, including “bad” ones.

If I get a “postponed” status from an on demand sync, what should I do?

Nothing. “postponed” is a legitimate response from the financial institution. Quovo will automatically investigate why the institution has postponed our data fetch, and resync as soon as possible. For example, during institution server maintenance windows, Quovo will internally note the maintenance window and retry the sync when the institution server is online again. Forcing a resync on demand through the API could cause further issues, however, and take Quovo longer to resolve any issue that may be present.

How often should I check back to see if a “postponed” account has synced?

We recommend that you check back daily. If you are seeing an account in a postponed state for an extended period of time, please reach out to our support team. They will look into the issue and give you additional information along with updates on the account.

What is the difference between “unavailable”, “bad”, and “postponed”?

The difference between the Account stauses lies in where the problem is rooted and how long it is expected to take before the issue is resolved:

curl -X PUT -H "Authorization: Bearer a724809d37d0a21b7e9257f45cee416f5aec61993ab4b0" -H "Content-Type: application/json" -d '{"account": 880701, "questions": [{"id": 60677, "answer": "New York City"}]}' "https://api.quovo.com/v2/challenges"

How do I respond to MFA challenges?

If an account is in “questions” status, you can make a GET call to the /challenges endpoint to view any outstanding MFA questions. To answer any outstanding questions, make a PUT call to the /challenges endpoint, passing the challenge ID as well as the answer to the MFA question. (Note: the /challenges endpoint also returns answered MFA questions.)

For a more thorough explanation of answering MFA questions, click here.

How long do I have to wait once I answer a Real-time question to know if it was successful?

When syncing an account with real-time MFA, Quovo polls for an MFA answer from the user every 3 seconds. After you answer the real time MFA, wait at least 3 seconds before you start polling for an updated sync status.

If you see has_realtime is still true and 9 seconds have passed, you should terminate the sync and re-initiate it on your end.

If you are having consistent issues with real-time questions and syncing please reach out to the Quovo support team.