> ## 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.

# India DLT

> Send SMS to Indian numbers through Vobiz with your TRAI DLT identifiers - what the entity, header and template IDs are, how to pass dltEntityId, dltHeaderId and dltTemplateId on messages and broadcasts, and why the text must match the registered template.

India's telecom regulator (TRAI) requires every commercial SMS to be traceable to a registered sender and a registered template. The registration happens on a **Distributed Ledger Technology (DLT)** portal run by the Indian operators. Once registered, you receive three identifiers. Vobiz lets you attach them to every message and broadcast you send to Indian numbers.

<Tip>
  Building with code? DLT IDs are fields on [Send a message](/docs/sms/api/messages/send-message) and on [broadcasts](/docs/sms/broadcasts) in the [Messaging API](/docs/sms/overview).
</Tip>

<Note>
  Vobiz records the identifiers you supply on each message. Register your entity, headers and templates on a DLT portal first; the operators check each message against that registration.
</Note>

## The three identifiers

| Field | What it is | Where it comes from |
| - | - | - |
| `dltEntityId` | Your **Principal Entity ID**: the identity of the business sending the message. | Issued when your organisation completes entity registration on a DLT portal. |
| `dltHeaderId` | The registered **sender header** (the 6-character alphanumeric sender ID recipients see, for example `ACMEIN`) and its ID. | Issued per header you register under your entity. Transactional, service and promotional headers are registered separately. |
| `dltTemplateId` | The ID of the registered **content template** your message text follows. | Issued per template. A template fixes the wording and marks the variable positions. |

The message `text` must match the registered template, with the variable positions filled in. For example, if the template is

```
Dear {#var#}, your OTP for Acme is {#var#}. Valid for 10 minutes.
```

then the text you send must be that sentence with the two variables replaced, for example `Dear Jane, your OTP for Acme is 482913. Valid for 10 minutes.` Operators reject messages whose text does not match a template registered under the header you used, and messages with no DLT data at all.

## Pass the IDs on a message

Add the three fields to [`POST /messages`](/docs/sms/api/messages/send-message). They are stored on the message record alongside the rest of the request.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.vobiz.ai/api/v1/sms/messages" \
    -H "X-Auth-ID: MA_XXXXXXXX" \
    -H "X-Auth-Token: YOUR_AUTH_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "from": "ACMEIN",
      "to": ["+919876543210"],
      "text": "Dear Jane, your OTP for Acme is 482913. Valid for 10 minutes.",
      "dltEntityId": "1101234567890123456",
      "dltHeaderId": "1105123456789012345",
      "dltTemplateId": "1107123456789012345",
      "idempotencyKey": "otp-482913-919876543210"
    }'
  ```

  ```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",
  }

  r = requests.post(
      f"{BASE}/messages",
      headers=HEADERS,
      json={
          "from": "ACMEIN",
          "to": ["+919876543210"],
          "text": "Dear Jane, your OTP for Acme is 482913. Valid for 10 minutes.",
          "dltEntityId": "1101234567890123456",
          "dltHeaderId": "1105123456789012345",
          "dltTemplateId": "1107123456789012345",
          "idempotencyKey": "otp-482913-919876543210",
      },
  )
  r.raise_for_status()
  print(r.json()["id"], r.json()["status"])
  ```

  ```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 res = await fetch(`${BASE}/messages`, {
    method: "POST",
    headers,
    body: JSON.stringify({
      from: "ACMEIN",
      to: ["+919876543210"],
      text: "Dear Jane, your OTP for Acme is 482913. Valid for 10 minutes.",
      dltEntityId: "1101234567890123456",
      dltHeaderId: "1105123456789012345",
      dltTemplateId: "1107123456789012345",
      idempotencyKey: "otp-482913-919876543210",
    }),
  });
  if (!res.ok) throw new Error(await res.text());
  const message = await res.json();
  console.log(message.id, message.status);
  ```
</CodeGroup>

The ID values above are placeholders. Use the values your DLT portal shows for your entity, header and template.

<Tip>
  Keep one template ID per message shape in your code, and build the text from the same string you registered. Drift between the two is the most common reason an Indian operator rejects a message.
</Tip>

## Pass the IDs on a broadcast

[`POST /broadcasts`](/docs/sms/api/broadcasts/create-broadcast) and [`PUT /broadcasts/{id}`](/docs/sms/api/broadcasts/update-broadcast) take the same three fields, each up to 64 characters. Every recipient's message is sent with them.

```json theme={null}
{
  "name": "October statement reminder",
  "from": "ACMEIN",
  "template": "Dear {{name}}, your Acme statement for {{month}} is ready at https://example.com/statements.",
  "dltEntityId": "1101234567890123456",
  "dltHeaderId": "1105123456789012345",
  "dltTemplateId": "1107123456789012346"
}
```

The broadcast `template` uses `{{variable}}` placeholders filled from the columns of the uploaded recipient file. Make sure the result, after substitution, still matches the DLT template registered under `dltTemplateId`. The [Broadcasts guide](/docs/sms/broadcasts) covers uploads, preview and launch.

## Sender IDs and numbers for India

Indian A2P traffic is sent from registered alphanumeric headers, not from long-code phone numbers. [`GET /numbers/available?country=IN`](/docs/sms/api/numbers/search-available-numbers) returns an empty list with the hint `India uses DLT sender IDs, not long codes`, and [`POST /numbers/purchase`](/docs/sms/api/numbers/purchase-number) for an Indian number returns `422` with the same message. Register your header on a DLT portal and contact [support@vobiz.ai](mailto:support@vobiz.ai) to have it enabled as a `from` value on your account.

## Checklist before you send to India

* Entity registered on a DLT portal and `dltEntityId` recorded.
* Header registered for the right category (transactional, service or promotional) and `dltHeaderId` recorded.
* Template registered under that header, `dltTemplateId` recorded, and your message text reproduces it exactly with variables filled.
* Promotional traffic respects the recipient's Do Not Disturb preference and the permitted sending window. See [UCC and NDNC compliance](/docs/compliance/india/ucc).
* Opt-outs handled on your side as well: a recipient who texts STOP is recorded in [opt-outs](/docs/sms/opt-outs) and subsequent sends to them return `422`.

## Build it with the Messaging API

<CardGroup cols={2}>
  <Card title="Send a message" icon="code" href="/docs/sms/api/messages/send-message">
    Pass `dltEntityId`, `dltHeaderId` and `dltTemplateId`.
  </Card>

  <Card title="Broadcasts" icon="bullhorn" href="/docs/sms/broadcasts">
    Set DLT IDs once for a whole send.
  </Card>

  <Card title="Sending SMS" icon="message" href="/docs/sms/channels/sms">
    Segments, idempotency and statuses.
  </Card>

  <Card title="Opt-outs" icon="ban" href="/docs/sms/opt-outs">
    Honour STOP replies on every channel.
  </Card>
</CardGroup>

## Related Vobiz India compliance pages

<CardGroup cols={3}>
  <Card title="India calling regulations" icon="scale-balanced" href="/docs/compliance/india/calling-regulations">
    TRAI and DoT requirements for voice traffic in India.
  </Card>

  <Card title="India number KYC" icon="id-card" href="/docs/compliance/india/kyc">
    Identity verification for Indian numbers on Vobiz.
  </Card>

  <Card title="UCC and NDNC" icon="ban" href="/docs/compliance/india/ucc">
    Do Not Disturb registry and unsolicited commercial communication rules.
  </Card>
</CardGroup>

## Next steps

<CardGroup cols={2}>
  <Card title="Send a message" icon="paper-plane" href="/docs/sms/api/messages/send-message">
    Full request schema including the DLT fields.
  </Card>

  <Card title="Broadcasts" icon="bullhorn" href="/docs/sms/broadcasts">
    Bulk sends with DLT IDs on every recipient.
  </Card>
</CardGroup>


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