Skip to main content
Use these endpoints to manage your organization’s 10DLC registration over HTTP. Each organization can have one brand and one campaign at a time.

Authentication and scope

Send an admin-scoped API key or a claimed agent’s API key in the X-API-Key header. Unclaimed agents cannot use these endpoints. You can also manage registration in the Inkbox Console. These operations act on the key’s organization, even when you use an agent-scoped key. Activation and resubmission affect all eligible local US phone numbers in that organization, including numbers belonging to other agents. Do not pass an organization ID or identity ID. All paths below start with https://inkbox.ai/api/v1/compliance. Brand and campaign JSON request fields use snake_case. Their response fields use camelCase, such as brandId, identityStatus, campaignId, and campaignStatus. Evidence and activation responses use the exact names shown below.

Registration workflow

  1. Register your brand and retain its brandId.
  2. Check the brand until verification completes. Complete any requested verification in the Console.
  3. Upload a screenshot if you need a public URL showing how recipients opt in.
  4. Submit a campaign using the brand’s UUID as brand_id.
  5. Check campaignStatus and failureReasons while the campaign is reviewed.
  6. Once approved, select your campaign with PATCH /campaign/active.
  7. Wait for each phone number’s sms_status to become ready before sending.
Registration is asynchronous: a 201 response confirms submission, not approval. See the 10DLC guide for registration requirements.

Register a brand

Send a JSON body with your business details. Unknown fields return 422.

Required fields

Supported vertical values: PROFESSIONAL, REAL_ESTATE, HEALTHCARE, HUMAN_RESOURCES, ENERGY, ENTERTAINMENT, RETAIL, TRANSPORTATION, AGRICULTURE, INSURANCE, POSTAL, EDUCATION, HOSPITALITY, FINANCIAL, POLITICAL, GAMBLING, LEGAL, CONSTRUCTION, NGO, MANUFACTURING, GOVERNMENT, TECHNOLOGY, and COMMUNICATION.

Conditional and optional fields

Supported stock_exchange values: NYSE, NASDAQ, AMEX, AMX, ASX, B3, BME, BSE, FRA, ICEX, JPX, JSE, KRX, LON, NSE, OMX, SEHK, SSE, STO, SWX, SZSE, TSX, TWSE, and VSE.

Example

The values below are fictional. Replace them with your registered business details before submitting.

Response (201)

Returns a brand object. Fields you will use in the registration workflow include: An existing brand returns 409 with detail.error: "brand_already_exists".

Check brand status

Returns the same brand object with current verification information. No request body or brand ID is needed. If your organization has no brand, the endpoint returns 404 with detail.error: "brand_not_found". Sole-proprietor phone verification and other requested verification steps remain available through the Console or an admin-scoped integration. Those separate verification endpoints, along with brand/campaign update and delete endpoints, require an admin-scoped API key or the Console.

Upload opt-in evidence

Register a brand first. Upload one image as the file part of a multipart/form-data request. The image must be no larger than 5 MiB (5,242,880 bytes) or 16 million pixels.
Let your HTTP client set the multipart boundary. A successful response is 201:
The URL is publicly readable without an API key. Upload only an image you intend to share publicly. Include the returned URL in your campaign’s message_flow to show the opt-in experience. There is no separate evidence field in the campaign request.

Register a campaign

Send the following JSON fields. Unknown fields return 422.

Required fields

Supported usecase values: ACCOUNT_NOTIFICATION, AGENTS_FRANCHISES, CARRIER_EXEMPT, CHARITY, CUSTOMER_CARE, DELIVERY_NOTIFICATION, EMERGENCY, FRAUD_ALERT, HIGHER_EDUCATION, K12_EDUCATION, LOW_VOLUME, MARKETING, MIXED, POLITICAL, POLLING_VOTING, PROXY, PUBLIC_SAFETY_RESTRICTED, PUBLIC_SERVICE_ANNOUNCEMENT, SECURITY_ALERT, SOCIAL, SWEEPSTAKE, 2FA, UCAAS_LOW, M2M, SOLE_PROPRIETOR, TRIAL, and UCAAS_HIGH. Registry eligibility still applies to each use case.

Optional fields

Example

Replace brand_id with the UUID returned when you registered your brand. Replace the example content and URLs with your actual messaging flow.

Response (201)

Returns a campaign object. Important fields include: An existing campaign returns 409 with detail.error: "campaign_already_exists". Use resubmission to replace an existing campaign.

Check campaign status

Returns the campaign object with current review information. No request body or campaign ID is needed. If your organization has no campaign, the endpoint returns 404 with detail.error: "campaign_not_found". Approval, campaign selection, and number readiness are separate states. campaignStatus describes approval; /campaign/active describes your organization’s selection; each number’s sms_status describes whether it is ready to send.

Resubmit a campaign

Send the complete campaign registration body, with the same fields as POST /campaign. This is not a partial update. For example, save your corrected JSON as campaign.json:
A successful response is 201 with a new campaign object and a new campaignId. Your local numbers return to Inkbox’s default campaign while the replacement is reviewed. Check its status and select your campaign again after approval. If no campaign exists to replace, the endpoint returns 404. Do not blindly retry registration or resubmission after a network timeout. First retrieve the current campaign and check whether the submission succeeded. Resubmission creates a replacement, rather than updating the same campaign ID.

Read campaign selection

Response (200):
active: true means your organization selected its own campaign. false means it selected Inkbox’s default. This does not confirm that every number has finished switching. If no customer campaign exists, this endpoint returns 404.

Change campaign selection

The required boolean active selects your campaign (true) or Inkbox’s default (false). Activating requires a verified brand and a campaign with MNO_PROVISIONED status. If readiness has not yet been confirmed, the endpoint returns 409 with detail.error: "customer_campaign_not_ready"; check status again before retrying. Response (202):
The count is the number of eligible local US numbers scheduled to switch. Switching runs asynchronously across the organization. It does not change non-US or toll-free numbers. Check phone number status before sending; sends while a number is pending return 409 sender_sms_pending.

Errors

Registration conflict responses contain detail.error and detail.message. Upload errors may instead contain a string in detail. Validation errors can use an array of field errors. Inspect the response body rather than assuming one error shape for every endpoint.