> ## Documentation Index
> Fetch the complete documentation index at: https://www.vobiz.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# US 10DLC brands

> Register your business as a 10DLC brand through the Vobiz Messaging API - create, submit, poll registrar statuses, verify public companies, request vetting to raise throughput, and read the brand object.

A **brand** is the business behind your messages: its legal identity, tax ID, website and contact details. The US 10DLC registry verifies the brand before any campaign under it can be approved. One brand can own many campaigns.

<Tip>
  Building with code? The full request and response for every call here are in the [brand endpoints](/docs/sms/api/10dlc/create-brand) of the [Messaging API](/docs/sms/overview).
</Tip>

In the console, brands live under **SMS & RCS → Registration → Brands**. This page covers the same flow through the API.

<Note>
  Have the [registration checklist](/docs/sms/compliance/overview#registration-checklist) ready. The legal name, tax ID and address must match the entity's official records exactly.
</Note>

## Brand fields

Send these fields on [`POST /10dlc/brands`](/docs/sms/api/10dlc/create-brand) and on [`PUT /10dlc/brands/{id}`](/docs/sms/api/10dlc/update-brand). The `PUT` takes the full body, not a patch.

| Field | Type | Required | Description |
| - | - | - | - |
| `referenceId` | string | no | Your own idempotency reference. A retry with the same value reconciles to the same brand instead of creating a second one. Ignored on `PUT`. |
| `name` | string | yes | The brand name customers recognise. |
| `legalName` | string | | The registered legal name of the entity. |
| `brandType` | string | yes | `TENDLC_PRIVATE_COMPANY`, `TENDLC_PUBLIC_COMPANY`, `TENDLC_NON_PROFIT`, `TENDLC_GOVERNMENT` or `TOLL_FREE_NUMBER`. |
| `website` | string | | Public website URL on the brand's own domain. |
| `supportEmail` | string | | Monitored support mailbox. |
| `supportPhone` | string | | Support phone number in E.164 format. |
| `vertical` | string | | Industry of the business. See [values](#registry-values). |
| `taxId` | string | | EIN for US entities, or the business registration number for other countries. |
| `taxIdIssuingCountry` | string | | ISO 3166-1 alpha-2 code of the country that issued `taxId`. |
| `countryCode` | string | | ISO 3166-1 alpha-2 code of the country of registration. |
| `address` | object | | Registered address: `street`, `city`, `state`, `zipCode`. |
| `alternateBusinessId` | object | | Additional business identifier, as accepted by the registry. |
| `businessContactFirstName` | string | | First name of the person the registry can contact. |
| `businessContactLastName` | string | | Last name of that person. |
| `businessContactEmail` | string | | Email of that person. |
| `businessDba` | string | | Trading name if it differs from `legalName`. Note the casing: `businessDba` here, `businessDBA` on the [toll-free request](/docs/sms/compliance/us-toll-free). |
| `legalEntityType` | string | | `PRIVATE_COMPANY`, `PUBLIC_COMPANY`, `NON_PROFIT`, `GOVERNMENT` or `SOLE_PROPRIETOR`. |
| `businessRegistrationType` | string | | For non-US entities: the type of number in `taxId`. See [values](#registry-values). |
| `taxExemptStatus` | string | | Tax-exempt classification for non-profits, as accepted by the registry. |
| `stockExchange` | string | | Exchange ticker listing, for `TENDLC_PUBLIC_COMPANY`. |
| `stockSymbol` | string | | Ticker symbol, for `TENDLC_PUBLIC_COMPANY`. |

### Registry values

The US 10DLC registry accepts these values. Vobiz passes them through as you send them.

<AccordionGroup>
  <Accordion title="vertical">
    `AGRICULTURE`, `COMMUNICATION`, `CONSTRUCTION`, `EDUCATION`, `ENERGY`, `ENTERTAINMENT`, `FINANCIAL`, `GAMBLING`, `GOVERNMENT`, `HEALTHCARE`, `HOSPITALITY`, `HUMAN_RESOURCES`, `INSURANCE`, `LEGAL`, `MANUFACTURING`, `NGO`, `POLITICAL`, `POSTAL`, `PROFESSIONAL`, `REAL_ESTATE`, `RETAIL`, `TECHNOLOGY`, `TRANSPORTATION`
  </Accordion>

  <Accordion title="legalEntityType">
    `PRIVATE_COMPANY`, `PUBLIC_COMPANY`, `NON_PROFIT`, `GOVERNMENT`, `SOLE_PROPRIETOR`
  </Accordion>

  <Accordion title="businessRegistrationType (non-US entities)">
    `VAT`, `CBN`, `PROVINCIAL_NUMBER`, `ABN`, `SIREN`, `NZBN`, `CIF`, `CNPJ`, `OTHER`
  </Accordion>
</AccordionGroup>

## Register a brand

<Steps>
  <Step title="Create the brand">
    `POST /10dlc/brands` creates the brand with `stage: DRAFT`. It is not submitted for review until you register it in the next step.

    <CodeGroup>
      ```bash cURL theme={null}
      curl -X POST "https://api.vobiz.ai/api/v1/sms/10dlc/brands" \
        -H "X-Auth-ID: MA_XXXXXXXX" \
        -H "X-Auth-Token: YOUR_AUTH_TOKEN" \
        -H "Content-Type: application/json" \
        -d '{
          "referenceId": "acme-brand-2026",
          "name": "Acme",
          "legalName": "Acme Corporation",
          "brandType": "TENDLC_PRIVATE_COMPANY",
          "legalEntityType": "PRIVATE_COMPANY",
          "vertical": "TECHNOLOGY",
          "website": "https://example.com",
          "supportEmail": "support@example.com",
          "supportPhone": "+14155550100",
          "taxId": "12-3456789",
          "taxIdIssuingCountry": "US",
          "countryCode": "US",
          "address": {
            "street": "100 Market Street",
            "city": "San Francisco",
            "state": "CA",
            "zipCode": "94105"
          },
          "businessContactFirstName": "Jane",
          "businessContactLastName": "Doe",
          "businessContactEmail": "jane.doe@example.com"
        }'
      ```

      ```python Python theme={null}
      import requests

      BASE = "https://api.vobiz.ai/api/v1/sms"
      HEADERS = {
          "X-Auth-ID": "MA_XXXXXXXX",
          "X-Auth-Token": "YOUR_AUTH_TOKEN",
          "Content-Type": "application/json",
      }

      brand = {
          "referenceId": "acme-brand-2026",
          "name": "Acme",
          "legalName": "Acme Corporation",
          "brandType": "TENDLC_PRIVATE_COMPANY",
          "legalEntityType": "PRIVATE_COMPANY",
          "vertical": "TECHNOLOGY",
          "website": "https://example.com",
          "supportEmail": "support@example.com",
          "supportPhone": "+14155550100",
          "taxId": "12-3456789",
          "taxIdIssuingCountry": "US",
          "countryCode": "US",
          "address": {
              "street": "100 Market Street",
              "city": "San Francisco",
              "state": "CA",
              "zipCode": "94105",
          },
          "businessContactFirstName": "Jane",
          "businessContactLastName": "Doe",
          "businessContactEmail": "jane.doe@example.com",
      }

      r = requests.post(f"{BASE}/10dlc/brands", headers=HEADERS, json=brand)
      r.raise_for_status()
      print(r.json()["id"], r.json()["stage"])
      ```

      ```javascript Node theme={null}
      const BASE = "https://api.vobiz.ai/api/v1/sms";
      const headers = {
        "X-Auth-ID": "MA_XXXXXXXX",
        "X-Auth-Token": "YOUR_AUTH_TOKEN",
        "Content-Type": "application/json",
      };

      const brand = {
        referenceId: "acme-brand-2026",
        name: "Acme",
        legalName: "Acme Corporation",
        brandType: "TENDLC_PRIVATE_COMPANY",
        legalEntityType: "PRIVATE_COMPANY",
        vertical: "TECHNOLOGY",
        website: "https://example.com",
        supportEmail: "support@example.com",
        supportPhone: "+14155550100",
        taxId: "12-3456789",
        taxIdIssuingCountry: "US",
        countryCode: "US",
        address: { street: "100 Market Street", city: "San Francisco", state: "CA", zipCode: "94105" },
        businessContactFirstName: "Jane",
        businessContactLastName: "Doe",
        businessContactEmail: "jane.doe@example.com",
      };

      const res = await fetch(`${BASE}/10dlc/brands`, {
        method: "POST",
        headers,
        body: JSON.stringify(brand),
      });
      if (!res.ok) throw new Error(await res.text());
      const created = await res.json();
      console.log(created.id, created.stage);
      ```
    </CodeGroup>

    The response is `201` with the [brand object](#the-brand-object). Keep `id`; every other call uses it.
  </Step>

  <Step title="Submit it to the registry">
    [`POST /10dlc/brands/{id}/register`](/docs/sms/api/10dlc/register-brand) has no body. It returns `200` with the brand refreshed: `stage` becomes `SUBMITTED` and `registrationStatus` starts at `PENDING`.
  </Step>

  <Step title="Poll the registrar statuses">
    [`GET /10dlc/brands/{id}/registrar-statuses`](/docs/sms/api/10dlc/brand-registrar-statuses) returns one entry per registrar:

    ```json theme={null}
    [
      {
        "registrar": "REGISTRAR_NAME",
        "state": "ACTIVE",
        "brandIdentityStatus": "VERIFIED"
      }
    ]
    ```

    `registrar` identifies the registrar that reported the state. `brandIdentityStatus`, `brandAuthenticationStatus` and `rejectionReason` appear only when the registrar has set them. An empty array means no registrar has reported yet. [`GET /10dlc/brands/{id}`](/docs/sms/api/10dlc/get-brand) also refreshes the brand from the registry before returning it, so either call works for polling. The [WebSocket](/docs/sms/websocket) `10dlc.brand.updated` event tells you when the brand changes without polling.
  </Step>

  <Step title="Public companies: complete brand authentication">
    Brands with `brandType: TENDLC_PUBLIC_COMPANY` go through an extra authentication step. [`POST /10dlc/brands/{id}/brand-auth-verification`](/docs/sms/api/10dlc/brand-auth-verification) starts it and returns `202 {"status": "requested"}`. If the one-time code did not arrive, [`POST /10dlc/brands/{id}/resend-2fa`](/docs/sms/api/10dlc/resend-2fa) sends it again, also `202 {"status": "requested"}`. While the code is outstanding, `registrationStatus` reads `PENDING_2FA`.

    Calling either endpoint on another brand type returns `400 {"error": "invalid request: brand authentication is only available for TENDLC_PUBLIC_COMPANY brands"}`.
  </Step>

  <Step title="Optional: request vetting to raise throughput">
    Registered brands start with a baseline message throughput. Vetting lets the registry assign a higher tier. [`POST /10dlc/brands/{id}/vet`](/docs/sms/api/10dlc/vet-brand) takes `{"type": "STANDARD"}`, `ENHANCED` or `POLITICAL` (default `STANDARD`; any other value is `400 {"error": "invalid request: type must be one of STANDARD, ENHANCED, POLITICAL"}`). The `200` body is the vetting record as the registry returns it.

    [`GET /10dlc/brands/{id}/vets`](/docs/sms/api/10dlc/list-brand-vets) lists past vetting requests as `{"results": [...], "paging": {"page", "size", "totalPages", "totalResults"}}`. Pass `page` (0 or more) and `size` (0 to 100); other values return `400 {"error": "page must be >= 0 and size between 0 and 100"}`.
  </Step>
</Steps>

<Warning>
  Only request vetting with your own credentials, after you have confirmed any fee with support and established that your campaigns need the extra throughput.
</Warning>

## Update or delete a brand

* [`PUT /10dlc/brands/{id}`](/docs/sms/api/10dlc/update-brand) replaces the brand with the full body you send, using the same fields as create. `referenceId` is ignored. Use it to fix a rejected brand before registering again.
* [`DELETE /10dlc/brands/{id}`](/docs/sms/api/10dlc/delete-brand) returns `204`. A brand that still owns campaigns returns `409 {"error": "conflict: brand still has 2 campaign(s); delete them first"}`.
* [`GET /10dlc/brands`](/docs/sms/api/10dlc/list-brands) returns every brand on the account as an array, newest first.

## The brand object

```json theme={null}
{
  "id": "9b2e1c40-8a3d-4f5e-9c1a-7d6b2e8f4a01",
  "accountId": "MA_XXXXXXXX",
  "name": "Acme",
  "legalName": "Acme Corporation",
  "brandType": "TENDLC_PRIVATE_COMPANY",
  "stage": "SUBMITTED",
  "registrationStatus": "ACTIVE",
  "brandIdentityStatus": "VERIFIED",
  "website": "https://example.com",
  "supportEmail": "support@example.com",
  "supportPhone": "+14155550100",
  "vertical": "TECHNOLOGY",
  "taxId": "12-3456789",
  "taxIdIssuingCountry": "US",
  "countryCode": "US",
  "address": {
    "street": "100 Market Street",
    "city": "San Francisco",
    "state": "CA",
    "zipCode": "94105"
  },
  "businessContactFirstName": "Jane",
  "businessContactLastName": "Doe",
  "legalEntityType": "PRIVATE_COMPANY",
  "lastSyncedAt": "2026-10-16T21:17:05.539407Z",
  "createdAt": "2026-10-06T08:58:02Z",
  "updatedAt": "2026-10-06T18:51:11.867922Z"
}
```

Fields you did not set are omitted. Three fields describe progress:

| Field | Values | Meaning |
| - | - | - |
| `stage` | `DRAFT`, `SUBMITTED` | Whether the brand has been sent to the registry. |
| `registrationStatus` | `PENDING`, `PENDING_2FA`, `PENDING_APPEAL`, `ACTIVE`, `REJECTED` | The registrar's decision. `ACTIVE` means campaigns under this brand can be approved. |
| `brandIdentityStatus` | Registry string, for example `VERIFIED` | Whether the legal identity (tax ID, name, address) was confirmed against official records. |

When a registrar rejects the brand, `rejectionReasons` holds an array of `{registrar, state, rejectionReason}` entries. Fix the fields it names with `PUT`, then call `register` again.

## Errors

All errors are `{"error": "<message>"}`. Responses that originate at the registry add `providerError`, an opaque diagnostic string you can quote to support.

| Status | When | Example body |
| - | - | - |
| `400` | Required field missing or a value fails validation | `{"error": "invalid request: brandType is required"}` |
| `404` | Unknown brand id, or a brand on another account | `{"error": "brand not found"}` |
| `409` | A conflicting state, such as deleting a brand that owns campaigns | `{"error": "conflict: brand still has 1 campaign(s); delete them first"}` |
| `422` | The registry rejected the request | `{"error": "registration provider rejected the request: ...", "providerError": "..."}` |
| `502` | The registry could not be reached | `{"error": "registration provider unavailable", "providerError": "..."}` |

See the [error reference](/docs/sms/errors) for the full list.

## Next steps

<CardGroup cols={2}>
  <Card title="Create a campaign" icon="bullhorn" href="/docs/sms/compliance/us-10dlc-campaigns">
    Describe your use case and attach numbers to this brand.
  </Card>

  <Card title="Brand endpoints" icon="code" href="/docs/sms/api/10dlc/create-brand">
    Full request and response schemas.
  </Card>
</CardGroup>

## Build it with the Messaging API

<CardGroup cols={2}>
  <Card title="Brand endpoints" icon="code" href="/docs/sms/api/10dlc/create-brand">
    Create, register, verify and vet a brand.
  </Card>

  <Card title="WebSocket events" icon="bolt" href="/docs/sms/websocket">
    Get `10dlc.brand.updated` as review progresses.
  </Card>

  <Card title="Send your first SMS" icon="rocket" href="/docs/sms/quickstart">
    Send once your campaign is registered.
  </Card>

  <Card title="Errors" icon="triangle-exclamation" href="/docs/sms/errors">
    Registry errors and `providerError`.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.