SnapTrade Management API
Retrieve usage information about your SnapTrade Client ID.
Retrieve usage information about your SnapTrade Client ID.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/snaptrade:snaptrade-management-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
description: 'Connect brokerage accounts to your app for live positions and trading.
## Rate limiting
Two limits apply to requests signed with your `clientId`. The stricter one
wins, and exceeding either returns `429 Too Many Requests`.
- **Customer-level** — 250 requests/minute by default, scoped to your
`clientId` and applied across all endpoints. Reported in
`X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`.
- **Account-level** — 10 requests/minute per account, scoped to
(`clientId`, `accountId`). All covered operations for one account draw on
the same bucket — reading balances and reading positions share it — and
enforcement does not depend on the HTTP method, so updating an account
consumes the same bucket as reading it. Only enforced for Personal users,
and only for integrations it has been rolled out to — it is not yet in
force for every Personal integration. It also does not apply on every
operation that documents a 429 below. Where it applies it is reported in
`X-RateLimit-Account-Limit`, `X-RateLimit-Account-Remaining` and
`X-RateLimit-Account-Reset`. Do not read the absence of those headers as
proof the limit is off — some configurations omit the rate limit headers
while still enforcing the limit, so header absence tells you nothing
about your allowance.
On a 429, `X-RateLimit-Remaining: 0` means you hit the customer-level limit
and `X-RateLimit-Account-Remaining: 0` means the account-level one. Wait for
the corresponding `*-Reset` value (seconds) before retrying, or fall back to
exponential backoff with jitter.
Not every 429 is explained by those headers. A separate
per-authenticated-user limit, reported in no `X-RateLimit-*` header, covers
OAuth-authenticated requests and signed requests in configurations where the
customer-level limit is not in effect — on the operations that use the
default throttles. A few operations override those and are governed by the
customer-level limit alone. The two do not stack: a signed request
governed by the customer-level limit above is not additionally subject to the
per-user one. If a 429 arrives with no header at zero — or with no
`X-RateLimit-*` headers at all — honour `Retry-After` and back off. Treat the
remaining counts as a hint, not a guarantee that the next request will
succeed.
Because the customer-level limit applies everywhere, any signed request can
return 429.
**OAuth-authenticated requests are an exception.** They are not subject to
the customer-level limit and do not receive `X-RateLimit-Limit`,
`X-RateLimit-Remaining` or `X-RateLimit-Reset` — do not wait on those headers
or design around a customer-level allowance on this path. The account-level
limit still applies to them on the account-data endpoints above, reported in
the `X-RateLimit-Account-*` headers. On operations using the default
throttles the per-user limit above applies to them as well, so an OAuth
request can be rejected while the account headers still show capacity; on
the few operations that override those throttles, OAuth callers have no
per-user ceiling at all. Drive retries from `Retry-After` and exponential
backoff with jitter rather than from the headers.
See https://docs.snaptrade.com/docs/ratelimiting.'
version: 1.0.0
title: SnapTrade Management API
termsOfService: N/A
contact:
email: api@snaptrade.com
x-konfig-ignore:
potential-incorrect-type: true
x-readme:
explorer-enabled: false
servers:
- description: SnapTrade Production API
url: https://api.snaptrade.com
security:
- PartnerSignature: []
PartnerClientId: []
PartnerTimestamp: []
tags:
- name: Management
description: Retrieve usage information about your SnapTrade Client ID.
paths:
/management/stats:
get:
tags:
- Management
summary: Get usage stats (beta)
description: '**Beta.** This endpoint and its response schema may change.
Returns user, connection, and connected asset totals for your SnapTrade Client ID. These are the same numbers shown on the Users & Connections page of the SnapTrade Dashboard.
User and connection counts are cached for up to 5 minutes. Connected asset values come from a snapshot calculated once a day; `connected_assets_calculated_at` indicates when it was last calculated.'
operationId: Management_getStats
parameters:
- in: query
required: false
name: currency
description: ISO 4217 currency code to express connected asset values in. Defaults to `USD`.
schema:
type: string
example: USD
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/ConnectedAssetPartnerStats'
'400':
description: Unsupported currency
content:
application/json:
schema:
$ref: '#/components/schemas/400FailedRequestResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/401FailedRequestResponse'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/429TooManyRequestsResponse'
'500':
description: Unexpected Error
content:
application/json:
schema:
$ref: '#/components/schemas/500UnexpectedExceptionResponse'
'503':
description: Exchange rates for the requested currency are temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/503CurrencyConversionUnavailableResponse'
/snapTrade/stats:
get:
tags:
- Management
summary: Get usage stats (deprecated)
deprecated: true
description: '**Deprecated.** Use `GET /management/stats` for the beta response with connected asset field names.
Returns user, connection, and connected asset totals for your SnapTrade Client ID. These are the same numbers shown on the Users & Connections page of the SnapTrade Dashboard.
User and connection counts are cached for up to 5 minutes. Connected asset values come from a snapshot calculated once a day; `assets_under_management_calculated_at` indicates when it was last calculated.'
operationId: Management_getStatsLegacy
parameters:
- in: query
required: false
name: currency
description: ISO 4217 currency code to express connected asset values in. Defaults to `USD`.
schema:
type: string
example: USD
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/PartnerStats'
'400':
description: Unsupported currency
content:
application/json:
schema:
$ref: '#/components/schemas/400FailedRequestResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/401FailedRequestResponse'
'429':
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/429TooManyRequestsResponse'
'500':
description: Unexpected Error
content:
application/json:
schema:
$ref: '#/components/schemas/500UnexpectedExceptionResponse'
'503':
description: Exchange rates for the requested currency are temporarily unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/503CurrencyConversionUnavailableResponse'
components:
schemas:
503CurrencyConversionUnavailableResponse:
description: Example for a response that failed because exchange rates for the requested currency are unavailable
type: object
properties:
detail:
example: Exchange rates for the requested currency are temporarily unavailable. Please try again later.
status_code:
example: 503
code:
example: 1167
ConnectedAssetPartnerStats:
description: User, connection, and connected asset totals for your SnapTrade Client ID.
type: object
required:
- total_users
- total_connected_users
- total_active_connections
- total_disabled_connections
- oauth_total_users
- oauth_total_connected_users
- oauth_total_active_connections
- oauth_total_disabled_connections
- connected_assets
- disabled_connected_assets
- oauth_connected_assets
- oauth_disabled_connected_assets
- connected_assets_currency
- connected_assets_calculated_at
properties:
total_users:
type: integer
description: Number of users registered with your Client ID.
example: 19528
total_connected_users:
type: integer
description: Number of users registered with your Client ID that have at least one connection, active or disabled.
example: 2681
total_active_connections:
type: integer
description: Number of active connections across users registered with your Client ID.
example: 2265
total_disabled_connections:
type: integer
description: Number of disabled connections across users registered with your Client ID.
example: 708
oauth_total_users:
type:
- integer
- 'null'
description: Number of users who have authorized your OAuth application. `null` if your Client ID has no OAuth application.
example: null
oauth_total_connected_users:
type:
- integer
- 'null'
description: Number of users who have authorized your OAuth application and have at least one connection, active or disabled. `null` if your Client ID has no OAuth application.
example: null
oauth_total_active_connections:
type:
- integer
- 'null'
description: Number of active connections across users who have authorized your OAuth application. `null` if your Client ID has no OAuth application.
example: null
oauth_total_disabled_connections:
type:
- integer
- 'null'
description: Number of disabled connections across users who have authorized your OAuth application. `null` if your Client ID has no OAuth application.
example: null
connected_assets:
type:
- number
- 'null'
format: double
description: Total latest account value across active connections of users registered with your Client ID, in `connected_assets_currency`. `null` until the first daily snapshot has been calculated.
example: 104900000
disabled_connected_assets:
type:
- number
- 'null'
format: double
description: Total account value across disabled connections of users registered with your Client ID, as of each connection's last sync, in `connected_assets_currency`. `null` until the first daily snapshot has been calculated.
example: 159300000
oauth_connected_assets:
type:
- number
- 'null'
format: double
description: Total latest account value across active connections of users who have authorized your OAuth application, in `connected_assets_currency`. `null` if your Client ID has no OAuth application, or until the first daily snapshot after it was added.
example: null
oauth_disabled_connected_assets:
type:
- number
- 'null'
format: double
description: Total account value across disabled connections of users who have authorized your OAuth application, as of each connection's last sync, in `connected_assets_currency`. `null` if your Client ID has no OAuth application, or until the first daily snapshot after it was added.
example: null
connected_assets_currency:
type: string
description: ISO 4217 currency code the asset values are expressed in.
example: USD
connected_assets_calculated_at:
type:
- string
- 'null'
format: date-time
description: Timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format indicating when the connected asset values were last calculated. `null` until the first daily snapshot has been calculated.
example: '2026-10-08T02:47:00.000Z'
400FailedRequestResponse:
description: Example for failed request response
type: object
properties:
default_detail:
example: Unable to verify data sent
default_code:
example: 1076
401FailedRequestResponse:
description: Example for failed request response
type: object
properties:
default_detail:
example: Unable to verify signature sent
default_code:
example: 1076
PartnerStats:
description: User, connection, and connected asset totals for your SnapTrade Client ID.
type: object
required:
- total_users
- total_connected_users
- total_active_connections
- total_disabled_connections
- oauth_total_users
- oauth_total_connected_users
- oauth_total_active_connections
- oauth_total_disabled_connections
- assets_under_management
- disabled_assets_under_management
- oauth_assets_under_management
- oauth_disabled_assets_under_management
- assets_under_management_currency
- assets_under_management_calculated_at
properties:
total_users:
type: integer
description: Number of users registered with your Client ID.
example: 19528
total_connected_users:
type: integer
description: Number of users registered with your Client ID that have at least one connection, active or disabled.
example: 2681
total_active_connections:
type: integer
description: Number of active connections across users registered with your Client ID.
example: 2265
total_disabled_connections:
type: integer
description: Number of disabled connections across users registered with your Client ID.
example: 708
oauth_total_users:
type:
- integer
- 'null'
description: Number of users who have authorized your OAuth application. `null` if your Client ID has no OAuth application.
example: null
oauth_total_connected_users:
type:
- integer
- 'null'
description: Number of users who have authorized your OAuth application and have at least one connection, active or disabled. `null` if your Client ID has no OAuth application.
example: null
oauth_total_active_connections:
type:
- integer
- 'null'
description: Number of active connections across users who have authorized your OAuth application. `null` if your Client ID has no OAuth application.
example: null
oauth_total_disabled_connections:
type:
- integer
- 'null'
description: Number of disabled connections across users who have authorized your OAuth application. `null` if your Client ID has no OAuth application.
example: null
assets_under_management:
type:
- number
- 'null'
format: double
description: Total latest account value across active connections of users registered with your Client ID, in `assets_under_management_currency`. `null` until the first daily snapshot has been calculated.
example: 104900000
disabled_assets_under_management:
type:
- number
- 'null'
format: double
description: Total account value across disabled connections of users registered with your Client ID, as of each connection's last sync, in `assets_under_management_currency`. `null` until the first daily snapshot has been calculated.
example: 159300000
oauth_assets_under_management:
type:
- number
- 'null'
format: double
description: Total latest account value across active connections of users who have authorized your OAuth application, in `assets_under_management_currency`. `null` if your Client ID has no OAuth application, or until the first daily snapshot after it was added.
example: null
oauth_disabled_assets_under_management:
type:
- number
- 'null'
format: double
description: Total account value across disabled connections of users who have authorized your OAuth application, as of each connection's last sync, in `assets_under_management_currency`. `null` if your Client ID has no OAuth application, or until the first daily snapshot after it was added.
example: null
assets_under_management_currency:
type: string
description: ISO 4217 currency code the asset values are expressed in.
example: USD
assets_under_management_calculated_at:
type:
- string
- 'null'
format: date-time
description: Timestamp in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format indicating when the connected asset values were last calculated. `null` until the first daily snapshot has been calculated.
example: '2026-10-08T02:47:00.000Z'
429TooManyRequestsResponse:
description: Example for a rate-limited request response
type: object
properties:
detail:
example: Connection refreshed too recently. Please try again later.
status_code:
example: 429
code:
example: throttled
500UnexpectedExceptionResponse:
description: Example for a response that failed for unexpected reasons
type: object
properties:
detail:
example: Encountered an unexpected exception.
status_code:
example: 500
code:
example: 1000
securitySchemes:
PartnerSignature:
type: apiKey
in: header
name: Signature
PartnerClientId:
type: apiKey
in: query
name: clientId
PartnerTimestamp:
type: apiKey
in: query
name: timestamp