Skip to content
Markets open

API reference

Account

Your profile, balance, preferences, team and account-level settings.

34 operationsBase URL https://packetexchange.io/api/v1Postman collection

BrowseAccount

Get your account profile

GET/api/v1/account

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

Profile, balance and account state. Secrets are never included.

Response 200

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring (uuid)-
emailrequireddata.emailstring (email)-
contactNamerequireddata.contactNamestring-
companyNamerequireddata.companyNamestring | null-
jobTitlerequireddata.jobTitlestring | null-
phonerequireddata.phonestring | null-
countryrequireddata.countrystring | nullISO-3166-1 alpha-2
timezonerequireddata.timezonestring-
companyLogoUrlrequireddata.companyLogoUrlstring | null-
avatarUrlrequireddata.avatarUrlstring | null-
rolerequireddata.rolestring-One of user, admin
statusrequireddata.statusstring-One of active, suspended
accountKindrequireddata.accountKindstring-
balancerequireddata.balancemoneyUSD as a decimal string with exactly 6 places, e.g. "0.012500".
testCreditrequireddata.testCreditmoneySandbox credit, spendable only by test API keys USD as a decimal string with exactly 6 places, e.g. "0.012500".
emailVerifiedAtrequireddata.emailVerifiedAtstring (date-time) | nullISO-8601 timestamp (UTC)
pendingEmailrequireddata.pendingEmailstring | nullAn address change waiting for confirmation
verificationStatusrequireddata.verificationStatusstring-One of unverified, verified
kycStatusrequireddata.kycStatusstring-One of not_started, pending, verified, rejected
totpEnabledrequireddata.totpEnabledbooleanTwo-factor authentication is on
taxIdrequireddata.taxIdstring | null-
taxCountryrequireddata.taxCountrystring | null-
payoutMethodrequireddata.payoutMethodstring | null-
onboardingGoalrequireddata.onboardingGoalstring | null-
onboardingDismissedrequireddata.onboardingDismissedboolean-
onboardingSeenrequireddata.onboardingSeenboolean-
emailNotificationsOptOutrequireddata.emailNotificationsOptOutboolean-
switchStatusrequireddata.switchStatusstring-One of none, active, past_due, canceled, comp
createdAtrequireddata.createdAtstring (date-time)ISO-8601 timestamp (UTC)
updatedAtrequireddata.updatedAtstring (date-time)ISO-8601 timestamp (UTC)

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Update your account profile

PUT/api/v1/account

Access
Dashboard session. API keys are refused with 403. Use a login access token.
Rate limit
100 requests per second (the default)

Every field is optional; send only what changes. An empty string clears an optional text field. Session only because it can change the payout destination.

Request body (application/json)

FieldTypeDescription
companyNamestring-max 255 chars
contactNamestring-max 255 chars
companyLogoUrlstring-max 400000 chars
jobTitlestring-max 120 chars
avatarUrlstring-max 400000 chars
phonestring-max 20 chars
countrystring-max 2 chars
timezonestring-max 50 chars
taxIdstring-max 64 chars
taxCountrystring-max 2 chars
payoutMethodstring-
payoutCryptoTokenstring-max 20 chars
payoutCryptoNetworkstring-max 40 chars
payoutCryptoAddressstring-max 120 chars
payoutWireDetailsstring-max 2000 chars
emailNotificationsOptOutboolean-

Response 200

FieldTypeDescription
datarequiredobjectSame fields as AccountProfile, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get one headline figure per workspace

GET/api/v1/account/hub-stats

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

Counts for the post-login hub. A figure that cannot be computed is null, never a guess.

Response 200

FieldTypeDescription
datarequiredobject-
traderequireddata.tradenumber | null-
switchrequireddata.switchnumber | null-
outboundrequireddata.outboundnumber | null-
revenue-numbersrequireddata.revenue-numbersnumber | null-
numbers-storerequireddata.numbers-storenumber | null-
developersrequireddata.developersnumber | null-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get which walkthrough steps the account has completed

GET/api/v1/account/guide-progress

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

Each key is a step signal derived from real data (a route exists, a call was made), true or false.

Response 200

FieldTypeDescription
datarequiredobject-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Request an email address change

POST/api/v1/account/email

Access
Dashboard session. API keys are refused with 403. Use a login access token.
Rate limit
100 requests per second (the default)

Needs the current password. Sends a confirmation link to the new address; the address changes only when it is confirmed. The old address is told.

Request body (application/json)

FieldTypeDescription
newEmailrequiredstring (email)-max 255 chars
currentPasswordrequiredstring-

Response 200

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring (uuid)-
emailrequireddata.emailstring (email)-
contactNamerequireddata.contactNamestring-
companyNamerequireddata.companyNamestring | null-
jobTitlerequireddata.jobTitlestring | null-
phonerequireddata.phonestring | null-
countryrequireddata.countrystring | nullISO-3166-1 alpha-2
timezonerequireddata.timezonestring-
companyLogoUrlrequireddata.companyLogoUrlstring | null-
avatarUrlrequireddata.avatarUrlstring | null-
rolerequireddata.rolestring-One of user, admin
statusrequireddata.statusstring-One of active, suspended
accountKindrequireddata.accountKindstring-
balancerequireddata.balancemoneyUSD as a decimal string with exactly 6 places, e.g. "0.012500".
testCreditrequireddata.testCreditmoneySandbox credit, spendable only by test API keys USD as a decimal string with exactly 6 places, e.g. "0.012500".
emailVerifiedAtrequireddata.emailVerifiedAtstring (date-time) | nullISO-8601 timestamp (UTC)
pendingEmailrequireddata.pendingEmailstring | nullAn address change waiting for confirmation
verificationStatusrequireddata.verificationStatusstring-One of unverified, verified
kycStatusrequireddata.kycStatusstring-One of not_started, pending, verified, rejected
totpEnabledrequireddata.totpEnabledbooleanTwo-factor authentication is on
taxIdrequireddata.taxIdstring | null-
taxCountryrequireddata.taxCountrystring | null-
payoutMethodrequireddata.payoutMethodstring | null-
onboardingGoalrequireddata.onboardingGoalstring | null-
onboardingDismissedrequireddata.onboardingDismissedboolean-
onboardingSeenrequireddata.onboardingSeenboolean-
emailNotificationsOptOutrequireddata.emailNotificationsOptOutboolean-
switchStatusrequireddata.switchStatusstring-One of none, active, past_due, canceled, comp
createdAtrequireddata.createdAtstring (date-time)ISO-8601 timestamp (UTC)
updatedAtrequireddata.updatedAtstring (date-time)ISO-8601 timestamp (UTC)
pendingVerificationrequireddata.pendingVerificationboolean-One of true

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Confirm an email change from a signed-in session

POST/api/v1/account/email/confirm

Access
Dashboard session. API keys are refused with 403. Use a login access token.
Rate limit
100 requests per second (the default)

Same effect as the public POST /auth/confirm-email-change, which is what the emailed link uses.

Request body (application/json)

FieldTypeDescription
tokenrequiredstring-

Response 200

FieldTypeDescription
datarequiredobject-
emailrequireddata.emailstring (email)-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List recent security activity

GET/api/v1/account/activity

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

The latest 50 security events on the account (sign-ins, password and key changes), newest first.

Response 200

FieldTypeDescription
datarequiredobject[]-
idrequireddata[].idstring (uuid)-
typerequireddata[].typestringe.g. login, password_change, api_key_created, session_revoked
iprequireddata[].ipstring | null-
userAgentrequireddata[].userAgentstring | null-
metarequireddata[].metaobject | null-
createdAtrequireddata[].createdAtstring (date-time)ISO-8601 timestamp (UTC)

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Export all your account data

GET/api/v1/account/export

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

A data-protection export of everything held about the account. JSON by default (served as an attachment); format=xlsx returns a workbook with one sheet per dataset.

Parameters

NameInTypeDescription
formatquerystring-One of json, xlsx, excel

Response 200

FieldTypeDescription
datarequiredobject-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Close your account

POST/api/v1/account/close

Access
Dashboard session. API keys are refused with 403. Use a login access token.
Rate limit
100 requests per second (the default)

Needs the password (and a 2FA code when 2FA is on). Personal data is anonymised; financial records are kept. A balance under the payout minimum can only be closed by opting in to forfeitBalance and echoing the exact forfeitAmountUsd from GET /account/close/preview.

Request body (application/json)

FieldTypeDescription
passwordrequiredstring-
codestring-
forfeitBalanceboolean-
confirmForfeitAmountUsdnumber | string-

Response 200

FieldTypeDescription
datarequiredobject-
messagerequireddata.messagestring-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Preview what closing the account would take

GET/api/v1/account/close/preview

Access
Dashboard session. API keys are refused with 403. Use a login access token.
Rate limit
100 requests per second (the default)

What is withdrawable, held or would be forfeited, and whether the account can be closed now.

Response 200

FieldTypeDescription
datarequiredobject-
balanceUsdrequireddata.balanceUsdstringUSD, 2-decimal string
heldUsdrequireddata.heldUsdstringHeld back because it came from a recent card top-up
withdrawableUsdrequireddata.withdrawableUsdstring-
minWithdrawalUsdrequireddata.minWithdrawalUsdnumber-
pendingPayoutsrequireddata.pendingPayoutsinteger-
revshareEarningsUsdrequireddata.revshareEarningsUsdstring-
pendingRevsharePayoutsrequireddata.pendingRevsharePayoutsinteger-
canCloseNowrequireddata.canCloseNowboolean-
canWithdrawrequireddata.canWithdrawboolean-
revshareCanWithdrawrequireddata.revshareCanWithdrawboolean-
forfeitRequiredrequireddata.forfeitRequiredbooleanThe only way out is to give up an amount stuck under the payout minimum
forfeitBalanceUsdrequireddata.forfeitBalanceUsdstring | null-
forfeitRevshareUsdrequireddata.forfeitRevshareUsdstring | null-
forfeitAmountUsdrequireddata.forfeitAmountUsdstring | nullEcho this exact figure as confirmForfeitAmountUsd to close with a forfeit
messagerequireddata.messagestring-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Save your onboarding goal

POST/api/v1/account/onboarding

Access
API key. Scoped keys need account:write.
Rate limit
100 requests per second (the default)

Records the first-run goal, or marks the welcome wizard seen or dismissed.

Request body (application/json)

FieldTypeDescription
goalstring-One of buyer, seller, developer, reseller
dismissedboolean-
seenboolean-

Response 200

FieldTypeDescription
datarequiredobjectSame fields as AccountProfile, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get your balance and test credit

GET/api/v1/account/balance

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

Response 200

FieldTypeDescription
datarequiredobject-
balancerequireddata.balancemoneyUSD as a decimal string with exactly 6 places, e.g. "0.012500".
testCreditrequireddata.testCreditmoneyUSD as a decimal string with exactly 6 places, e.g. "0.012500".
totalrequireddata.totalmoneybalance + testCredit USD as a decimal string with exactly 6 places, e.g. "0.012500".

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get your Switch plan and trial status

GET/api/v1/account/switch-subscription

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

Works without a Switch plan: this is how an account finds out it has none.

Response 200

FieldTypeDescription
datarequiredobject-
activerequireddata.activebooleanMay this account use the Switch right now
statusrequireddata.statusstring-One of none, active, past_due, canceled, comp
accessUntilrequireddata.accessUntilstring (date-time) | nullISO-8601 timestamp (UTC)
comprequireddata.compboolean-
nodeNftrequireddata.nodeNftbooleanAccess comes from a held Switch Node NFT
priceUsdrequireddata.priceUsdnumberMonthly plan price in USD (a number, not a ledger amount)
planrequireddata.planstring-
purchasablePlansrequireddata.purchasablePlansstring[]-One of starter, essentials, standard, growth, carrier
onTrialrequireddata.onTrialboolean-
trialEndsAtrequireddata.trialEndsAtstring (date-time) | nullISO-8601 timestamp (UTC)
trialEligiblerequireddata.trialEligibleboolean-
trialDaysrequireddata.trialDaysinteger-
trialApplicationrequireddata.trialApplicationobject | null-
idrequireddata.trialApplication.idstring (uuid)-
statusrequireddata.trialApplication.statusstring-One of pending, approved, declined
desiredPlanrequireddata.trialApplication.desiredPlanstring-
submittedAtrequireddata.trialApplication.submittedAtstring (date-time)ISO-8601 timestamp (UTC)
reviewedAtrequireddata.trialApplication.reviewedAtstring (date-time) | nullISO-8601 timestamp (UTC)
firstChargeDeferredTorequireddata.firstChargeDeferredTostring (date-time) | nullISO-8601 timestamp (UTC)
cancelAtrequireddata.cancelAtstring (date-time) | nullISO-8601 timestamp (UTC)
manageablerequireddata.manageablebooleanHas a card subscription that the billing portal can manage

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Start a Switch subscription checkout

POST/api/v1/account/switch-subscription/checkout

Access
Dashboard session. API keys are refused with 403. Use a login access token.
Rate limit
10 requests per 5 minutes
Moves money
Starts a paid Switch subscription checkout.

Returns a card checkout url to open, and when the first charge falls. Answers { alreadyActive: true } when the account already has the Switch, or { alreadySubscribed: true } when a subscription exists that our record had not caught up with.

Request body (application/json)

FieldTypeDescription
planstring-default "standard"One of starter, essentials, standard, growth, carrier

Response 200

FieldTypeDescription
datarequiredobject-
urldata.urlstring (uri)-
firstChargeAtdata.firstChargeAtstring (date-time)ISO-8601 timestamp (UTC)
alreadyActivedata.alreadyActiveboolean-One of true
alreadySubscribeddata.alreadySubscribedboolean-One of true

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.
  • AlsoSWITCH_BILLING_UNCONFIGURED, SWITCH_PRICE_MISMATCH

Get your Switch free-trial application

GET/api/v1/account/switch-trial-application

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

Eligibility, the latest application if any, and profile values to prefill the form.

Response 200

FieldTypeDescription
datarequiredobject-
eligiblerequireddata.eligibleboolean-
trialDaysrequireddata.trialDaysinteger-
hasSwitchrequireddata.hasSwitchboolean-
comprequireddata.compboolean-
onTrialrequireddata.onTrialboolean-
trialEndsAtrequireddata.trialEndsAtstring (date-time) | nullISO-8601 timestamp (UTC)
applicationrequireddata.applicationobject | null-
idrequireddata.application.idstring (uuid)-
statusrequireddata.application.statusstring-One of pending, approved, declined
desiredPlanrequireddata.application.desiredPlanstring-
submittedAtrequireddata.application.submittedAtstring (date-time)ISO-8601 timestamp (UTC)
reviewedAtrequireddata.application.reviewedAtstring (date-time) | nullISO-8601 timestamp (UTC)
grantedPlanrequireddata.application.grantedPlanstring | null-
trialEndsAtrequireddata.application.trialEndsAtstring (date-time) | nullISO-8601 timestamp (UTC)
prefillrequireddata.prefillobject-
companyNamerequireddata.prefill.companyNamestring-
contactNamerequireddata.prefill.contactNamestring-
countryrequireddata.prefill.countrystring-
contactPhonerequireddata.prefill.contactPhonestring-
contactRolerequireddata.prefill.contactRolestring-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Apply for a Switch free trial

POST/api/v1/account/switch-trial-application

Access
Dashboard session. API keys are refused with 403. Use a login access token.
Rate limit
5 requests per 10 minutes

Our team reviews every application by hand. Refused with CONFLICT when the account already has the Switch or an application is pending.

Request body (application/json)

FieldTypeDescription
companyNamerequiredstring-max 255 chars
companyWebsitestring | null-max 255 chars
countrystring | null-
contactNamerequiredstring-max 255 chars
contactRolestring | null-max 120 chars
contactPhonestring | null-max 40 chars
desiredPlanrequiredstring-One of starter, essentials, standard, growth, carrier
expectedCpsinteger | null-0 to 100000
expectedChannelsinteger | null-0 to 10000000
expectedMonthlyMinutesinteger | null-0 to 100000000000
trafficProfilestring | null-max 2000 chars
currentSetupstring | null-max 2000 chars
notesstring | null-max 4000 chars

Response 200

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring (uuid)-
statusrequireddata.statusstring-One of pending, approved, declined
submittedAtrequireddata.submittedAtstring (date-time)ISO-8601 timestamp (UTC)

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Open the Switch billing portal

POST/api/v1/account/switch-subscription/portal

Access
Dashboard session. API keys are refused with 403. Use a login access token.
Rate limit
10 requests per 5 minutes

Returns a URL where the card, cancellation and invoices of the Switch subscription are managed.

Response 200

FieldTypeDescription
datarequiredobject-
urlrequireddata.urlstring (uri)-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.
  • AlsoSWITCH_NO_SUBSCRIPTION

Start two-factor authentication setup

POST/api/v1/account/2fa/setup

Access
Dashboard session. API keys are refused with 403. Use a login access token.
Rate limit
100 requests per second (the default)

Generates a pending secret and an otpauth:// URI for an authenticator app. Nothing changes until POST /account/2fa/enable confirms a code.

Response 200

FieldTypeDescription
datarequiredobject-
secretrequireddata.secretstring-
otpauthUrirequireddata.otpauthUristring-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Turn on two-factor authentication

POST/api/v1/account/2fa/enable

Access
Dashboard session. API keys are refused with 403. Use a login access token.
Rate limit
100 requests per second (the default)

Confirms a code from the authenticator and returns one-time backup codes, shown only this once.

Request body (application/json)

FieldTypeDescription
coderequiredstring6-digit authenticator code

Response 200

FieldTypeDescription
datarequiredobject-
backupCodesrequireddata.backupCodesstring[]-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Turn off two-factor authentication

POST/api/v1/account/2fa/disable

Access
Dashboard session. API keys are refused with 403. Use a login access token.
Rate limit
100 requests per second (the default)

Request body (application/json)

FieldTypeDescription
codestring-
passwordstring-

Response 200

FieldTypeDescription
datarequiredobjectSame fields as Message, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get your spend alert settings

GET/api/v1/account/alerts

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

Defaults (no thresholds, email on) when nothing has been saved.

Response 200

FieldTypeDescription
datarequiredobject-
lowBalanceThresholdrequireddata.lowBalanceThresholdstring | nullUSD, 2-decimal string; null = no low-balance alert
dailySpendCaprequireddata.dailySpendCapstring | nullUSD, 2-decimal string; null = no daily cap alert
notifyEmailrequireddata.notifyEmailboolean-
updatedAtrequireddata.updatedAtstring (date-time) | nullISO-8601 timestamp (UTC)

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Update your spend alert settings

PUT/api/v1/account/alerts

Access
API key. Scoped keys need account:write.
Rate limit
100 requests per second (the default)

Send at least one field. Thresholds are USD amounts; null removes one.

Request body (application/json)

FieldTypeDescription
lowBalanceThresholdnumber | null-min 0
dailySpendCapnumber | null-min 0
notifyEmailboolean-

Response 200

FieldTypeDescription
datarequiredobjectSame fields as AccountSpendAlerts, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List your saved marketplace searches

GET/api/v1/account/saved-searches

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

Response 200

FieldTypeDescription
datarequiredobject[]-
idrequireddata[].idstring (uuid)-
userIdrequireddata[].userIdstring (uuid)-
namerequireddata[].namestring-
filtersrequireddata[].filtersobjectMarketplace filter values, as the marketplace query parameters
createdAtrequireddata[].createdAtstring (date-time)ISO-8601 timestamp (UTC)

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Save a marketplace search

POST/api/v1/account/saved-searches

Access
API key. Scoped keys need account:write.
Rate limit
100 requests per second (the default)

Up to 50 per account; the 51st is refused with CONFLICT.

Request body (application/json)

FieldTypeDescription
namerequiredstring-max 100 chars
filtersrequiredobject-

Response 201

FieldTypeDescription
datarequiredobjectSame fields as AccountSavedSearch, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Delete a saved search

DELETE/api/v1/account/saved-searches/{id}

Access
API key. Scoped keys need account:write.
Rate limit
100 requests per second (the default)

Parameters

NameInTypeDescription
idrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
idrequireddata.idstring (uuid)-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List your favorite routes

GET/api/v1/account/favorites

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

Only routes you can still see (public and active, your own, or privately granted).

Response 200

FieldTypeDescription
datarequiredobject[]-
favoriteIdrequireddata[].favoriteIdstring (uuid)-
favoritedAtrequireddata[].favoritedAtstring (date-time)ISO-8601 timestamp (UTC)
idrequireddata[].idstring (uuid)The route id
typerequireddata[].typestring-One of voice, sms
countryrequireddata[].countrystring-
destinationNamerequireddata[].destinationNamestringThe listing name as a buyer reads it: generated by the platform, never the seller's text, and ending in the listing reference (e.g. "Niger Mobile · Ref 7K2Q", "A-Z Voice · Premium · Full CLI · Ref 3MX9"). Your own listings keep the name you gave them.
listingRefdata[].listingRefstringAnonymous short reference of the listing (4 characters, e.g. "7K2Q"): stable for the life of the listing, unique enough to tell two same-named listings apart, and derived from the listing alone (it says nothing about the seller). Absent on your own listings.
pricePerUnitrequireddata[].pricePerUnitmoneyUSD per minute (voice) or per message segment (SMS) USD as a decimal string with exactly 6 places, e.g. "0.012500".
billingIncrementrequireddata[].billingIncrementstring | null-
statusrequireddata[].statusstring-
expectedAsrrequireddata[].expectedAsrstring | nullSeller-stated ASR %, 2-decimal string
expectedAcdrequireddata[].expectedAcdstring | nullSeller-stated ACD in minutes, 2-decimal string
dialerCompatiblerequireddata[].dialerCompatibleboolean-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Add a route to your favorites

POST/api/v1/account/favorites

Access
API key. Scoped keys need account:write.
Rate limit
100 requests per second (the default)

Idempotent: favoriting twice is not an error.

Request body (application/json)

FieldTypeDescription
routeIdrequiredstring (uuid)-

Response 201

FieldTypeDescription
datarequiredobject-
routeIdrequireddata.routeIdstring (uuid)-
favoritedrequireddata.favoritedboolean-One of true
idrequireddata.idstring (uuid) | null-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Remove a route from your favorites

DELETE/api/v1/account/favorites/{routeId}

Access
API key. Scoped keys need account:write.
Rate limit
100 requests per second (the default)

Idempotent: removing a route that is not a favorite is not an error.

Parameters

NameInTypeDescription
routeIdrequiredpathstring-

Response 200

FieldTypeDescription
datarequiredobject-
routeIdrequireddata.routeIdstring (uuid)-
favoritedrequireddata.favoritedboolean-One of false

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

List your dedicated IP addresses

GET/api/v1/account/ips

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

Empty, with enabled: false, while dedicated IPs are not offered.

Response 200

FieldTypeDescription
datarequiredobject[]-
assignmentIdrequireddata[].assignmentIdstring (uuid)-
ipIdrequireddata[].ipIdstring (uuid)-
addressrequireddata[].addressstring-
rolerequireddata[].rolestringingress = where you send traffic; egress = where your calls leave fromOne of ingress, egress
boundBoxrequireddata[].boundBoxstring | null-
assignedAtrequireddata[].assignedAtstring (date-time)ISO-8601 timestamp (UTC)
hintrequireddata[].hintstringPlain-English instruction for this address
enabledboolean-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get your SIP interconnect details

GET/api/v1/account/ips/interconnect

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

Everything needed to connect: where to send traffic, which addresses our calls leave from, and what is already authorised.

Response 200

FieldTypeDescription
datarequiredobject-
enableddata.enabledboolean-
myIngressIprequireddata.myIngressIpstring | null-
myEgressIprequireddata.myEgressIpstring | null-
egressPendingNetworkdata.egressPendingNetworkboolean-
edgeIprequireddata.edgeIpstringThe shared address to send SIP to when you hold no dedicated one
egressIpsrequireddata.egressIpsstring[]Addresses our calls leave from; whitelist these with your carriers
rtpPortRangerequireddata.rtpPortRangestring-
sipPortrequireddata.sipPortinteger-
onPlatformrequireddata.onPlatformboolean-
onPlatformSignalsrequireddata.onPlatformSignalsobject-
switchOperatorrequireddata.onPlatformSignals.switchOperatorboolean-
marketplaceBuyerrequireddata.onPlatformSignals.marketplaceBuyerboolean-
dialerUserrequireddata.onPlatformSignals.dialerUserboolean-
autoAuthorizedrequireddata.autoAuthorizedboolean-
manualWhitelistNeededrequireddata.manualWhitelistNeededboolean-
authorizedIpsrequireddata.authorizedIpsstring[]-
poolAvailablerequireddata.poolAvailableinteger-
egressPoolAvailablerequireddata.egressPoolAvailableinteger-
egressAvailablerequireddata.egressAvailableboolean-
sipUsernamerequireddata.sipUsernamestring | null-
hasSipPasswordrequireddata.hasSipPasswordboolean-
enabledboolean-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Get your connectivity brief

GET/api/v1/account/ips/connectivity

Access
API key. Scoped keys need account:read.
Rate limit
100 requests per second (the default)

Where to send traffic, what to whitelist and how you are recognised, including per-purchase destinations, in plain language.

Response 200

FieldTypeDescription
datarequiredobject-
dedicatedIpsEnabledrequireddata.dedicatedIpsEnabledboolean-
myAddressrequireddata.myAddressstring | null-
myAddressSummaryrequireddata.myAddressSummarystring-
sendTorequireddata.sendTostringWhere to send your SIP traffic
sendToPortrequireddata.sendToPortinteger-
sendToSummaryrequireddata.sendToSummarystring-
egressModerequireddata.egressModestring-One of dedicated, shared
egressAddressesrequireddata.egressAddressesstring[]-
egressSummaryrequireddata.egressSummarystring-
authMethodsrequireddata.authMethodsstring[]-One of ip, digest
authSummaryrequireddata.authSummarystring-
authorizedSourceIpsrequireddata.authorizedSourceIpsstring[]-
purchasedRoutesrequireddata.purchasedRoutesobject[]-
purchaseIdrequireddata.purchasedRoutes[].purchaseIdstring (uuid)-
routeIdrequireddata.purchasedRoutes[].routeIdstring (uuid)-
routeNamerequireddata.purchasedRoutes[].routeNamestring | null-
destinationrequireddata.purchasedRoutes[].destinationstring | null-
typerequireddata.purchasedRoutes[].typestring-
statusrequireddata.purchasedRoutes[].statusstring-
sendTorequireddata.purchasedRoutes[].sendTostring-
sendToPortrequireddata.purchasedRoutes[].sendToPortinteger-
sipUsernamerequireddata.purchasedRoutes[].sipUsernamestring | null-
rtpPortRangerequireddata.rtpPortRangestring-
codecsrequireddata.codecsstring[]-
autoAuthorizedrequireddata.autoAuthorizedboolean-
manualWhitelistNeededrequireddata.manualWhitelistNeededboolean-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Take a dedicated ingress IP

POST/api/v1/account/ips/activate

Access
API key. Scoped keys need account:write.
Rate limit
100 requests per second (the default)
Moves money
Takes a dedicated IP address.

Idempotent: when you already hold one it is returned with created: false and nothing is charged. Answers 201 when a new address was assigned.

Response 200

FieldTypeDescription
datarequiredobject-
assignmentIdrequireddata.assignmentIdstring (uuid)-
ipIdrequireddata.ipIdstring (uuid)-
addressrequireddata.addressstring-
rolerequireddata.rolestringingress = where you send traffic; egress = where your calls leave fromOne of ingress, egress
boundBoxrequireddata.boundBoxstring | null-
assignedAtrequireddata.assignedAtstring (date-time)ISO-8601 timestamp (UTC)
hintrequireddata.hintstringPlain-English instruction for this address
createdrequireddata.createdbooleanFalse when you already held one (idempotent replay)
monthlyPriceUsdrequireddata.monthlyPriceUsdnumberMonthly premium in USD (a number)
chargedrequireddata.chargednumberUSD booked by THIS call; 0 on a replay

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Take a dedicated egress IP

POST/api/v1/account/ips/activate-egress

Access
API key. Scoped keys need account:write.
Rate limit
100 requests per second (the default)
Moves money
Takes a dedicated IP address.

Idempotent like the ingress version. Refused with VALIDATION_ERROR while dedicated sending addresses are not available.

Response 200

FieldTypeDescription
datarequiredobjectSame fields as AccountActivatedIp, shown earlier on this page.

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.

Release a dedicated IP

POST/api/v1/account/ips/{id}/release

Access
API key. Scoped keys need account:write.
Rate limit
100 requests per second (the default)

Hands the address back to the pool. id is the assignment id or IP id from the list.

Parameters

NameInTypeDescription
idrequiredpathstring (uuid)-

Response 200

FieldTypeDescription
datarequiredobject-
releasedrequireddata.releasedboolean-One of true
addressrequireddata.addressstring-
ipIdrequireddata.ipIdstring (uuid)-

Errors

  • 400VALIDATION_ERROR, INVALID_INPUT or BAD_REQUEST. For VALIDATION_ERROR, error.details is an array of { path, message }.
  • 401UNAUTHORIZED: missing, invalid, expired or revoked credential.
  • 403FORBIDDEN: not allowed - a scoped key lacks the scope, or the endpoint is session-only.
  • 404NOT_FOUND: no such resource on your account.
  • 409CONFLICT (or a code-specific 409): the change clashes with existing state.
  • 429RATE_LIMITED: slow down and retry after the Retry-After seconds.
  • 500INTERNAL_ERROR: unexpected failure. Quote X-Request-Id to support.