sync route refreshes them; a rule marked “carrier” is enforced by the carrier, which answers 400 with its own message. None of these routes has a CLI equivalent. Buying the numbers themselves is on Phone numbers; the end-to-end setup is SMS and phone numbers.
Verified against lua-cli 3.33.0.
Base URL and authentication
Every route sits underhttps://api.heylua.ai/developer/orgs/:orgId, takes Authorization: Bearer <<YOUR_API_KEY>>, and checks a telephony scope on the organization in the path: telephony:read reads records and events, telephony:write edits them, telephony:manage unlinks a number, and telephony:provision creates brands, campaigns, and registrations, syncs them, and links a number. telephony:provision is a sensitive scope: a wildcard grant never covers it, so a scoped key must hold it by name. msisdn path parameters are E.164 digits without the leading +. A field that fails validation answers 400 with message as an array of the failed rules. Keys, scopes, and the error envelope are on the REST API overview.
Brand object
string
Brand ID; use it on the plural routes.
string
Owning organization.
string
Carrier-side brand ID, once registered.
string
Carrier status:
UNVERIFIED (initial), VERIFIED, VETTED_VERIFIED, ACTIVE, INACTIVE, SUSPENDED, or DELETED.string
The submitted fields, under their request names.
mixed
Carrier-side fields (vetting, account, and date stamps), refreshed by
sync.string
Timestamps.
Campaign object
string
Campaign ID; use it on the plural routes and when linking a number.
string
Owning organization.
string
Brand the campaign belongs to.
string
Carrier-side and TCR IDs, once registered.
string
Carrier status:
ACTIVE, EXPIRED, DEACTIVATED, SUSPENDED, or DELETED.mixed
The submitted fields, under their request names.
mixed
Carrier-side fields (TCR status, traffic and renewal flags, keywords, and date stamps), refreshed by
sync.string
Timestamps.
Registration object
string
Registration ID; use it on the
tfn-registrations routes.string
Owning organization.
string
The toll-free number.
string
Carrier-side registration ID, assigned at create,
DRAFT included.string
DRAFT or SUBMITTED.string
Carrier review status:
DRAFT, PENDING_REVIEW, CARRIERS_REVIEW, REGISTERED, REJECTED, UPDATES_REQUIRED, or BLOCKED.string
Set when
numberStatus is REJECTED.object
The submitted sections.
string
The submitted values.
string
Timestamps.
Endpoints
Brand routes come first, then campaigns, the number link, and toll-free registrations. The singular/10dlc/brand and /10dlc/campaign routes are deprecated aliases that resolve to the organization’s most recent non-terminal brand or campaign; the plural routes address a record by ID and allow several per organization.
POST /developer/orgs/:orgId/10dlc/brand
Registers the organization’s brand with TCR through the carrier. Scopetelephony:provision.
string
required
SOLE_PROPRIETOR, PRIVATE_PROFIT, PUBLIC_PROFIT, NON_PROFIT, or GOVERNMENT.string
required
Brand name shown to recipients; at most 100 characters.
string
required
Legal company name; at most 100 characters.
string
required
EIN or tax ID; at most 50 characters.
string
required
One of
REAL_ESTATE, HEALTHCARE, ENERGY, ENTERTAINMENT, RETAIL, AGRICULTURE, INSURANCE, EDUCATION, HOSPITALITY, FINANCIAL, GAMBLING, CONSTRUCTION, NGO, MANUFACTURING, GOVERNMENT, TECHNOLOGY, COMMUNICATION.string
required
Contact number in E.164 digits without
+; at most 20 characters.string
required
Contact email; at most 100 characters.
string
required
At most 100 characters each.
string
required
At most 20 characters.
string
required
At most 10 characters.
string
required
ISO 3166-1 alpha-2 code, 2 characters.
string
URL; at most 100 characters.
string
Carrier: required for
SOLE_PROPRIETOR. At most 50, 50, and 20 characters.string
Carrier: required for
PUBLIC_PROFIT. At most 10, 50, and 100 characters.201 with the brand object.
GET /developer/orgs/:orgId/10dlc/brands
Lists the organization’s brands asBrand[]. Scope telephony:read.
GET /developer/orgs/:orgId/10dlc/brands/:brandId
Returns one brand object, or200 with an empty body when the ID is unknown. Scope telephony:read.
PATCH /developer/orgs/:orgId/10dlc/brands/:brandId
Updates mutable brand fields at the carrier and locally. Scopetelephony:write. Accepts any subset of the create body except entity_type. Answers 204; 404 10DLC brand not found when the brand is unknown.
POST /developer/orgs/:orgId/10dlc/brands/:brandId/sync
Refreshes the brand’s status from the carrier and answers200 with the updated brand object. Scope telephony:provision.
POST /developer/orgs/:orgId/10dlc/brands/:brandId/campaigns/sync-from-vonage
Imports the brand’s campaigns from the carrier and upserts local records by carrier campaign ID; safe to call repeatedly. Scopetelephony:provision. Answers 200 with Campaign[] for the brand; 404 10DLC brand not found for this org or not linked to Vonage. when the brand is unknown or not yet registered.
GET /developer/orgs/:orgId/10dlc/brand
Deprecated singular alias ofGET …/10dlc/brands/:brandId, resolved to the organization’s most recent non-terminal brand. Answers the brand, or 200 with an empty body when there is none. Scope telephony:read.
PATCH /developer/orgs/:orgId/10dlc/brand
Deprecated singular alias ofPATCH …/10dlc/brands/:brandId, resolved to the most recent non-terminal brand. Answers 204 and is a no-op when there is none. Scope telephony:write.
POST /developer/orgs/:orgId/10dlc/brand/sync
Deprecated singular alias ofPOST …/10dlc/brands/:brandId/sync, resolved to the most recent non-terminal brand. Answers the brand, or 200 with an empty body when there is none. Scope telephony:provision.
POST /developer/orgs/:orgId/10dlc/campaign
Registers a messaging campaign under a brand. Scopetelephony:provision. 404 10DLC brand not found for this org. Create a brand first. when no registered brand matches.
string
Brand to register under. When omitted, the most recent non-terminal brand is used, even when the organization holds several.
string
required
One of
CUSTOMER_CARE, CONVERSATIONAL, MARKETING, MIXED, LOW_VOLUME, 2FA, ACCOUNT_NOTIFICATION, DELIVERY_NOTIFICATION, FRAUD_ALERT, SECURITY_ALERT, POLLING_VOTING, PUBLIC_SERVICE_ANNOUNCEMENT, HIGHER_EDUCATION, CHARITY, POLITICAL, EMERGENCY, SOCIAL.string[]
Sub-use cases for
MIXED campaigns.string
required
What the campaign sends; 40 to 4,096 characters.
string
required
Sample message; 20 to 1,024 characters.
string
Further samples; 20 to 1,024 characters each.
string
required
Sent when a recipient subscribes, replies STOP, or replies HELP.
object
required
How recipients consent.
boolean
default:false
Content is age-restricted; messages contain links; messages contain phone numbers.
boolean
required
Carrier: must be
true to accept the 10DLC terms.string
Overrides the brand vertical for this campaign; same values as the brand.
201 with the campaign object.
GET /developer/orgs/:orgId/10dlc/campaigns
Lists the organization’s campaigns asCampaign[]. Scope telephony:read.
GET /developer/orgs/:orgId/10dlc/campaigns/:campaignId
Returns one campaign object, or200 with an empty body when the ID is unknown. Scope telephony:read.
PATCH /developer/orgs/:orgId/10dlc/campaigns/:campaignId
Updates mutable campaign fields at the carrier and locally:description, the samples, the three messages, message_flow_details, age_gated, embedded_link, embedded_phone. Scope telephony:write. Answers 204; 404 10DLC campaign not found when the campaign is unknown.
POST /developer/orgs/:orgId/10dlc/campaigns/:campaignId/sync
Refreshes the campaign’s status from the carrier and answers200 with the updated campaign object. Scope telephony:provision.
GET /developer/orgs/:orgId/10dlc/campaign
Deprecated singular alias ofGET …/10dlc/campaigns/:campaignId, resolved to the organization’s most recent non-terminal campaign. Answers the campaign, or 200 with an empty body when there is none. Scope telephony:read.
PATCH /developer/orgs/:orgId/10dlc/campaign
Deprecated singular alias ofPATCH …/10dlc/campaigns/:campaignId, resolved to the most recent non-terminal campaign. Answers 204 and is a no-op when there is none. Scope telephony:write.
POST /developer/orgs/:orgId/10dlc/campaign/sync
Deprecated singular alias ofPOST …/10dlc/campaigns/:campaignId/sync, resolved to the most recent non-terminal campaign. Answers the campaign, or 200 with an empty body when there is none. Scope telephony:provision.
POST /developer/orgs/:orgId/phone-numbers/:msisdn/10dlc/link
Links a local US number to a campaign at the carrier. Scopetelephony:provision. The body is optional.
string
Campaign to link. When omitted, the most recent non-terminal campaign is used, even when there are several.
200 with { linked: true, warnings: string[] }. Warnings are non-blocking, for example that the number is not yet bound to an agent. 404 10DLC campaign not found for this org when no registered campaign matches. The number is not checked locally; a number the carrier does not hold is rejected by the carrier with its own message.
DELETE /developer/orgs/:orgId/phone-numbers/:msisdn/10dlc/link
Removes the number’s campaign link. Scopetelephony:manage. Answers 204; 404 10DLC campaign not found for this org when neither the number nor the organization has a campaign.
POST /developer/orgs/:orgId/phone-numbers/:msisdn/tfn
Creates a registration for a toll-free number at the carrier: the business, use case, sample message, opt-in evidence, and expected volume for one US toll-free number. The carrier requires an approved registration before the number can send SMS. Save it asDRAFT to keep editing, or submit it immediately; the carrier then moves numberStatus through review. Scope telephony:provision. The number is not checked locally.
object
required
object
required
{ category, description, campaign_verify_auth_token? }; description at most 500 characters.object
required
{ content, age_gated? }; content is a sample message of at most 1,000 characters, age_gated defaults to false.object
required
string
required
One of
10, 100, 1,000, 10,000, 100,000, 250,000, 500,000, 750,000, 1,000,000, 5,000,000, 10,000,000+.string
required
Context for the reviewer; at most 350 characters.
string
default:"DRAFT"
DRAFT saves without submitting; SUBMITTED submits immediately.201 with the registration object.
GET /developer/orgs/:orgId/phone-numbers/:msisdn/tfn
Returns the number’s registration object, refreshing its status from the carrier first, or200 with an empty body when the number has no registration. Scope telephony:read.
PATCH /developer/orgs/:orgId/tfn-registrations/:id
Updates a registration, or submits it by settingstatus to SUBMITTED. Scope telephony:write. Accepts any subset of the create body; status accepts only SUBMITTED. The carrier accepts updates only while the registration is DRAFT or its number is UPDATES_REQUIRED, and answers 400 otherwise. Answers 204; 404 TFN registration not found when the registration does not belong to the organization.
GET /developer/orgs/:orgId/tfn-registrations/:id/events
Returns the carrier’s event history for the registration, newest first, as{ id, status, reason?, created_at }[]. Scope telephony:read. 404 TFN registration not found.
POST /developer/orgs/:orgId/tfn-registrations/:id/sync
Refreshes the registration’s status from the carrier and answers201 with the updated registration object, or 201 with an empty body when the ID is unknown. Scope telephony:provision.
Errors
Example
Link a purchased local number to a registered campaign. No CLI command does this, so there is no CLI tab.See also
- Phone numbers — search, purchase, suspend, and release the numbers these records attach to
- SMS and phone numbers — register a number for US messaging, end to end
- RCS agents — the carrier registration for RCS Business Messaging
lua channels— the interactive number menu

