API reference
Billing
Ledger, invoices, statements, spending and exports. All amounts are USD 6-decimal strings.
22 operationsBase URL https://packetexchange.io/api/v1Postman collection
BrowseBilling
List ledger transactions
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Your account ledger, newest first, cursor-paginated. Filter by type and an ISO date range (inclusive from, exclusive to). With format=csv the response is a CSV file of every matching row (up to 10,000) instead of JSON.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
type | query | string | -One of topup, charge, credit, payout, platform_fee, test_credit |
from | query | string (date-time) | Inclusive start (ISO-8601) |
to | query | string (date-time) | Exclusive end (ISO-8601) |
cursor | query | string (uuid) | The nextCursor from the previous page |
limit | query | integer | -Default 25 |
format | query | string | csv streams every matching row (up to 10,000) as a spreadsheet fileOne of json, csv |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
idrequireddata[].id | string (uuid) | - |
userIdrequireddata[].userId | string (uuid) | - |
typerequireddata[].type | string | charge = usage you paid for; credit = seller earnings or a grant; platform_fee = the exchange feeOne of topup, charge, credit, payout, platform_fee, test_credit, chargeback, refund_reversal, refund, transfer |
amountrequireddata[].amount | money | Signed: negative for money out (charges, fees, payouts), positive for money in USD as a decimal string with exactly 6 places, e.g. "0.012500". |
balanceAfterrequireddata[].balanceAfter | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
referencerequireddata[].reference | string | null | - |
relatedEntityTyperequireddata[].relatedEntityType | string | null | - |
relatedEntityIdrequireddata[].relatedEntityId | string (uuid) | null | - |
callIddata[].callId | string | null | The call or message this line bills; equals the CDR callUuid |
createdAtrequireddata[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
nextCursorrequired | string | null | Pass as cursor to fetch the next page; null on the last page. |
hasMorerequired | boolean | True when another page exists. |
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 spending and earnings summary
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Dashboard totals: spending (all time and today, UTC), seller earnings (all time, 30 days, today), active purchases and campaigns, and the withdrawable versus held part of your balance.
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
totalSpendingrequireddata.totalSpending | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
totalTransactionsrequireddata.totalTransactions | integer | - |
spendingTodayrequireddata.spendingToday | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
transactionsTodayrequireddata.transactionsToday | integer | - |
activePurchasesrequireddata.activePurchases | integer | - |
runningCampaignsrequireddata.runningCampaigns | integer | - |
totalCampaignsrequireddata.totalCampaigns | integer | - |
totalEarningsrequireddata.totalEarnings | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
earnings30drequireddata.earnings30d | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
earningsTodayrequireddata.earningsToday | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
availableBalancerequireddata.availableBalance | money | Withdrawable now USD as a decimal string with exactly 6 places, e.g. "0.012500". |
heldBalancerequireddata.heldBalance | money | Card top-ups still inside the chargeback hold window USD as a decimal string with exactly 6 places, e.g. "0.012500". |
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 seller earnings broken down by route
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Top 50 routes by earnings over the last days. Attribution comes from call records, so it is partial: records without a route land in an "Unattributed" row, and the total can differ slightly from the credit ledger (attribution: "partial").
Parameters
| Name | In | Type | Description |
|---|---|---|---|
days | query | integer | -Default 30 |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
routeIdrequireddata[].routeId | string (uuid) | null | - |
destinationNamerequireddata[].destinationName | string | - |
creditsrequireddata[].credits | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
countrequireddata[].count | integer | - |
days | integer | - |
attribution | string | -One of partial |
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 outbound usage grouped by destination country
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Records, voice sessions, answered sessions, minutes, SMS segments, ASR, ACD and cost per destination country. ASR is voice-only and counted over customer sessions (a failed-over call counts once). With no dates the window is all time; basis.window states the window used. format=csv returns a CSV file.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
from | query | string (date-time) | - |
to | query | string (date-time) | - |
format | query | string | -One of json, csv |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
countryrequireddata[].country | string | - |
countryCoderequireddata[].countryCode | string | null | - |
attemptsrequireddata[].attempts | integer | Deprecated: same as records (a row count, not a call count) |
recordsrequireddata[].records | integer | - |
voiceSessionsrequireddata[].voiceSessions | integer | - |
answeredrequireddata[].answered | integer | - |
minutesrequireddata[].minutes | number | - |
segmentsrequireddata[].segments | integer | - |
asrrequireddata[].asr | number | null | Percent, voice only; null with no voice sessions |
asrBasisrequireddata[].asrBasis | object | Which population and window the ASR counts |
acdrequireddata[].acd | number | null | Average answered duration in seconds |
costrequireddata[].cost | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
basis | object | - |
populationrequiredbasis.population | string | -One of customer_sessions |
windowrequiredbasis.window | 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. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get your end-of-day balance history
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
One point per UTC day that had ledger activity. Balances here are plain JSON numbers for charting, not ledger strings.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
days | query | integer | -Default 30 |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
pointsrequireddata.points | object[] | - |
daterequireddata.points[].date | string | YYYY-MM-DD (UTC) |
balancerequireddata.points[].balance | number | - |
currentBalancerequireddata.currentBalance | number | - |
hasDatarequireddata.hasData | 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.
Get daily voice and SMS spend
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Charges per UTC day split into voice and SMS. Amounts are plain JSON numbers for charting.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
days | query | integer | -Default 30 |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
pointsrequireddata.points | object[] | - |
daterequireddata.points[].date | string | YYYY-MM-DD (UTC) |
voicerequireddata.points[].voice | number | - |
smsrequireddata.points[].sms | number | - |
totalrequireddata.points[].total | number | - |
daysrequireddata.days | integer | - |
hasDatarequireddata.hasData | 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.
List your call and message records
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Your call detail records (test probes excluded), newest first, cursor-paginated. With format=csv the response is a CSV file of up to 50,000 rows. For larger exports use POST /billing/exports.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
from | query | string (date-time) | - |
to | query | string (date-time) | - |
kind | query | string | -One of voice, sms |
direction | query | string | -One of outbound, inbound |
cursor | query | string (uuid) | - |
limit | query | integer | -Default 50 |
format | query | string | csv streams up to 50,000 rowsOne of json, csv |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
idrequireddata[].id | string (uuid) | - |
callUuidrequireddata[].callUuid | string | null | - |
callGroupIdrequireddata[].callGroupId | string (uuid) | null | Groups the legs of one customer call when it failed over |
directionrequireddata[].direction | string | -One of outbound, inbound |
kindrequireddata[].kind | string | -One of voice, sms |
routeIdrequireddata[].routeId | string (uuid) | null | - |
fromNumberrequireddata[].fromNumber | string | null | - |
toNumberrequireddata[].toNumber | string | null | - |
clirequireddata[].cli | string | null | - |
statusrequireddata[].status | string | null | - |
sipCoderequireddata[].sipCode | integer | null | - |
hangupCauserequireddata[].hangupCause | string | null | - |
durationSecondsrequireddata[].durationSeconds | integer | null | - |
billedSecondsrequireddata[].billedSeconds | integer | null | - |
segmentsrequireddata[].segments | integer | null | SMS segments |
pddMsrequireddata[].pddMs | integer | null | - |
buyerCostrequireddata[].buyerCost | money | null | What you were charged for this record USD as a decimal string with exactly 6 places, e.g. "0.012500". |
sellerCreditrequireddata[].sellerCredit | money | null | Seller earnings. Null unless you are the seller on this record USD as a decimal string with exactly 6 places, e.g. "0.012500". |
ratePerUnitrequireddata[].ratePerUnit | money | null | US dollars as a decimal string with exactly 6 decimal places, e.g. "0.012500". Do money arithmetic with a decimal type, not floating point. USD as a decimal string with exactly 6 places, e.g. "0.012500". |
answeredAtrequireddata[].answeredAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
endedAtrequireddata[].endedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
createdAtrequireddata[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
nextCursorrequired | string | null | Pass as cursor to fetch the next page; null on the last page. |
hasMorerequired | boolean | True when another page exists. |
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.
Stream your call records as CSV
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Streams every matching record (up to 1,000,000 rows) as a CSV file in one response.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
from | query | string (date-time) | - |
to | query | string (date-time) | - |
kind | query | string | -One of voice, sms |
direction | query | string | -One of outbound, inbound |
Response 200 (text/csv)
A CSV file of call detail records.
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 call-record exports
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Your 50 most recent export jobs.
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
idrequireddata[].id | string (uuid) | - |
typerequireddata[].type | string | -One of cdr |
paramsrequireddata[].params | object | - |
fromdata[].params.from | string (date-time) | ISO-8601 timestamp (UTC) |
todata[].params.to | string (date-time) | ISO-8601 timestamp (UTC) |
kinddata[].params.kind | string | -One of voice, sms |
directiondata[].params.direction | string | -One of outbound, inbound |
statusrequireddata[].status | string | -One of pending, running, done, failed |
rowCountrequireddata[].rowCount | integer | null | - |
errorrequireddata[].error | string | null | - |
createdAtrequireddata[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
completedAtrequireddata[].completedAt | string (date-time) | null | ISO-8601 timestamp (UTC) |
downloadablerequireddata[].downloadable | boolean | True once the job is done and its file is on record |
downloadUrlrequireddata[].downloadUrl | string | null | The download endpoint for this job once it is done (GET /billing/exports/{id}/download). The only way to the file: no server path is ever returned. |
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.
Start a background call-record export
POST/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Queues a CSV export job. At most 3 exports may be pending or running at once; a fourth gets 429 TOO_MANY_EXPORTS. Poll GET /billing/exports and download when downloadable is true.
Request body (application/json)
| Field | Type | Description |
|---|---|---|
from | string (date-time) | - |
to | string (date-time) | - |
filters | object | Takes precedence over the top-level from/to |
fromfilters.from | string (date-time) | - |
tofilters.to | string (date-time) | - |
kindfilters.kind | string | -One of voice, sms |
directionfilters.direction | string | -One of outbound, inbound |
Response 202
| Field | Type | Description |
|---|---|---|
datarequired | object | Same fields as BillingExportJob, 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. - Also
TOO_MANY_EXPORTS
Download a finished call-record export
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Returns the CSV file. Only the account that queued the export can download it (another account gets 404). 409 EXPORT_NOT_READY while the job is not finished; 410 EXPORT_EXPIRED once the retention sweep has deleted the file.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
Response 200 (text/csv)
The export as a CSV file.
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. - Also
EXPORT_NOT_READY,EXPORT_EXPIRED
List your receipts and statements
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Top-up receipts and statements (up to 200, newest first). For numbered tax invoices see GET /billing/tax-invoices.
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
idrequireddata[].id | string (uuid) | - |
numberrequireddata[].number | integer | Sequential document number; printed as INV-000123 |
typerequireddata[].type | string | -One of topup_receipt, statement |
amountrequireddata[].amount | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
currencyrequireddata[].currency | string | - |
periodStartrequireddata[].periodStart | string (date-time) | null | ISO-8601 timestamp (UTC) |
periodEndrequireddata[].periodEnd | string (date-time) | null | ISO-8601 timestamp (UTC) |
createdAtrequireddata[].createdAt | 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. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get a receipt or statement
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
JSON by default; format=html returns a self-contained printable page.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
format | query | string | html returns a printable pageOne of json, html |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
idrequireddata.id | string (uuid) | - |
numberrequireddata.number | integer | Sequential document number; printed as INV-000123 |
typerequireddata.type | string | -One of topup_receipt, statement |
amountrequireddata.amount | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
currencyrequireddata.currency | string | - |
periodStartrequireddata.periodStart | string (date-time) | null | ISO-8601 timestamp (UTC) |
periodEndrequireddata.periodEnd | string (date-time) | null | ISO-8601 timestamp (UTC) |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
dataJsonrequireddata.dataJson | object | null | - |
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 your monthly statement
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Every ledger line in a calendar month (UTC) with totals by type and the tax on platform fees. Totals and net are plain JSON numbers; line-item amounts are ledger strings. format=csv returns a CSV file.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
monthrequired | query | string | Calendar month, YYYY-MM (UTC) |
format | query | string | -One of json, csv |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
monthrequireddata.month | string | - |
periodStartrequireddata.periodStart | string (date-time) | ISO-8601 timestamp (UTC) |
periodEndrequireddata.periodEnd | string (date-time) | ISO-8601 timestamp (UTC) |
netrequireddata.net | number | credits + top-ups - charges - payouts |
totalsrequireddata.totals | object | - |
chargesrequireddata.totals.charges | number | - |
creditsrequireddata.totals.credits | number | - |
topupsrequireddata.totals.topups | number | - |
payoutsrequireddata.totals.payouts | number | - |
byTyperequireddata.totals.byType | object | - |
lineItemsrequireddata.lineItems | object[] | - |
idrequireddata.lineItems[].id | string (uuid) | - |
typerequireddata.lineItems[].type | string | -One of topup, charge, credit, payout, platform_fee, test_credit, chargeback, refund_reversal, refund, transfer |
amountrequireddata.lineItems[].amount | money | USD as a decimal string with exactly 6 places, e.g. "0.012500". |
referencerequireddata.lineItems[].reference | string | null | - |
createdAtrequireddata.lineItems[].createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
taxrequireddata.tax | object | - |
taxableSupplyrequireddata.tax.taxableSupply | string | -One of platform_fees |
baserequireddata.tax.base | number | - |
ratePctrequireddata.tax.ratePct | number | - |
taxAmountrequireddata.tax.taxAmount | number | - |
totalrequireddata.tax.total | number | - |
treatmentrequireddata.tax.treatment | string | - |
labelrequireddata.tax.label | string | - |
noterequireddata.tax.note | string | null | - |
taxIdrequireddata.tax.taxId | string | null | - |
taxCountryrequireddata.tax.taxCountry | string | null | - |
homeCountryrequireddata.tax.homeCountry | 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. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Get the financial position of your wallet or a sub-account
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Posted balance, credit limit, reserved for live calls, settlement holds, pending payments, and what that leaves to spend, with the source of each figure. Figures are plain JSON numbers (USD). Pass customerId for a sub-account you operate.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
customerId | query | string (uuid) | A sub-account you operate; omit for your own wallet |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
walletKindrequireddata.walletKind | string | -One of user, sub_account |
walletIdrequireddata.walletId | string (uuid) | - |
labelrequireddata.label | string | - |
currencyrequireddata.currency | string | - |
postedBalancerequireddata.postedBalance | number | - |
creditLimitrequireddata.creditLimit | number | - |
creditLimitRecordedrequireddata.creditLimitRecorded | boolean | - |
reservedForActiveCallsrequireddata.reservedForActiveCalls | number | - |
settlementHoldsrequireddata.settlementHolds | number | - |
pendingPaymentsrequireddata.pendingPayments | number | - |
promotionalCreditrequireddata.promotionalCredit | number | - |
confirmedFundsrequireddata.confirmedFunds | number | - |
availableToSpendrequireddata.availableToSpend | number | - |
overCommittedrequireddata.overCommitted | boolean | - |
negativeBalancerequireddata.negativeBalance | string | -One of not_negative, within_agreed_credit, beyond_agreed_credit |
beyondCreditByrequireddata.beyondCreditBy | number | - |
activeCallsrequireddata.activeCalls | integer | - |
reservationEnforcedrequireddata.reservationEnforced | boolean | True when reservations actually gate new calls, not just observe them |
creditNoterequireddata.creditNote | string | - |
sourcesrequireddata.sources | 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.
List live call authorisations on a wallet
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Funds currently reserved for calls in progress. Amounts are plain JSON numbers (USD).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
customerId | query | string (uuid) | A sub-account you operate; omit for your own wallet |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
callsrequireddata.calls | object[] | - |
callUuidrequireddata.calls[].callUuid | string | - |
amountrequireddata.calls[].amount | number | - |
expiresAtrequireddata.calls[].expiresAt | string (date-time) | ISO-8601 timestamp (UTC) |
totalrequireddata.total | number | - |
enforcedrequireddata.enforced | 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.
Reconcile a wallet balance against its ledger
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Explains the posted balance by ledger component and reports anything it cannot explain as unreconciled, rather than as confirmed money. Amounts are plain JSON numbers (USD).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
customerId | query | string (uuid) | A sub-account you operate; omit for your own wallet |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
walletKindrequireddata.walletKind | string | -One of user, sub_account |
walletIdrequireddata.walletId | string (uuid) | - |
labelrequireddata.label | string | - |
currencyrequireddata.currency | string | - |
postedBalancerequireddata.postedBalance | number | - |
openingBalancerequireddata.openingBalance | object | - |
amountrequireddata.openingBalance.amount | number | - |
documentedrequireddata.openingBalance.documented | boolean | - |
noterequireddata.openingBalance.note | string | - |
componentsrequireddata.components | object[] | - |
keyrequireddata.components[].key | string | - |
labelrequireddata.components[].label | string | - |
amountrequireddata.components[].amount | number | - |
countrequireddata.components[].count | integer | - |
sourcerequireddata.components[].source | string | - |
explainedrequireddata.explained | number | - |
unattributedrequireddata.unattributed | object | - |
amountrequireddata.unattributed.amount | number | - |
countrequireddata.unattributed.count | integer | - |
noterequireddata.unattributed.note | string | - |
unreconciledrequireddata.unreconciled | number | - |
hasUnreconciledrequireddata.hasUnreconciled | boolean | - |
unpostedUsagerequireddata.unpostedUsage | object | - |
amountrequireddata.unpostedUsage.amount | number | - |
callsrequireddata.unpostedUsage.calls | integer | - |
noterequireddata.unpostedUsage.note | string | - |
checkedAtrequireddata.checkedAt | 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. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
List posted, pending and unposted money movements
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
One timeline of posted ledger lines, pending payments and usage not yet posted. truncated is true when more rows matched than limit. Amounts are plain JSON numbers (USD).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
customerId | query | string (uuid) | A sub-account you operate; omit for your own wallet |
limit | query | integer | -Default 100 |
from | query | string (date-time) | - |
to | query | string (date-time) | - |
state | query | string | -One of all, posted, pending, usage |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
rowsrequireddata.rows | object[] | - |
idrequireddata.rows[].id | string | - |
staterequireddata.rows[].state | string | -One of posted, pending, usage |
atrequireddata.rows[].at | string (date-time) | ISO-8601 timestamp (UTC) |
kindrequireddata.rows[].kind | string | - |
labelrequireddata.rows[].label | string | - |
amountrequireddata.rows[].amount | number | - |
balanceAfterrequireddata.rows[].balanceAfter | number | null | - |
referencerequireddata.rows[].reference | string | null | - |
callIdrequireddata.rows[].callId | string | null | - |
traceTorequireddata.rows[].traceTo | string | - |
truncatedrequireddata.truncated | 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.
List sub-account wallets you operate with their positions
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Every non-closed sub-account with its balance, credit and what it can spend now. Amounts are plain JSON numbers.
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
idrequireddata[].id | string (uuid) | - |
labelrequireddata[].label | string | - |
currencyrequireddata[].currency | string | - |
statusrequireddata[].status | string | - |
postedBalancerequireddata[].postedBalance | number | - |
creditLimitrequireddata[].creditLimit | number | - |
confirmedFundsrequireddata[].confirmedFunds | number | - |
reservedForActiveCallsrequireddata[].reservedForActiveCalls | number | - |
activeCallsrequireddata[].activeCalls | integer | - |
availableToSpendrequireddata[].availableToSpend | number | - |
negativeWithinAgreedCreditrequireddata[].negativeWithinAgreedCredit | boolean | - |
beyondAgreedCreditrequireddata[].beyondAgreedCredit | 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.
List your tax invoices
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
Numbered tax invoices (gap-free per account), newest first, up to 500.
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object[] | - |
idrequireddata[].id | string (uuid) | - |
seqrequireddata[].seq | integer | Gap-free per-account sequence |
numberrequireddata[].number | string | - |
periodrequireddata[].period | string | YYYY-MM |
periodStartrequireddata[].periodStart | string (date-time) | ISO-8601 timestamp (UTC) |
periodEndrequireddata[].periodEnd | string (date-time) | ISO-8601 timestamp (UTC) |
currencyrequireddata[].currency | string | - |
subtotalrequireddata[].subtotal | string | Decimal string |
taxAmountrequireddata[].taxAmount | string | Decimal string |
totalrequireddata[].total | string | Decimal string |
createdAtrequireddata[].createdAt | 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. - 429
RATE_LIMITED: slow down and retry after theRetry-Afterseconds. - 500
INTERNAL_ERROR: unexpected failure. QuoteX-Request-Idto support.
Generate the tax invoice for a month
POST/
- Access
- API key. Scoped keys need
account:write. - Rate limit
- 100 requests per second (the default)
Idempotent per period: if the month already has an invoice it is returned with alreadyExisted: true and status 200; a new one returns 201. 503 when the invoice register is not available on this node.
Request body (application/json)
| Field | Type | Description |
|---|---|---|
periodrequired | string | - |
Response 201
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
idrequireddata.id | string (uuid) | - |
seqrequireddata.seq | integer | Gap-free per-account sequence |
numberrequireddata.number | string | - |
periodrequireddata.period | string | YYYY-MM |
periodStartrequireddata.periodStart | string (date-time) | ISO-8601 timestamp (UTC) |
periodEndrequireddata.periodEnd | string (date-time) | ISO-8601 timestamp (UTC) |
currencyrequireddata.currency | string | - |
subtotalrequireddata.subtotal | string | Decimal string |
taxAmountrequireddata.taxAmount | string | Decimal string |
totalrequireddata.total | string | Decimal string |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
dataJsonrequireddata.dataJson | object | null | Frozen line items and the tax section as issued |
alreadyExistedrequireddata.alreadyExisted | 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. - 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 tax invoice
GET/
- Access
- API key. Scoped keys need
account:read. - Rate limit
- 100 requests per second (the default)
JSON by default; format=html returns a printable invoice page.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | - |
format | query | string | html returns a printable pageOne of json, html |
Response 200
| Field | Type | Description |
|---|---|---|
datarequired | object | - |
idrequireddata.id | string (uuid) | - |
seqrequireddata.seq | integer | Gap-free per-account sequence |
numberrequireddata.number | string | - |
periodrequireddata.period | string | YYYY-MM |
periodStartrequireddata.periodStart | string (date-time) | ISO-8601 timestamp (UTC) |
periodEndrequireddata.periodEnd | string (date-time) | ISO-8601 timestamp (UTC) |
currencyrequireddata.currency | string | - |
subtotalrequireddata.subtotal | string | Decimal string |
taxAmountrequireddata.taxAmount | string | Decimal string |
totalrequireddata.total | string | Decimal string |
createdAtrequireddata.createdAt | string (date-time) | ISO-8601 timestamp (UTC) |
dataJsonrequireddata.dataJson | object | null | Frozen line items and the tax section as issued |
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.