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

# DLT-India Onboarding

> Register your Principal Entity, Headers, content templates, and consent templates for India's TRAI DLT regime so your A2P SMS is delivered.

# DLT-India Onboarding

India's **TRAI DLT** (Distributed Ledger Technology) regime requires
every business that sends A2P SMS in India to register on a DLT portal
operated by a telecom operator before any traffic is delivered.
Unregistered or mismatched messages are blocked by the operators
themselves — not by Orbit.

Orbit mirrors the four DLT artifacts so you can manage your Indian
registrations alongside the rest of your compliance posture. You still
complete the underlying registration on a registrar's DLT portal;
Orbit records the resulting IDs and tracks their status.

All endpoints below are rooted at
`https://api.orbit.devotel.io/api/v1/compliance/dlt-india`.

<Warning>
  **DLT registration writes are gated and off by default.** The four
  `POST` endpoints below (`principal-entities`, `headers`,
  `content-templates`, `consent-templates`) return
  `503 FEATURE_DISABLED` until DLT registration is enabled for your
  deployment (`DEVOTEL_DLT_REGISTRATION_ENABLED=true`). The `GET` list
  endpoints and the `/nudge` endpoints stay open regardless, so you can
  read any existing rows and see delivery nudges. If you need to record
  DLT artifacts and the writes are gated, contact support to have the
  feature enabled.
</Warning>

<Note>
  These endpoints record the registrations you obtain on a DLT
  registrar's portal. Orbit does not approve them — the registrar and
  operators do. Once DLT registration is enabled, each artifact starts
  in `pending` and is updated as it clears.
</Note>

***

## Onboarding order

DLT artifacts depend on one another, so register them in this order:

<Steps>
  <Step title="Principal Entity (PE)">
    Register your business as a Principal Entity with a registrar and
    record the assigned **PE ID**.
  </Step>

  <Step title="Headers (Sender IDs)">
    Register the 3–11 character Headers (Sender IDs) you will send
    under, each tied to your PE and a category.
  </Step>

  <Step title="Content templates">
    Register every message template, with variable placeholders, under
    a Header and category.
  </Step>

  <Step title="Consent templates">
    Register the consent text that backs your opt-ins, so promotional
    sends can be tied to a documented consent artifact.
  </Step>
</Steps>

***

## 1. Principal Entity

`POST /dlt-india/principal-entities` (admin/owner) records your PE.

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/dlt-india/principal-entities \
  -H "Authorization: Bearer $ORBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "registrar": "vilpower",
    "pe_id": "1101234567890123",
    "legal_name": "Acme Retail Pvt Ltd",
    "pan_or_gstn": "AAACA1234A",
    "entity_type": "private_limited"
  }'
```

| Field         | Type   | Notes                                                          |
| ------------- | ------ | -------------------------------------------------------------- |
| `registrar`   | enum   | `vilpower`, `trueconnect`, `tanla`, `jio`, `videocon`, `bsnl`. |
| `pe_id`       | string | TRAI Principal Entity ID (8–20 chars).                         |
| `legal_name`  | string | Registered legal name (1–200).                                 |
| `pan_or_gstn` | string | Optional PAN or GSTN (≤ 50).                                   |
| `entity_type` | string | Optional (≤ 50).                                               |

`GET /dlt-india/principal-entities` lists your PEs with their
`status`, `rejection_reason`, and submission/approval timestamps.

***

## 2. Headers (Sender IDs)

`POST /dlt-india/headers` (admin/owner) registers a Header under a PE.

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/dlt-india/headers \
  -H "Authorization: Bearer $ORBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "principal_id": "pe_internal_id",
    "header": "ACMERT",
    "category": "transactional"
  }'
```

| Field          | Type   | Notes                                                                   |
| -------------- | ------ | ----------------------------------------------------------------------- |
| `principal_id` | string | The Orbit ID of the parent PE.                                          |
| `header`       | string | The Sender ID / Header (3–11 chars).                                    |
| `category`     | enum   | `promotional`, `transactional`, `service_implicit`, `service_explicit`. |

`GET /dlt-india/headers` lists registered Headers and their status.

***

## 3. Content templates

`POST /dlt-india/content-templates` (admin/owner) registers a message
template. DLT requires every message body to match an approved
template, with variable parts marked as placeholders.

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/dlt-india/content-templates \
  -H "Authorization: Bearer $ORBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "principal_id": "pe_internal_id",
    "header_id": "hdr_internal_id",
    "template_id": "1107654321098765432",
    "template_name": "Order shipped",
    "category": "transactional",
    "template_type": "text",
    "content": "Hi {#var#}, your order {#var#} has shipped.",
    "variables": ["name", "order_id"]
  }'
```

| Field           | Type      | Notes                                      |
| --------------- | --------- | ------------------------------------------ |
| `principal_id`  | string    | Parent PE.                                 |
| `header_id`     | string    | Optional parent Header.                    |
| `template_id`   | string    | Optional registrar template ID (≤ 64).     |
| `template_name` | string    | 1–200.                                     |
| `category`      | enum      | Same set as Headers.                       |
| `template_type` | enum      | `text`, `unicode`, `unicode_text`, `otp`.  |
| `content`       | string    | Body with `{#var#}` placeholders (1–2000). |
| `variables`     | string\[] | Optional variable names (≤ 20).            |

You can omit `template_id` until the registrar issues one — register the
template now and add the ID once it clears. The template is stored either
way.

`GET /dlt-india/content-templates` lists templates and their status.

***

## 4. Consent templates

`POST /dlt-india/consent-templates` (admin/owner) records the consent
text backing your opt-ins, required to tie promotional sends to a
documented consent artifact.

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/dlt-india/consent-templates \
  -H "Authorization: Bearer $ORBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "principal_id": "pe_internal_id",
    "consent_template_id": "1109876543210987654",
    "consent_name": "Marketing opt-in",
    "consent_text": "I agree to receive promotional messages from Acme Retail."
  }'
```

| Field                 | Type   | Notes                          |
| --------------------- | ------ | ------------------------------ |
| `principal_id`        | string | Parent PE.                     |
| `consent_template_id` | string | Registrar's consent ID (≤ 64). |
| `consent_name`        | string | 1–200.                         |
| `consent_text`        | string | The consent wording (1–2000).  |

`GET /dlt-india/consent-templates` lists consent templates and status.

***

## Status and nudges

Every artifact carries a `status` (starting at `pending`), an optional
`rejection_reason`, and submission/approval timestamps. If Orbit
detects a DLT-related delivery rejection on your India traffic,
`GET /dlt-india/nudge` surfaces an observational prompt
(`failure_count`, `last_seen_at`); `POST /dlt-india/nudge/dismiss`
acknowledges it.

<Warning>
  India is a registration-gated market: your PE, Header, and content
  template must all be in place and consistent for SMS to deliver. A
  body that does not match a registered template is rejected by the
  operator. Pair this with [Consent Management](/compliance/consent-management)
  for DPDP consent receipts.
</Warning>

***

## Related references

* [Consent Management & Receipts](/compliance/consent-management) —
  India DPDP consent receipts and Consent Managers.
* [Sender-ID Registration](/compliance/sender-id-registration) —
  Sender-ID registration for non-India markets.
* [Send Gates](/compliance/send-gates) — country rules and the gates
  that enforce them.
* [API Reference → Compliance](/api-reference/compliance) — full
  request/response schemas (regenerated from the live API).
