> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.agentphone.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.agentphone.ai/_mcp/server.

# Update A2P Registration

PATCH https://api.agentphone.ai/v1/register
Content-Type: application/json

Update an existing A2P 10DLC registration.

Send only the fields that changed — everything is optional. There is no
fee. Changes are applied after review, and your registration keeps
sending under its current approval while an update to an approved
registration is reviewed.

Registrations created with create_sub_account=true (the default) live on
a sub-account; this resolves to it automatically when there's exactly
one, or honors the X-Sub-Account-Id header.

Reference: https://docs.agentphone.ai/api-reference/registration/update-a-2-p-registration-v-1-register-patch

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Body (application/json)

This endpoint expects a RegistrationUpdateRequest.

- `first_name` (string, optional, nullable) — Contact first name.
- `last_name` (string, optional, nullable) — Contact last name.
- `email` (string, optional, nullable) — Contact email address.
- `phone_number` (string, optional, nullable) — E.164 format, e.g. +15551234567
- `business_name` (string, optional, nullable) — Legal/registered business name.
- `brand_name` (string, optional, nullable) — Public-facing brand name if different from business_name.
- `organization_type` (enum, optional, nullable) — Organization type.
  - Allowed values: `sole_proprietor`, `private_corporation`, `public_corporation`, `llc`, `partnership`, `non_profit`, `co_op`, `government`
- `contact_title` (enum, optional, nullable) — Your role.
  - Allowed values: `ceo`, `cfo`, `cto`, `coo`, `vp`, `gm`, `director`, `other`
- `contact_title_other` (string, optional, nullable) — Custom title when contact_title is 'other'.
- `ein` (string, optional, nullable) — EIN / Tax ID.
- `website_url` (string, optional, nullable)
- `industry` (string, optional, nullable) — e.g. technology, real_estate, retail, healthcare
- `business_regions` (list of string, optional, nullable) — e.g. ['usa_and_canada']
- `street_address` (string, optional, nullable) — Street address line 1.
- `street_address_2` (string, optional, nullable) — Street address line 2 (suite, unit, etc.).
- `city` (string, optional, nullable) — City.
- `state` (string, optional, nullable) — State/region code.
- `zip_code` (string, optional, nullable) — Postal/ZIP code.
- `country` (string, optional, nullable) — Country code, e.g. US.
- `description` (string, optional, nullable) — What your business does, who you message, and what types of messages you send. Min 40 chars.
- `use_cases` (list of enum, optional, nullable) — 1-5 specific use cases for your SMS campaign.
  - Allowed values: `account_notification`, `customer_care`, `delivery_notification`, `fraud_alert`, `higher_education`, `marketing`, `polling_voting`, `public_service_announcement`, `security_alert`, `two_factor_authentication`
- `volume` (enum, optional, nullable) — Expected message volume.
  - Allowed values: `low`, `high`
- `message_samples` (list of string, optional, nullable) — 2-5 example messages. Each must be 20-1024 chars and include your brand name.
- `consent_flow` (string, optional, nullable) — How users opt in to receive messages. Min 40 chars.
- `privacy_policy_url` (string, optional, nullable)
- `terms_of_service_url` (string, optional, nullable)
- `opt_in_image_url` (string, optional, nullable) — Publicly accessible URL to a screenshot of your opt-in flow (PNG, JPG, WEBP, or GIF, max 2MB)
- `includes` (list of enum, optional, nullable) — Content types included in messages.
  - Allowed values: `links`, `phone_numbers`, `age_gated`, `direct_lending`
- `link_sample` (string, optional, nullable) — Example URL if messages contain links.

## Response

### 200

Successful Response

- `ok` (boolean, required)
- `message` (string, required)
- `campaign_status` (string, required)
- `updated_fields` (list of string, required)
- `sub_account_id` (string, optional, nullable) — Set when the update was applied to a registration on a sub-account of the calling account (the default for POST /v1/register).

## Errors

### 422 Unprocessable Entity Error

Validation Error

- `detail` (list of ValidationError, optional)

## Types

### ValidationError

- `loc` (list of ValidationErrorLocItems, required)
- `msg` (string, required)
- `type` (string, required)

### ValidationErrorLocItems

## Examples

**Request**

```json
{}
```

**Response**

```json
{
  "ok": true,
  "message": "string",
  "campaign_status": "string",
  "updated_fields": [
    "string"
  ],
  "sub_account_id": "string"
}
```

**SDK Code**

```python
import requests

url = "https://api.agentphone.ai/v1/register"

payload = {}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.patch(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.agentphone.ai/v1/register';
const options = {
  method: 'PATCH',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.agentphone.ai/v1/register"

	payload := strings.NewReader("{}")

	req, _ := http.NewRequest("PATCH", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.agentphone.ai/v1/register")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.patch("https://api.agentphone.ai/v1/register")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.agentphone.ai/v1/register', [
  'body' => '{}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.agentphone.ai/v1/register");
var request = new RestRequest(Method.PATCH);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.agentphone.ai/v1/register")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PATCH"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```