API reference
Application Manager
Operate retail sub-accounts: provisioning, credit and routing.
24 operationsBase URL https://packetexchange.io/api/v1Postman collection
BrowseApplication Manager
Get reseller analytics across your sub-accounts
GET/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Headline totals and quality, a daily series, per-sub-account margin and top destinations. Figures are JSON numbers (analytics rollups, not ledger entries).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
days | query | integer | Trailing window in days (default 30) |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
periodrequireddata.period | object | - |
daysrequireddata.period.days | integer | - |
summaryrequireddata.summary | object | - |
callsrequireddata.summary.calls | integer | - |
smsrequireddata.summary.sms | integer | - |
minutesrequireddata.summary.minutes | integer | - |
revenuerequireddata.summary.revenue | number | USD, JSON number (analytics rollup) |
marginrequireddata.summary.margin | number | USD, JSON number (analytics rollup) |
asrrequireddata.summary.asr | number | null | Answer rate percent over customer sessions; null with no calls |
acdrequireddata.summary.acd | number | - |
carrierCostrequireddata.summary.carrierCost | number | - |
activeSubsrequireddata.summary.activeSubs | integer | - |
timeseriesrequireddata.timeseries | object[] | - |
daterequireddata.timeseries[].date | string | YYYY-MM-DD |
callsrequireddata.timeseries[].calls | integer | - |
smsrequireddata.timeseries[].sms | integer | - |
revenuerequireddata.timeseries[].revenue | number | - |
marginrequireddata.timeseries[].margin | number | - |
bySubAccountrequireddata.bySubAccount | object[] | - |
byRouterequireddata.byRoute | object[] | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get your Application Manager settings
GET/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Created with defaults on first read.
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
operatorIdrequireddata.operatorId | string (uuid) | - |
defaultMarkupPctrequireddata.defaultMarkupPct | string | - |
defaultBillingIncrementrequireddata.defaultBillingIncrement | string | - |
minMarginPctrequireddata.minMarginPct | string | - |
subLowBalanceThresholdrequireddata.subLowBalanceThreshold | string | "0.00" disables low-balance alerts |
defaultDailySpendCaprequireddata.defaultDailySpendCap | string | null | US dollars as a decimal string with 2 decimal places, e.g. "50.00" |
defaultMaxConcurrentCallsrequireddata.defaultMaxConcurrentCalls | integer | null | - |
brandNamerequireddata.brandName | string | null | - |
brandColorrequireddata.brandColor | string | null | - |
brandLogoUrlrequireddata.brandLogoUrl | string | null | - |
requireTrunkApprovalrequireddata.requireTrunkApproval | boolean | - |
requireTrunkReadinessrequireddata.requireTrunkReadiness | boolean | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Update your Application Manager settings
PUT/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Default markup, low-balance threshold, default fraud caps and portal branding. Send only what changes.
Request body (application/json)
| Field | Type | Description |
|---|---|---|
defaultMarkupPct | number | -0 to 100000 |
subLowBalanceThreshold | number | -0 to 1000000 |
defaultDailySpendCap | number | null | -0 to 1000000 |
defaultMaxConcurrentCalls | integer | null | -0 to 100000 |
brandName | string | null | -max 120 chars |
brandColor | string | null | -max 9 chars |
brandLogoUrl | string (uri) | null | -max 500 chars |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as ApplicationSettings, shown earlier on this page. |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get sub-account totals
GET/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
subCountrequireddata.subCount | integer | - |
activeSubCountrequireddata.activeSubCount | integer | - |
aggregateBalancerequireddata.aggregateBalance | number | Sum of sub-account balances, USD as a JSON number |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List your sub-accounts
GET/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Newest first, cursor-paginated and searchable by label or external reference. total counts every match.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
cursor | query | string (uuid) | - |
limit | query | integer | Default 50 |
search | query | string | - |
status | query | string | -One of draft, active, suspended, closed |
lowBalanceOnly | query | string | -One of true, 1 |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
idrequireddata[].id | string (uuid) | - |
labelrequireddata[].label | string | - |
externalRefrequireddata[].externalRef | string | null | - |
balancerequireddata[].balance | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
statusrequireddata[].status | string | -One of draft, active, suspended, closed |
markupPctrequireddata[].markupPct | string | null | Markup percent as a 3-decimal string; null = operator default |
dailySpendCaprequireddata[].dailySpendCap | string | null | null = operator default; "0.00" = unlimited |
maxConcurrentCallsrequireddata[].maxConcurrentCalls | integer | null | - |
creditLimitrequireddata[].creditLimit | string | Postpaid credit, "0.00" = strict prepaid |
currencyrequireddata[].currency | string | Display currency for statementsmax 3 chars |
portalEmailrequireddata[].portalEmail | string | null | - |
autoSuspendedrequireddata[].autoSuspended | boolean | Suspended automatically by a daily cap, lifts itself |
sipUsernamerequireddata[].sipUsername | string | null | - |
createdAtrequireddata[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata[].updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
lowBalancerequireddata[].lowBalance | boolean | - |
nextCursor | string | null | - |
hasMore | boolean | - |
total | integer | - |
lowBalanceThreshold | number | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Create a sub-account
POST/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Provisions its SIP credentials and one API key, both returned ONCE. Requires an active route purchase or an active route of your own.
Request body (application/json)
| Field | Type | Description |
|---|---|---|
labelrequired | string | -max 255 chars |
externalRef | string | null | -max 10000 chars |
markupPct | number | null | -0 to 100000 |
dailySpendCap | number | null | -0 to 1000000 |
maxConcurrentCalls | integer | null | -0 to 100000 |
creditLimit | number | null | -0 to 10000000 |
currency | string | -max 3 chars |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
idrequireddata.id | string (uuid) | - |
labelrequireddata.label | string | - |
externalRefrequireddata.externalRef | string | null | - |
balancerequireddata.balance | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
statusrequireddata.status | string | -One of draft, active, suspended, closed |
markupPctrequireddata.markupPct | string | null | Markup percent as a 3-decimal string; null = operator default |
dailySpendCaprequireddata.dailySpendCap | string | null | null = operator default; "0.00" = unlimited |
maxConcurrentCallsrequireddata.maxConcurrentCalls | integer | null | - |
creditLimitrequireddata.creditLimit | string | Postpaid credit, "0.00" = strict prepaid |
currencyrequireddata.currency | string | Display currency for statementsmax 3 chars |
portalEmailrequireddata.portalEmail | string | null | - |
autoSuspendedrequireddata.autoSuspended | boolean | Suspended automatically by a daily cap, lifts itself |
sipUsernamerequireddata.sipUsername | string | null | - |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
apiKeyrequireddata.apiKey | string | The sub-account API key. Returned ONCE. |
apiKeyPrefixrequireddata.apiKeyPrefix | string | - |
sipPasswordrequireddata.sipPassword | string | The SIP password. Returned ONCE. |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Create up to 100 sub-accounts at once
POST/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Each item is created independently, so one bad row does not fail the batch. Each created entry carries its one-time credentials.
Request body (application/json)
| Field | Type | Description |
|---|---|---|
subAccountsrequired | object[] | - |
labelrequiredsubAccounts[].label | string | -max 255 chars |
externalRefsubAccounts[].externalRef | string | null | -max 10000 chars |
markupPctsubAccounts[].markupPct | number | null | -0 to 100000 |
dailySpendCapsubAccounts[].dailySpendCap | number | null | -0 to 1000000 |
maxConcurrentCallssubAccounts[].maxConcurrentCalls | integer | null | -0 to 100000 |
creditLimitsubAccounts[].creditLimit | number | null | -0 to 10000000 |
currencysubAccounts[].currency | string | -max 3 chars |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
createdrequireddata.created | object[] | Same fields as SubAccountCreated, shown earlier on this page. |
failedrequireddata.failed | object[] | - |
labelrequireddata.failed[].label | string | - |
errorrequireddata.failed[].error | string | - |
requestedrequireddata.requested | integer | - |
createdCountrequireddata.createdCount | integer | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get a sub-account
GET/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
idrequireddata.id | string (uuid) | - |
labelrequireddata.label | string | - |
externalRefrequireddata.externalRef | string | null | - |
balancerequireddata.balance | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
statusrequireddata.status | string | -One of draft, active, suspended, closed |
markupPctrequireddata.markupPct | string | null | Markup percent as a 3-decimal string; null = operator default |
dailySpendCaprequireddata.dailySpendCap | string | null | null = operator default; "0.00" = unlimited |
maxConcurrentCallsrequireddata.maxConcurrentCalls | integer | null | - |
creditLimitrequireddata.creditLimit | string | Postpaid credit, "0.00" = strict prepaid |
currencyrequireddata.currency | string | Display currency for statementsmax 3 chars |
portalEmailrequireddata.portalEmail | string | null | - |
autoSuspendedrequireddata.autoSuspended | boolean | Suspended automatically by a daily cap, lifts itself |
sipUsernamerequireddata.sipUsername | string | null | - |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
updatedAtrequireddata.updatedAt | string (date-time) | ISO-8601 timestamp (UTC) |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Update a sub-account
PATCH/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Suspending or closing revokes its API keys and stops its campaigns.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
label | string | -max 255 chars |
status | string | -One of active, suspended, closed |
markupPct | number | null | -0 to 100000 |
dailySpendCap | number | null | -0 to 1000000 |
maxConcurrentCalls | integer | null | -0 to 100000 |
creditLimit | number | null | -0 to 10000000 |
currency | string | -max 3 chars |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SubAccount, shown earlier on this page. |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Fund a sub-account from your balance
POST/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
- Safe retries
- Send
X-Idempotency-Key; a replay within 24 hours returns the first response. - Moves money
- Moves money between your balance and a sub-account.
Moves money from your balance into the sub-account. Only active sub-accounts can be funded.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
X-Idempotency-Key | header | string | Any unique string (a UUID is ideal). Replays within 24 hours return the first response instead of acting twice. |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
amountrequired | number | -min 0 |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
operatorBalancerequireddata.operatorBalance | number | null | Your balance after the transfer, as a JSON number; null when your balance did not move |
subBalancerequireddata.subBalance | number | The sub-account balance after the transfer, as a JSON number |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Return funds from a sub-account to your balance
POST/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
- Safe retries
- Send
X-Idempotency-Key; a replay within 24 hours returns the first response. - Moves money
- Moves money between your balance and a sub-account.
Works on closed sub-accounts too, so a balance can be handed back after closure.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
X-Idempotency-Key | header | string | Any unique string (a UUID is ideal). Replays within 24 hours return the first response instead of acting twice. |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
amountrequired | number | -min 0 |
reasonrequired | string | -max 500 chars |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
operatorBalancerequireddata.operatorBalance | number | null | Your balance after the transfer, as a JSON number; null when your balance did not move |
subBalancerequireddata.subBalance | number | The sub-account balance after the transfer, as a JSON number |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Record a payment a sub-account made to you
POST/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
- Safe retries
- Send
X-Idempotency-Key; a replay within 24 hours returns the first response. - Moves money
- Moves money between your balance and a sub-account.
Credits the sub-account for money it paid you outside the platform. Your own balance does not move.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
X-Idempotency-Key | header | string | Any unique string (a UUID is ideal). Replays within 24 hours return the first response instead of acting twice. |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
amountrequired | number | -min 0 |
reason | string | -max 500 chars |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
operatorBalancerequireddata.operatorBalance | number | null | Your balance after the transfer, as a JSON number; null when your balance did not move |
subBalancerequireddata.subBalance | number | The sub-account balance after the transfer, as a JSON number |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Reverse a recorded sub-account payment
POST/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
- Safe retries
- Send
X-Idempotency-Key; a replay within 24 hours returns the first response. - Moves money
- Moves money between your balance and a sub-account.
Debits the sub-account to correct a payment recorded in error. Your own balance does not move.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
X-Idempotency-Key | header | string | Any unique string (a UUID is ideal). Replays within 24 hours return the first response instead of acting twice. |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
amountrequired | number | -min 0 |
reasonrequired | string | -max 500 chars |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
operatorBalancerequireddata.operatorBalance | number | null | Your balance after the transfer, as a JSON number; null when your balance did not move |
subBalancerequireddata.subBalance | number | The sub-account balance after the transfer, as a JSON number |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List a sub-account's API keys
GET/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
idrequireddata[].id | string (uuid) | - |
keyPrefixrequireddata[].keyPrefix | string | - |
labelrequireddata[].label | string | - |
lastUsedAtrequireddata[].lastUsedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
createdAtrequireddata[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
expiresAtrequireddata[].expiresAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Issue an API key for a sub-account
POST/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
The key is returned ONCE. It can reach only the sub-account traffic endpoints.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
idrequireddata.id | string (uuid) | - |
apiKeyrequireddata.apiKey | string | - |
prefixrequireddata.prefix | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Revoke a sub-account API key
DELETE/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
keyIdrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
revokedrequireddata.revoked | boolean | -One of true |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Set a sub-account's portal email and send a sign-in link
POST/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
- Sends email
- Sends an email to a third party.
Send email: null to clear it. The link is only emailed to active sub-accounts.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Request body (application/json)
| Field | Type | Description |
|---|---|---|
emailrequired | string (email) | null | -max 255 chars |
sendInvite | boolean | -default true |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SubAccount, shown earlier on this page. |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Close a sub-account
POST/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Ends service: revokes its keys and stops its campaigns. No money moves; return any balance separately with the debit endpoint. Idempotent.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as SubAccount, shown earlier on this page. |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Regenerate a sub-account SIP password
POST/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
The new password is returned ONCE; the old one stops working immediately.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
sipUsernamerequireddata.sipUsername | string | null | - |
sipPasswordrequireddata.sipPassword | string | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 409
CONFLICT(or a code-specific 409): the change clashes with existing state. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get lifetime usage for a sub-account
GET/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
recordsrequireddata.records | integer | - |
totalCostrequireddata.totalCost | number | USD as a JSON number |
totalSecondsrequireddata.totalSeconds | integer | - |
totalSegmentsrequireddata.totalSegments | integer | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get analytics for one sub-account
GET/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
days | query | integer | Trailing window in days (default 30) |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
periodrequireddata.period | object | - |
daysrequireddata.period.days | integer | - |
summaryrequireddata.summary | object | - |
callsrequireddata.summary.calls | integer | - |
smsrequireddata.summary.sms | integer | - |
minutesrequireddata.summary.minutes | integer | - |
revenuerequireddata.summary.revenue | number | USD, JSON number (analytics rollup) |
marginrequireddata.summary.margin | number | USD, JSON number (analytics rollup) |
asrrequireddata.summary.asr | number | null | Answer rate percent over customer sessions; null with no calls |
acdrequireddata.summary.acd | number | - |
timeseriesrequireddata.timeseries | object[] | - |
daterequireddata.timeseries[].date | string | YYYY-MM-DD |
callsrequireddata.timeseries[].calls | integer | - |
smsrequireddata.timeseries[].sms | integer | - |
revenuerequireddata.timeseries[].revenue | number | - |
marginrequireddata.timeseries[].margin | number | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List call records for a sub-account
GET/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Newest first, offset-paginated.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
limit | query | integer | -Default 50 |
offset | query | integer | -Default 0 |
kind | query | string | -One of voice, sms |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get a monthly statement for a sub-account
GET/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Spend in USD and in the sub-account's display currency, split by voice and SMS, with a resale-tax block. Derived, not stored.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
monthrequired | query | string | YYYY-MM |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
subAccountIdrequireddata.subAccountId | string (uuid) | - |
labelrequireddata.label | string | - |
monthrequireddata.month | string | - |
periodStartrequireddata.periodStart | string (date-time) | ISO-8601 timestamp (UTC) |
periodEndrequireddata.periodEnd | string (date-time) | ISO-8601 timestamp (UTC) |
currencyrequireddata.currency | string | - |
fxRaterequireddata.fxRate | number | - |
recordsrequireddata.records | integer | - |
spendrequireddata.spend | object | - |
usdrequireddata.spend.usd | number | - |
inCurrencyrequireddata.spend.inCurrency | number | - |
byKindrequireddata.byKind | object | - |
voicerequireddata.byKind.voice | object | - |
usdrequireddata.byKind.voice.usd | number | - |
inCurrencyrequireddata.byKind.voice.inCurrency | number | - |
smsrequireddata.byKind.sms | object | - |
usdrequireddata.byKind.sms.usd | number | - |
inCurrencyrequireddata.byKind.sms.inCurrency | number | - |
taxrequireddata.tax | object | base, ratePct, taxAmount, total, treatment, label, note |
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Export a sub-account's call records as CSV
GET/
- Access
- API key. Scoped keys need
application:write. - Rate limit
- 100 requests per second (the default)
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200 (text/csv)
Every call record for the sub-account, as CSV.
Errors
- 400
VALIDATION_ERROR,INVALID_INPUTorBAD_REQUEST. ForVALIDATION_ERROR,error.detailsis an array of{ path, message }. - 401
UNAUTHORIZED: missing, invalid, expired or revoked credential. - 403
FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only. - 404
NOT_FOUND: no such resource on your account. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.