curl --request POST \
--url https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"profile": {
"address": {
"city": "<string>",
"postalCode": "<string>",
"state": "<string>",
"street": "<string>"
},
"companyName": "<string>",
"displayName": "<string>",
"ein": "<string>",
"email": "[email protected]",
"firstName": "<string>",
"lastName": "<string>",
"phone": "<string>",
"supportEmail": "[email protected]",
"type": "organization",
"website": "<string>"
}
}
'import requests
url = "https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands"
payload = { "profile": {
"address": {
"city": "<string>",
"postalCode": "<string>",
"state": "<string>",
"street": "<string>"
},
"companyName": "<string>",
"displayName": "<string>",
"ein": "<string>",
"email": "[email protected]",
"firstName": "<string>",
"lastName": "<string>",
"phone": "<string>",
"supportEmail": "[email protected]",
"type": "organization",
"website": "<string>"
} }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
profile: {
address: {
city: '<string>',
postalCode: '<string>',
state: '<string>',
street: '<string>'
},
companyName: '<string>',
displayName: '<string>',
ein: '<string>',
email: '[email protected]',
firstName: '<string>',
lastName: '<string>',
phone: '<string>',
supportEmail: '[email protected]',
type: 'organization',
website: '<string>'
}
})
};
fetch('https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'profile' => [
'address' => [
'city' => '<string>',
'postalCode' => '<string>',
'state' => '<string>',
'street' => '<string>'
],
'companyName' => '<string>',
'displayName' => '<string>',
'ein' => '<string>',
'email' => '[email protected]',
'firstName' => '<string>',
'lastName' => '<string>',
'phone' => '<string>',
'supportEmail' => '[email protected]',
'type' => 'organization',
'website' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands"
payload := strings.NewReader("{\n \"profile\": {\n \"address\": {\n \"city\": \"<string>\",\n \"postalCode\": \"<string>\",\n \"state\": \"<string>\",\n \"street\": \"<string>\"\n },\n \"companyName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"ein\": \"<string>\",\n \"email\": \"[email protected]\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"phone\": \"<string>\",\n \"supportEmail\": \"[email protected]\",\n \"type\": \"organization\",\n \"website\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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(string(body))
}HttpResponse<String> response = Unirest.post("https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"profile\": {\n \"address\": {\n \"city\": \"<string>\",\n \"postalCode\": \"<string>\",\n \"state\": \"<string>\",\n \"street\": \"<string>\"\n },\n \"companyName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"ein\": \"<string>\",\n \"email\": \"[email protected]\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"phone\": \"<string>\",\n \"supportEmail\": \"[email protected]\",\n \"type\": \"organization\",\n \"website\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"profile\": {\n \"address\": {\n \"city\": \"<string>\",\n \"postalCode\": \"<string>\",\n \"state\": \"<string>\",\n \"street\": \"<string>\"\n },\n \"companyName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"ein\": \"<string>\",\n \"email\": \"[email protected]\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"phone\": \"<string>\",\n \"supportEmail\": \"[email protected]\",\n \"type\": \"organization\",\n \"website\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"capabilities": {
"canResubmit": true,
"editableFields": [
"<string>"
]
},
"createdAt": "2026-01-01T00:00:00.000Z",
"failureReasons": [
{
"fields": [
"profile.address"
],
"message": "Street address is not valid"
},
{
"fields": [
"profile.phone"
],
"message": "Mobile Phone Number not supported. Must be a Mobile Phone Number that can receive SMS messages."
}
],
"feedback": [
{
"category": "tax_id",
"message": "<string>"
}
],
"id": "<string>",
"profile": {
"address": {
"city": "<string>",
"postalCode": "<string>",
"state": "<string>",
"street": "<string>"
},
"companyName": "<string>",
"displayName": "<string>",
"einLast4": "<string>",
"email": "[email protected]",
"entityType": "private_profit",
"firstName": "<string>",
"lastName": "<string>",
"phoneLast4": "<string>",
"supportEmail": "[email protected]",
"type": "organization",
"vertical": "agriculture",
"website": "<string>"
},
"status": "submitting",
"updatedAt": "2026-01-01T00:00:00.000Z",
"registeredAt": "2026-01-01T00:00:00.000Z",
"submittedAt": "2026-01-01T00:00:00.000Z"
}
}{
"code": "IDEMPOTENCY_KEY_REQUIRED",
"status": 400,
"title": "Idempotency Key Required",
"type": "https://photon.codes/docs/problems/idempotency-key-required"
}{
"code": "NOT_AUTHENTICATED",
"status": 401,
"title": "Not Authenticated",
"type": "https://photon.codes/docs/problems/not-authenticated"
}{
"code": "ENTITLEMENT_REQUIRED",
"reason": "card_required",
"status": 402,
"title": "Entitlement Required",
"type": "https://photon.codes/docs/problems/entitlement-required"
}{
"code": "FORBIDDEN",
"status": 403,
"title": "Forbidden",
"type": "https://photon.codes/docs/problems/forbidden"
}{
"code": "BRAND_NOT_FOUND",
"status": 404,
"title": "Brand Not Found",
"type": "https://photon.codes/docs/problems/brand-not-found"
}{
"code": "IDEMPOTENCY_CONFLICT",
"status": 409,
"title": "Idempotency Conflict",
"type": "https://photon.codes/docs/problems/idempotency-conflict"
}{
"code": "PAYLOAD_TOO_LARGE",
"status": 413,
"title": "Payload Too Large",
"type": "https://photon.codes/docs/problems/payload-too-large"
}{
"code": "VALIDATION_FAILED",
"issues": [
{
"code": "invalid_type",
"location": "json",
"message": "Expected a string.",
"path": "/name"
}
],
"status": 422,
"title": "Request Validation Failed",
"type": "https://photon.codes/docs/problems/validation-failed"
}{
"code": "RATE_LIMITED",
"status": 429,
"title": "Too Many Requests",
"type": "https://photon.codes/docs/problems/rate-limited"
}{
"code": "INTERNAL_ERROR",
"status": 500,
"title": "Internal Server Error",
"type": "https://photon.codes/docs/problems/internal-error"
}{
"code": "SERVICE_FAILURE",
"status": 502,
"title": "Service Failure",
"type": "https://photon.codes/docs/problems/service-failure"
}{
"code": "SERVICE_UNAVAILABLE",
"status": 503,
"title": "Service Temporarily Unavailable",
"type": "https://photon.codes/docs/problems/service-unavailable"
}{
"code": "REQUEST_TIMEOUT",
"status": 504,
"title": "Request Timeout",
"type": "https://photon.codes/docs/problems/request-timeout"
}Register a brand
Registers an encrypted US 10DLC brand. Registration is free, but it is refused with 402 before anything is created when the organization has no payment method on file, or has an invoice overdue 7 days or more or a disputed payment. Registration starts immediately and consumes one of the organization’s rolling registration slots; deleting the brand later does not return the slot. The response is redacted; EIN and phone are write-only and represented only by their last four characters. Poll the URL in Location while status is submitting or submitted.
curl --request POST \
--url https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"profile": {
"address": {
"city": "<string>",
"postalCode": "<string>",
"state": "<string>",
"street": "<string>"
},
"companyName": "<string>",
"displayName": "<string>",
"ein": "<string>",
"email": "[email protected]",
"firstName": "<string>",
"lastName": "<string>",
"phone": "<string>",
"supportEmail": "[email protected]",
"type": "organization",
"website": "<string>"
}
}
'import requests
url = "https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands"
payload = { "profile": {
"address": {
"city": "<string>",
"postalCode": "<string>",
"state": "<string>",
"street": "<string>"
},
"companyName": "<string>",
"displayName": "<string>",
"ein": "<string>",
"email": "[email protected]",
"firstName": "<string>",
"lastName": "<string>",
"phone": "<string>",
"supportEmail": "[email protected]",
"type": "organization",
"website": "<string>"
} }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
profile: {
address: {
city: '<string>',
postalCode: '<string>',
state: '<string>',
street: '<string>'
},
companyName: '<string>',
displayName: '<string>',
ein: '<string>',
email: '[email protected]',
firstName: '<string>',
lastName: '<string>',
phone: '<string>',
supportEmail: '[email protected]',
type: 'organization',
website: '<string>'
}
})
};
fetch('https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'profile' => [
'address' => [
'city' => '<string>',
'postalCode' => '<string>',
'state' => '<string>',
'street' => '<string>'
],
'companyName' => '<string>',
'displayName' => '<string>',
'ein' => '<string>',
'email' => '[email protected]',
'firstName' => '<string>',
'lastName' => '<string>',
'phone' => '<string>',
'supportEmail' => '[email protected]',
'type' => 'organization',
'website' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands"
payload := strings.NewReader("{\n \"profile\": {\n \"address\": {\n \"city\": \"<string>\",\n \"postalCode\": \"<string>\",\n \"state\": \"<string>\",\n \"street\": \"<string>\"\n },\n \"companyName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"ein\": \"<string>\",\n \"email\": \"[email protected]\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"phone\": \"<string>\",\n \"supportEmail\": \"[email protected]\",\n \"type\": \"organization\",\n \"website\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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(string(body))
}HttpResponse<String> response = Unirest.post("https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"profile\": {\n \"address\": {\n \"city\": \"<string>\",\n \"postalCode\": \"<string>\",\n \"state\": \"<string>\",\n \"street\": \"<string>\"\n },\n \"companyName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"ein\": \"<string>\",\n \"email\": \"[email protected]\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"phone\": \"<string>\",\n \"supportEmail\": \"[email protected]\",\n \"type\": \"organization\",\n \"website\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.photon.codes/v1/organizations/{organization_id}/10dlc/brands")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"profile\": {\n \"address\": {\n \"city\": \"<string>\",\n \"postalCode\": \"<string>\",\n \"state\": \"<string>\",\n \"street\": \"<string>\"\n },\n \"companyName\": \"<string>\",\n \"displayName\": \"<string>\",\n \"ein\": \"<string>\",\n \"email\": \"[email protected]\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"phone\": \"<string>\",\n \"supportEmail\": \"[email protected]\",\n \"type\": \"organization\",\n \"website\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"capabilities": {
"canResubmit": true,
"editableFields": [
"<string>"
]
},
"createdAt": "2026-01-01T00:00:00.000Z",
"failureReasons": [
{
"fields": [
"profile.address"
],
"message": "Street address is not valid"
},
{
"fields": [
"profile.phone"
],
"message": "Mobile Phone Number not supported. Must be a Mobile Phone Number that can receive SMS messages."
}
],
"feedback": [
{
"category": "tax_id",
"message": "<string>"
}
],
"id": "<string>",
"profile": {
"address": {
"city": "<string>",
"postalCode": "<string>",
"state": "<string>",
"street": "<string>"
},
"companyName": "<string>",
"displayName": "<string>",
"einLast4": "<string>",
"email": "[email protected]",
"entityType": "private_profit",
"firstName": "<string>",
"lastName": "<string>",
"phoneLast4": "<string>",
"supportEmail": "[email protected]",
"type": "organization",
"vertical": "agriculture",
"website": "<string>"
},
"status": "submitting",
"updatedAt": "2026-01-01T00:00:00.000Z",
"registeredAt": "2026-01-01T00:00:00.000Z",
"submittedAt": "2026-01-01T00:00:00.000Z"
}
}{
"code": "IDEMPOTENCY_KEY_REQUIRED",
"status": 400,
"title": "Idempotency Key Required",
"type": "https://photon.codes/docs/problems/idempotency-key-required"
}{
"code": "NOT_AUTHENTICATED",
"status": 401,
"title": "Not Authenticated",
"type": "https://photon.codes/docs/problems/not-authenticated"
}{
"code": "ENTITLEMENT_REQUIRED",
"reason": "card_required",
"status": 402,
"title": "Entitlement Required",
"type": "https://photon.codes/docs/problems/entitlement-required"
}{
"code": "FORBIDDEN",
"status": 403,
"title": "Forbidden",
"type": "https://photon.codes/docs/problems/forbidden"
}{
"code": "BRAND_NOT_FOUND",
"status": 404,
"title": "Brand Not Found",
"type": "https://photon.codes/docs/problems/brand-not-found"
}{
"code": "IDEMPOTENCY_CONFLICT",
"status": 409,
"title": "Idempotency Conflict",
"type": "https://photon.codes/docs/problems/idempotency-conflict"
}{
"code": "PAYLOAD_TOO_LARGE",
"status": 413,
"title": "Payload Too Large",
"type": "https://photon.codes/docs/problems/payload-too-large"
}{
"code": "VALIDATION_FAILED",
"issues": [
{
"code": "invalid_type",
"location": "json",
"message": "Expected a string.",
"path": "/name"
}
],
"status": 422,
"title": "Request Validation Failed",
"type": "https://photon.codes/docs/problems/validation-failed"
}{
"code": "RATE_LIMITED",
"status": 429,
"title": "Too Many Requests",
"type": "https://photon.codes/docs/problems/rate-limited"
}{
"code": "INTERNAL_ERROR",
"status": 500,
"title": "Internal Server Error",
"type": "https://photon.codes/docs/problems/internal-error"
}{
"code": "SERVICE_FAILURE",
"status": 502,
"title": "Service Failure",
"type": "https://photon.codes/docs/problems/service-failure"
}{
"code": "SERVICE_UNAVAILABLE",
"status": 503,
"title": "Service Temporarily Unavailable",
"type": "https://photon.codes/docs/problems/service-unavailable"
}{
"code": "REQUEST_TIMEOUT",
"status": 504,
"title": "Request Timeout",
"type": "https://photon.codes/docs/problems/request-timeout"
}Authorizations
Account Service Key, prefixed with pho_ask_, sent as Authorization: Bearer <key>. Acts on behalf of its owning account, subject to the permissions and credential restrictions of each operation. Account access tokens and OAuth grants also use the Bearer header. In organizations that require SSO, Account Service Keys are not accepted for managing the organization's SSO settings, deleting the organization, or checking whether it can be deleted.
Headers
Identifies one logical mutation across retries.
1 - 255^[\x21-\x7e]{1,255}$Path Parameters
Body
- Option 1
- Option 2
Show child attributes
Show child attributes
Response
The redacted brand while registration is in progress.
Show child attributes
Show child attributes
Was this page helpful?