Skip to main content

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.
These endpoints record the registrations you obtain on a DLT registrar’s portal. Orbit does not approve them — the registrar and operators do. Each artifact starts in pending and is updated as it clears.

Onboarding order

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

Principal Entity (PE)

Register your business as a Principal Entity with a registrar and record the assigned PE ID.
2

Headers (Sender IDs)

Register the 3–11 character Headers (Sender IDs) you will send under, each tied to your PE and a category.
3

Content templates

Register every message template, with variable placeholders, under a Header and category.
4

Consent templates

Register the consent text that backs your opt-ins, so promotional sends can be tied to a documented consent artifact.

1. Principal Entity

POST /dlt-india/principal-entities (admin/owner) records your PE.
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"
  }'
FieldTypeNotes
registrarenumvilpower, trueconnect, tanla, jio, videocon, bsnl.
pe_idstringTRAI Principal Entity ID (8–20 chars).
legal_namestringRegistered legal name (1–200).
pan_or_gstnstringOptional PAN or GSTN (≤ 50).
entity_typestringOptional (≤ 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.
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"
  }'
FieldTypeNotes
principal_idstringThe Orbit ID of the parent PE.
headerstringThe Sender ID / Header (3–11 chars).
categoryenumpromotional, 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.
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"]
  }'
FieldTypeNotes
principal_idstringParent PE.
header_idstringOptional parent Header.
template_idstringRegistrar’s template ID (≤ 64).
template_namestring1–200.
categoryenumSame set as Headers.
template_typeenumtext, unicode, unicode_text, otp.
contentstringBody with {#var#} placeholders (1–2000).
variablesstring[]Optional variable names (≤ 20).
GET /dlt-india/content-templates lists templates and their status.
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.
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."
  }'
FieldTypeNotes
principal_idstringParent PE.
consent_template_idstringRegistrar’s consent ID (≤ 64).
consent_namestring1–200.
consent_textstringThe 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_failure_at); POST /dlt-india/nudge/dismiss acknowledges it.
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 for DPDP consent receipts.