> For the complete documentation index, see [llms.txt](https://docs.tnid.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tnid.com/10dlc/brands.md).

# 10DLC Brands

Register and manage 10DLC brands through TNID: API keys, draft and submit flows, statuses, listing and sharing brands with partner companies.

10DLC is the US carrier registration system for application-to-person messaging on local numbers. A **brand** is the registered business that sends messages; **campaigns** (next page) describe what it sends. TNID submits brands and campaigns to The Campaign Registry (TCR) for you and tracks their status.

{% hint style="info" %}
All 10DLC operations are on the `/company` GraphQL server with a company token. Every operation is documented with request, variables and response in the [API Reference](https://docs.tnid.com/api-reference/002_company/002_ten_dlc).
{% endhint %}

## 1. Register a 10DLC API key

Brands and campaigns are submitted under a 10DLC (TCR) API key. Register the key with TNID once; it must be a key provisioned for this purpose only, not shared with another integration.

```graphql
mutation ($name: String!, $apiKey: String!, $apiKeySecret: String!) {
  addTenDlcApiKey(name: $name, apiKey: $apiKey, apiKeySecret: $apiKeySecret) {
    apiKeyId
    companyId
    name
  }
}
```

Related: `tenDlcApiKeys` lists your keys, `updateTenDlcApiKey` renames one, `deleteTenDlcApiKey` removes one.

**Sharing a key with a partner.** A company that owns a key can let another company register brands and campaigns under it with `authorizeTenDlcApiKey(apiKeyId, authorizedCompanyId)`, see the authorizations with `tenDlcApiKeyAuthorizations`, and withdraw with `revokeTenDlcApiKeyAuthorization`. The authorized company then sees those brands and campaigns with `ownershipType` other than `DIRECT`.

## 2. Brand lifecycle

| Status           | Meaning                                                                              |
| ---------------- | ------------------------------------------------------------------------------------ |
| `DRAFT`          | Saved in TNID, not sent to TCR. Edit freely.                                         |
| `PENDING_REVIEW` | Submitted to TCR, awaiting verification.                                             |
| `ACTIVE`         | Verified. Campaigns can be submitted against it.                                     |
| `REJECTED`       | TCR rejected the brand. Fix the data and resubmit with `updateAndSubmitTenDlcBrand`. |
| `EXPIRED`        | Registration lapsed.                                                                 |

Two ways in:

* **Draft first** (recommended when data arrives in pieces): `registerTenDlcBrandAsDraft(input)` creates a `DRAFT`; `updateTenDlcBrandAsDraft(id, input)` edits it; `updateAndSubmitTenDlcBrand(id, input)` submits it.
* **One shot:** `registerAndSubmitTenDlcBrand(input)` creates and submits in a single call.

```graphql
mutation ($input: TenDlcRegisterBrandInput!) {
  registerAndSubmitTenDlcBrand(input: $input) {
    id
    brandId
    displayName
    entityType
    status
  }
}
```

```json
{
  "input": {
    "companyId": "<your company id>",
    "tenDlcApiKeyId": "<id returned by addTenDlcApiKey>",
    "displayName": "Acme Metals",
    "companyName": "Acme Metals LLC",
    "entityType": "PRIVATE_PROFIT",
    "brandRelationship": "BASIC_ACCOUNT",
    "ein": "12-3456789",
    "einIssuingCountry": "US",
    "vertical": "PROFESSIONAL",
    "website": "https://acme-metals.example",
    "email": "compliance@acme-metals.example",
    "phone": "+14155551234",
    "street": "123 Main St",
    "city": "San Francisco",
    "state": "CA",
    "postalCode": "94105",
    "country": "US"
  }
}
```

The response `status` is `PENDING_REVIEW`; `brandId` is the TCR identifier (for example `BAXKPHB`). Poll `tenDlcBrand(id)` or list with `tenDlcBrands` until `status` is `ACTIVE`, then submit campaigns. `workflowStatus` (for example `VERIFIED`) reflects TCR's own verification workflow.

Allowed values for `entityType`, `brandRelationship`, `vertical` and the status enums are listed under [Enums](https://docs.tnid.com/api-reference/003_definitions/enums) in the API Reference.

## 3. Find and inspect brands

```graphql
query ($status: TenDlcBrandStatus, $ownershipType: TenDlcOwnershipType, $page: Int, $pageSize: Int) {
  tenDlcBrands(status: $status, ownershipType: $ownershipType, page: $page, pageSize: $pageSize) {
    page
    totalRecords
    records {
      id
      brandId
      displayName
      status
      workflowStatus
      ownershipType
    }
  }
}
```

10DLC lists use page-number pagination (`page`, `pageSize`, `totalRecords`) rather than the cursor style used elsewhere; see [Pagination](broken://pages/pagination). `tenDlcBrand(id)` returns one brand with its full address and contact fields. `deleteTenDlcBrand(id)` removes a brand from TNID.

## What to read next

* [10DLC Campaigns](/10dlc/campaigns.md): describe the messaging use case and attach numbers.
* Webhooks: get notified instead of polling.
* API Reference: [all 23 10DLC operations](https://docs.tnid.com/api-reference/002_company/002_ten_dlc).
