Skip to content

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

  • datarequired

    object

  • idrequired

    string (uuid) · data.id

  • emailrequired

    string (email) · data.email

  • contactNamerequired

    string · data.contactName

  • companyNamerequired

    string | null · data.companyName

  • jobTitlerequired

    string | null · data.jobTitle

  • phonerequired

    string | null · data.phone

  • countryrequired

    string | null · data.country

    ISO-3166-1 alpha-2
  • timezonerequired

    string · data.timezone

  • companyLogoUrlrequired

    string | null · data.companyLogoUrl

  • avatarUrlrequired

    string | null · data.avatarUrl

  • rolerequired

    string · data.role

    One of user, admin
  • statusrequired

    string · data.status

    One of active, suspended
  • accountKindrequired

    string · data.accountKind

  • balancerequired

    money · data.balance

    USD as a decimal string with exactly 6 places, e.g. "0.012500".
  • testCreditrequired

    money · data.testCredit

    Sandbox credit, spendable only by test API keys USD as a decimal string with exactly 6 places, e.g. "0.012500".
  • emailVerifiedAtrequired

    string (date-time) | null · data.emailVerifiedAt

    ISO-8601 timestamp (UTC)
  • pendingEmailrequired

    string | null · data.pendingEmail

    An address change waiting for confirmation
  • verificationStatusrequired

    string · data.verificationStatus

    One of unverified, verified
  • kycStatusrequired

    string · data.kycStatus

    One of not_started, pending, verified, rejected
  • totpEnabledrequired

    boolean · data.totpEnabled

    Two-factor authentication is on
  • taxIdrequired

    string | null · data.taxId

  • taxCountryrequired

    string | null · data.taxCountry

  • payoutMethodrequired

    string | null · data.payoutMethod

  • onboardingGoalrequired

    string | null · data.onboardingGoal

  • onboardingDismissedrequired

    boolean · data.onboardingDismissed

  • onboardingSeenrequired

    boolean · data.onboardingSeen

  • emailNotificationsOptOutrequired

    boolean · data.emailNotificationsOptOut

  • switchStatusrequired

    string · data.switchStatus

    One of none, active, past_due, canceled, comp
  • createdAtrequired

    string (date-time) · data.createdAt

    ISO-8601 timestamp (UTC)
  • updatedAtrequired

    string (date-time) · data.updatedAt

    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)

  • companyName

    string

    max 255 chars
  • contactName

    string

    max 255 chars
  • companyLogoUrl

    string

    max 400000 chars
  • jobTitle

    string

    max 120 chars
  • avatarUrl

    string

    max 400000 chars
  • phone

    string

    max 20 chars
  • country

    string

    max 2 chars
  • timezone

    string

    max 50 chars
  • taxId

    string

    max 64 chars
  • taxCountry

    string

    max 2 chars
  • payoutMethod

    string

  • payoutCryptoToken

    string

    max 20 chars
  • payoutCryptoNetwork

    string

    max 40 chars
  • payoutCryptoAddress

    string

    max 120 chars
  • payoutWireDetails

    string

    max 2000 chars
  • emailNotificationsOptOut

    boolean

Response 200

  • datarequired

    object

    Same 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

  • datarequired

    object

  • traderequired

    number | null · data.trade

  • switchrequired

    number | null · data.switch

  • outboundrequired

    number | null · data.outbound

  • revenue-numbersrequired

    number | null · data.revenue-numbers

  • numbers-storerequired

    number | null · data.numbers-store

  • developersrequired

    number | null · data.developers

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

  • datarequired

    object

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)

  • newEmailrequired

    string (email)

    max 255 chars
  • currentPasswordrequired

    string

Response 200

  • datarequired

    object

  • idrequired

    string (uuid) · data.id

  • emailrequired

    string (email) · data.email

  • contactNamerequired

    string · data.contactName

  • companyNamerequired

    string | null · data.companyName

  • jobTitlerequired

    string | null · data.jobTitle

  • phonerequired

    string | null · data.phone

  • countryrequired

    string | null · data.country

    ISO-3166-1 alpha-2
  • timezonerequired

    string · data.timezone

  • companyLogoUrlrequired

    string | null · data.companyLogoUrl

  • avatarUrlrequired

    string | null · data.avatarUrl

  • rolerequired

    string · data.role

    One of user, admin
  • statusrequired

    string · data.status

    One of active, suspended
  • accountKindrequired

    string · data.accountKind

  • balancerequired

    money · data.balance

    USD as a decimal string with exactly 6 places, e.g. "0.012500".
  • testCreditrequired

    money · data.testCredit

    Sandbox credit, spendable only by test API keys USD as a decimal string with exactly 6 places, e.g. "0.012500".
  • emailVerifiedAtrequired

    string (date-time) | null · data.emailVerifiedAt

    ISO-8601 timestamp (UTC)
  • pendingEmailrequired

    string | null · data.pendingEmail

    An address change waiting for confirmation
  • verificationStatusrequired

    string · data.verificationStatus

    One of unverified, verified
  • kycStatusrequired

    string · data.kycStatus

    One of not_started, pending, verified, rejected
  • totpEnabledrequired

    boolean · data.totpEnabled

    Two-factor authentication is on
  • taxIdrequired

    string | null · data.taxId

  • taxCountryrequired

    string | null · data.taxCountry

  • payoutMethodrequired

    string | null · data.payoutMethod

  • onboardingGoalrequired

    string | null · data.onboardingGoal

  • onboardingDismissedrequired

    boolean · data.onboardingDismissed

  • onboardingSeenrequired

    boolean · data.onboardingSeen

  • emailNotificationsOptOutrequired

    boolean · data.emailNotificationsOptOut

  • switchStatusrequired

    string · data.switchStatus

    One of none, active, past_due, canceled, comp
  • createdAtrequired

    string (date-time) · data.createdAt

    ISO-8601 timestamp (UTC)
  • updatedAtrequired

    string (date-time) · data.updatedAt

    ISO-8601 timestamp (UTC)
  • pendingVerificationrequired

    boolean · data.pendingVerification

    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)

  • tokenrequired

    string

Response 200

  • datarequired

    object

  • emailrequired

    string (email) · data.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

  • datarequired

    object[]

  • idrequired

    string (uuid) · data[].id

  • typerequired

    string · data[].type

    e.g. login, password_change, api_key_created, session_revoked
  • iprequired

    string | null · data[].ip

  • userAgentrequired

    string | null · data[].userAgent

  • metarequired

    object | null · data[].meta

  • createdAtrequired

    string (date-time) · data[].createdAt

    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

  • format

    query · string

    One of json, xlsx, excel

Response 200

  • datarequired

    object

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)

  • passwordrequired

    string

  • code

    string

  • forfeitBalance

    boolean

  • confirmForfeitAmountUsd

    number | string

Response 200

  • datarequired

    object

  • messagerequired

    string · data.message

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

  • datarequired

    object

  • balanceUsdrequired

    string · data.balanceUsd

    USD, 2-decimal string
  • heldUsdrequired

    string · data.heldUsd

    Held back because it came from a recent card top-up
  • withdrawableUsdrequired

    string · data.withdrawableUsd

  • minWithdrawalUsdrequired

    number · data.minWithdrawalUsd

  • pendingPayoutsrequired

    integer · data.pendingPayouts

  • revshareEarningsUsdrequired

    string · data.revshareEarningsUsd

  • pendingRevsharePayoutsrequired

    integer · data.pendingRevsharePayouts

  • canCloseNowrequired

    boolean · data.canCloseNow

  • canWithdrawrequired

    boolean · data.canWithdraw

  • revshareCanWithdrawrequired

    boolean · data.revshareCanWithdraw

  • forfeitRequiredrequired

    boolean · data.forfeitRequired

    The only way out is to give up an amount stuck under the payout minimum
  • forfeitBalanceUsdrequired

    string | null · data.forfeitBalanceUsd

  • forfeitRevshareUsdrequired

    string | null · data.forfeitRevshareUsd

  • forfeitAmountUsdrequired

    string | null · data.forfeitAmountUsd

    Echo this exact figure as confirmForfeitAmountUsd to close with a forfeit
  • messagerequired

    string · data.message

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)

  • goal

    string

    One of buyer, seller, developer, reseller
  • dismissed

    boolean

  • seen

    boolean

Response 200

  • datarequired

    object

    Same 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

  • datarequired

    object

  • balancerequired

    money · data.balance

    USD as a decimal string with exactly 6 places, e.g. "0.012500".
  • testCreditrequired

    money · data.testCredit

    USD as a decimal string with exactly 6 places, e.g. "0.012500".
  • totalrequired

    money · data.total

    balance + 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

  • datarequired

    object

  • activerequired

    boolean · data.active

    May this account use the Switch right now
  • statusrequired

    string · data.status

    One of none, active, past_due, canceled, comp
  • accessUntilrequired

    string (date-time) | null · data.accessUntil

    ISO-8601 timestamp (UTC)
  • comprequired

    boolean · data.comp

  • nodeNftrequired

    boolean · data.nodeNft

    Access comes from a held Switch Node NFT
  • priceUsdrequired

    number · data.priceUsd

    Monthly plan price in USD (a number, not a ledger amount)
  • planrequired

    string · data.plan

  • purchasablePlansrequired

    string[] · data.purchasablePlans

    One of starter, essentials, standard, growth, carrier
  • onTrialrequired

    boolean · data.onTrial

  • trialEndsAtrequired

    string (date-time) | null · data.trialEndsAt

    ISO-8601 timestamp (UTC)
  • trialEligiblerequired

    boolean · data.trialEligible

  • trialDaysrequired

    integer · data.trialDays

  • trialApplicationrequired

    object | null · data.trialApplication

  • idrequired

    string (uuid) · data.trialApplication.id

  • statusrequired

    string · data.trialApplication.status

    One of pending, approved, declined
  • desiredPlanrequired

    string · data.trialApplication.desiredPlan

  • submittedAtrequired

    string (date-time) · data.trialApplication.submittedAt

    ISO-8601 timestamp (UTC)
  • reviewedAtrequired

    string (date-time) | null · data.trialApplication.reviewedAt

    ISO-8601 timestamp (UTC)
  • firstChargeDeferredTorequired

    string (date-time) | null · data.firstChargeDeferredTo

    ISO-8601 timestamp (UTC)
  • cancelAtrequired

    string (date-time) | null · data.cancelAt

    ISO-8601 timestamp (UTC)
  • manageablerequired

    boolean · data.manageable

    Has 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)

  • plan

    string

    default "standard"One of starter, essentials, standard, growth, carrier

Response 200

  • datarequired

    object

  • url

    string (uri) · data.url

  • firstChargeAt

    string (date-time) · data.firstChargeAt

    ISO-8601 timestamp (UTC)
  • alreadyActive

    boolean · data.alreadyActive

    One of true
  • alreadySubscribed

    boolean · data.alreadySubscribed

    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

  • datarequired

    object

  • eligiblerequired

    boolean · data.eligible

  • trialDaysrequired

    integer · data.trialDays

  • hasSwitchrequired

    boolean · data.hasSwitch

  • comprequired

    boolean · data.comp

  • onTrialrequired

    boolean · data.onTrial

  • trialEndsAtrequired

    string (date-time) | null · data.trialEndsAt

    ISO-8601 timestamp (UTC)
  • applicationrequired

    object | null · data.application

  • idrequired

    string (uuid) · data.application.id

  • statusrequired

    string · data.application.status

    One of pending, approved, declined
  • desiredPlanrequired

    string · data.application.desiredPlan

  • submittedAtrequired

    string (date-time) · data.application.submittedAt

    ISO-8601 timestamp (UTC)
  • reviewedAtrequired

    string (date-time) | null · data.application.reviewedAt

    ISO-8601 timestamp (UTC)
  • grantedPlanrequired

    string | null · data.application.grantedPlan

  • trialEndsAtrequired

    string (date-time) | null · data.application.trialEndsAt

    ISO-8601 timestamp (UTC)
  • prefillrequired

    object · data.prefill

  • companyNamerequired

    string · data.prefill.companyName

  • contactNamerequired

    string · data.prefill.contactName

  • countryrequired

    string · data.prefill.country

  • contactPhonerequired

    string · data.prefill.contactPhone

  • contactRolerequired

    string · data.prefill.contactRole

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)

  • companyNamerequired

    string

    max 255 chars
  • companyWebsite

    string | null

    max 255 chars
  • country

    string | null

  • contactNamerequired

    string

    max 255 chars
  • contactRole

    string | null

    max 120 chars
  • contactPhone

    string | null

    max 40 chars
  • desiredPlanrequired

    string

    One of starter, essentials, standard, growth, carrier
  • expectedCps

    integer | null

    0 to 100000
  • expectedChannels

    integer | null

    0 to 10000000
  • expectedMonthlyMinutes

    integer | null

    0 to 100000000000
  • trafficProfile

    string | null

    max 2000 chars
  • currentSetup

    string | null

    max 2000 chars
  • notes

    string | null

    max 4000 chars

Response 200

  • datarequired

    object

  • idrequired

    string (uuid) · data.id

  • statusrequired

    string · data.status

    One of pending, approved, declined
  • submittedAtrequired

    string (date-time) · data.submittedAt

    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

  • datarequired

    object

  • urlrequired

    string (uri) · data.url

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

  • datarequired

    object

  • secretrequired

    string · data.secret

  • otpauthUrirequired

    string · data.otpauthUri

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)

  • coderequired

    string

    6-digit authenticator code

Response 200

  • datarequired

    object

  • backupCodesrequired

    string[] · data.backupCodes

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)

  • code

    string

  • password

    string

Response 200

  • datarequired

    object

    Same 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

  • datarequired

    object

  • lowBalanceThresholdrequired

    string | null · data.lowBalanceThreshold

    USD, 2-decimal string; null = no low-balance alert
  • dailySpendCaprequired

    string | null · data.dailySpendCap

    USD, 2-decimal string; null = no daily cap alert
  • notifyEmailrequired

    boolean · data.notifyEmail

  • updatedAtrequired

    string (date-time) | null · data.updatedAt

    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 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)

  • lowBalanceThreshold

    number | null

    min 0
  • dailySpendCap

    number | null

    min 0
  • notifyEmail

    boolean

Response 200

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

  • datarequired

    object[]

  • idrequired

    string (uuid) · data[].id

  • userIdrequired

    string (uuid) · data[].userId

  • namerequired

    string · data[].name

  • filtersrequired

    object · data[].filters

    Marketplace filter values, as the marketplace query parameters
  • createdAtrequired

    string (date-time) · data[].createdAt

    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)

  • namerequired

    string

    max 100 chars
  • filtersrequired

    object

Response 201

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

  • idrequired

    path · string

Response 200

  • datarequired

    object

  • idrequired

    string (uuid) · data.id

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

  • datarequired

    object[]

  • favoriteIdrequired

    string (uuid) · data[].favoriteId

  • favoritedAtrequired

    string (date-time) · data[].favoritedAt

    ISO-8601 timestamp (UTC)
  • idrequired

    string (uuid) · data[].id

    The route id
  • typerequired

    string · data[].type

    One of voice, sms
  • countryrequired

    string · data[].country

  • destinationNamerequired

    string · data[].destinationName

    The 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.
  • listingRef

    string · data[].listingRef

    Anonymous 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.
  • pricePerUnitrequired

    money · data[].pricePerUnit

    USD per minute (voice) or per message segment (SMS) USD as a decimal string with exactly 6 places, e.g. "0.012500".
  • billingIncrementrequired

    string | null · data[].billingIncrement

  • statusrequired

    string · data[].status

  • expectedAsrrequired

    string | null · data[].expectedAsr

    Seller-stated ASR %, 2-decimal string
  • expectedAcdrequired

    string | null · data[].expectedAcd

    Seller-stated ACD in minutes, 2-decimal string
  • dialerCompatiblerequired

    boolean · data[].dialerCompatible

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)

  • routeIdrequired

    string (uuid)

Response 201

  • datarequired

    object

  • routeIdrequired

    string (uuid) · data.routeId

  • favoritedrequired

    boolean · data.favorited

    One of true
  • idrequired

    string (uuid) | null · data.id

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

  • routeIdrequired

    path · string

Response 200

  • datarequired

    object

  • routeIdrequired

    string (uuid) · data.routeId

  • favoritedrequired

    boolean · data.favorited

    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

  • datarequired

    object[]

  • assignmentIdrequired

    string (uuid) · data[].assignmentId

  • ipIdrequired

    string (uuid) · data[].ipId

  • addressrequired

    string · data[].address

  • rolerequired

    string · data[].role

    ingress = where you send traffic; egress = where your calls leave fromOne of ingress, egress
  • boundBoxrequired

    string | null · data[].boundBox

  • assignedAtrequired

    string (date-time) · data[].assignedAt

    ISO-8601 timestamp (UTC)
  • hintrequired

    string · data[].hint

    Plain-English instruction for this address
  • enabled

    boolean

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

  • datarequired

    object

  • enabled

    boolean · data.enabled

  • myIngressIprequired

    string | null · data.myIngressIp

  • myEgressIprequired

    string | null · data.myEgressIp

  • egressPendingNetwork

    boolean · data.egressPendingNetwork

  • edgeIprequired

    string · data.edgeIp

    The shared address to send SIP to when you hold no dedicated one
  • egressIpsrequired

    string[] · data.egressIps

    Addresses our calls leave from; whitelist these with your carriers
  • rtpPortRangerequired

    string · data.rtpPortRange

  • sipPortrequired

    integer · data.sipPort

  • onPlatformrequired

    boolean · data.onPlatform

  • onPlatformSignalsrequired

    object · data.onPlatformSignals

  • switchOperatorrequired

    boolean · data.onPlatformSignals.switchOperator

  • marketplaceBuyerrequired

    boolean · data.onPlatformSignals.marketplaceBuyer

  • dialerUserrequired

    boolean · data.onPlatformSignals.dialerUser

  • autoAuthorizedrequired

    boolean · data.autoAuthorized

  • manualWhitelistNeededrequired

    boolean · data.manualWhitelistNeeded

  • authorizedIpsrequired

    string[] · data.authorizedIps

  • poolAvailablerequired

    integer · data.poolAvailable

  • egressPoolAvailablerequired

    integer · data.egressPoolAvailable

  • egressAvailablerequired

    boolean · data.egressAvailable

  • sipUsernamerequired

    string | null · data.sipUsername

  • hasSipPasswordrequired

    boolean · data.hasSipPassword

  • enabled

    boolean

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

  • datarequired

    object

  • dedicatedIpsEnabledrequired

    boolean · data.dedicatedIpsEnabled

  • myAddressrequired

    string | null · data.myAddress

  • myAddressSummaryrequired

    string · data.myAddressSummary

  • sendTorequired

    string · data.sendTo

    Where to send your SIP traffic
  • sendToPortrequired

    integer · data.sendToPort

  • sendToSummaryrequired

    string · data.sendToSummary

  • egressModerequired

    string · data.egressMode

    One of dedicated, shared
  • egressAddressesrequired

    string[] · data.egressAddresses

  • egressSummaryrequired

    string · data.egressSummary

  • authMethodsrequired

    string[] · data.authMethods

    One of ip, digest
  • authSummaryrequired

    string · data.authSummary

  • authorizedSourceIpsrequired

    string[] · data.authorizedSourceIps

  • purchasedRoutesrequired

    object[] · data.purchasedRoutes

  • purchaseIdrequired

    string (uuid) · data.purchasedRoutes[].purchaseId

  • routeIdrequired

    string (uuid) · data.purchasedRoutes[].routeId

  • routeNamerequired

    string | null · data.purchasedRoutes[].routeName

  • destinationrequired

    string | null · data.purchasedRoutes[].destination

  • typerequired

    string · data.purchasedRoutes[].type

  • statusrequired

    string · data.purchasedRoutes[].status

  • sendTorequired

    string · data.purchasedRoutes[].sendTo

  • sendToPortrequired

    integer · data.purchasedRoutes[].sendToPort

  • sipUsernamerequired

    string | null · data.purchasedRoutes[].sipUsername

  • rtpPortRangerequired

    string · data.rtpPortRange

  • codecsrequired

    string[] · data.codecs

  • autoAuthorizedrequired

    boolean · data.autoAuthorized

  • manualWhitelistNeededrequired

    boolean · data.manualWhitelistNeeded

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

  • datarequired

    object

  • assignmentIdrequired

    string (uuid) · data.assignmentId

  • ipIdrequired

    string (uuid) · data.ipId

  • addressrequired

    string · data.address

  • rolerequired

    string · data.role

    ingress = where you send traffic; egress = where your calls leave fromOne of ingress, egress
  • boundBoxrequired

    string | null · data.boundBox

  • assignedAtrequired

    string (date-time) · data.assignedAt

    ISO-8601 timestamp (UTC)
  • hintrequired

    string · data.hint

    Plain-English instruction for this address
  • createdrequired

    boolean · data.created

    False when you already held one (idempotent replay)
  • monthlyPriceUsdrequired

    number · data.monthlyPriceUsd

    Monthly premium in USD (a number)
  • chargedrequired

    number · data.charged

    USD 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

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

  • idrequired

    path · string (uuid)

Response 200

  • datarequired

    object

  • releasedrequired

    boolean · data.released

    One of true
  • addressrequired

    string · data.address

  • ipIdrequired

    string (uuid) · data.ipId

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.