# POST /phone/a2p/register

**Resource:** [Phone](./phone.md)  
**MCP tool:** `register_a2p`  
**Scopes:** `phone:write`  
**Write operation:** yes

Register this workspace to send SMS from US numbers (US A2P 10DLC). Lodge this the moment a client buys a US number: carrier review takes roughly two weeks, is outside our control, and their US numbers cannot send a single message until it clears, so any delay in lodging is added straight onto that clock. COST AND RISK, read before calling without mock: a real registration charges 35,000 credits once and then 17,500 credits per month for as long as the campaign is live, and it creates records at the carrier registry that we cannot take back. Worse, a rejected registration cannot be edited, it has to be rebuilt from scratch, which restarts the two-week wait. The most common rejection is business_name not exactly matching the legal entity that owns business_registration_number, so check that against an approved regulatory bundle rather than the workspace name. ALWAYS run once with mock true first: that proves the whole sequence accepts your payload for free, with no carrier vetting and nothing billed. Registration is asynchronous and staged, so a successful call returns a pending status, not a finished one. Follow it with get_a2p_registration to watch progress and sync_a2p_status to advance it. Re-calling this for a workspace whose last attempt FAILED rebuilds from scratch; re-calling it mid-flight resumes in place. Switching the mock flag always rebuilds, because a test registration can never become a real one. A 402 means the payload was fine and the workspace simply needs a credit top-up.

## Parameters

| Name | In | Type | Required | Description |
|------|----|------|----------|-------------|
| `business` | body | object | yes | The legal business being registered. Required keys: business_name (the EXACT legal entity name tied to business_registration_number — a mismatch is the single most common rejection, and it costs another full review cycle), business_registration_number (ABN, EIN or equivalent), rep_first_name, rep_last_name, rep_email, rep_phone (E.164), and address { customer_name, street, street_secondary?, city, region, postal_code, iso_country }. Optional keys: business_type, business_industry, business_regions_of_operation, company_type ("private" \| "public" \| "non_profit" \| "government", defaults to "private"), website_url, social_media_profile_url, rep_business_title, rep_job_position, notifications_email. If the workspace already has an approved regulatory bundle, take business_name, business_registration_number and the address from its end_user_data rather than from the workspace name — the workspace is often a trading name, not the legal entity. |
| `campaign` | body | object | yes | How the workspace will actually use SMS. Required keys: privacy_policy_url and terms_and_conditions_url (both must be live, publicly reachable pages — they are read during review). Strongly recommended: message_samples (array of real message bodies you will send), message_flow (how people opt in, in plain words), description, opt_out_keywords / opt_out_message, opt_in_keywords / opt_in_message, help_keywords / help_message, has_embedded_links, has_embedded_phone, usecase. Thin or invented samples are a common rejection reason, so send the wording you really use. |
| `phone_number_id` | body | string | no | UUID of the workspace phone number to attach to the campaign sender pool once it goes live. Must be a US, SMS-capable number in this workspace; ignored if it belongs to another workspace. Omit to register the business without attaching a number yet. |
| `mock` | body | boolean | no | Run the whole sequence against a free test registration instead of a real one: no fees, no carrier vetting, auto-approves, and it can never send. ALWAYS do this first to prove the payload is accepted before spending anything. A test registration can never become a real one — switching the flag rebuilds from scratch. Defaults to false. |
| `low_volume` | body | boolean | no | Register as a sole trader / low-volume sender instead of a standard business. Cheaper and faster to vet, but caps throughput hard. Only correct for genuinely low-volume senders. Defaults to false. |
| `require_approval` | body | boolean | no | Optional. Set true to route this write into the approval queue for human review instead of executing it immediately (returns 202 + an approval_id). Works even when your key/token has permission to execute directly. |

## Request example

```bash
curl -X POST   "https://api.trustpager.com/functions/v1/api/v1/phone/a2p/register"   -H "Authorization: Bearer YOUR_API_KEY"   -H "Content-Type: application/json"   -d '{"business":"...","campaign":"...","phone_number_id":"..."}'
```

---
Base URL: `https://api.trustpager.com/functions/v1/api/v1` — Auth: `Authorization: Bearer YOUR_API_KEY`