> ## Documentation Index
> Fetch the complete documentation index at: https://onextel-09023014.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# CleverTap

> Send RCS and SMS from CleverTap campaigns through OneXtel — providers, campaigns, callbacks, SMS fallback, and how each OneXtel error code reaches CleverTap.

The CleverTap connector adds RCS and SMS as sendable channels inside CleverTap. Campaigns are built
and triggered in CleverTap; a stateless middleware service translates each send into OneXtel's
format and relays delivery reports, replies, and click events back.

Because the connector holds no database of its own — every routing decision comes from the
incoming request — OneXtel can run it as multiple parallel instances. You deploy nothing.

<Tip>
  **Pick your channel once.** The sections below have an **RCS** and an **SMS** tab. Choosing a tab
  in any section switches every section on the page to that channel.
</Tip>

## What it handles

<CardGroup cols={2}>
  <Card title="Outbound RCS" icon="paper-plane">
    RCS sends from CleverTap campaigns, using either CleverTap's composer output or a pre-made
    OneXtel template.
  </Card>

  <Card title="Outbound SMS" icon="message">
    DLT-registered SMS from CleverTap's Generic SMS provider, with delivery reports mapped onto
    CleverTap's SMS error codes.
  </Card>

  <Card title="SMS fallback" icon="shuffle">
    If RCS delivery fails, OneXtel retries automatically over SMS using a DLT-approved template.
  </Card>

  <Card title="Delivery and clicks" icon="circle-check">
    Delivery reports, suggestion-button replies, and URL-click events relayed into CleverTap.
  </Card>

  <Card title="Inbound replies" icon="reply">
    Free-form RCS replies — text, media, location, contact — routed back to CleverTap.
  </Card>
</CardGroup>

## Before you start

Have these ready:

* **Your OneXtel API key** — see [API keys](/guides/platform/api-keys).
* **CleverTap access** to **Settings → Channels → SMS**, with permission to add a provider.
* **OneXtel access** to [callback configuration](/guides/platform/callback-configuration).
* **For SMS:** a DLT-registered sender ID, DLT entity ID, and DLT templates in OneXtel. See
  [DLT registration](/guides/sms/dlt).

### Connector endpoints

Every URL in this guide sits on one host. Copy them from here as you go.

| Channel | Purpose | URL |
| - | - | - |
| RCS | RCS send | `https://ct.onex-aura.com/rcs/send` |
| RCS | Delivery reports and button replies | `https://ct.onex-aura.com/dlr` |
| RCS | Inbound messages | `https://ct.onex-aura.com/inbound` |
| RCS | URL clicks | `https://ct.onex-aura.com/click` |
| SMS | SMS send | `https://ct.onex-aura.com/sms/send` |
| SMS | SMS delivery reports — standalone SMS and RCS fallback alike | `https://ct.onex-aura.com/delivery` |
| — | Health check | `https://ct.onex-aura.com/health` |

<Warning>
  **The host is `onex-aura.com`, with a hyphen.** Dropping it gives you `ct.onexaura.com`, which
  resolves to a real server that does not run the connector — so the mistake shows up as a timeout
  or a silent failure rather than an obvious DNS error. Check the hyphen before you save anything.
</Warning>

## Set up

<Tabs>
  <Tab title="RCS">
    Work through the parts in order.

    | Part | What you do | Where |
    | - | - | - |
    | [A](#part-a--create-the-provider-and-configure-rcs-and-sms-fallback) | Create the provider and configure RCS and SMS fallback | CleverTap |
    | [B](#part-b--add-templates-in-clevertap-optional) | Add templates — **optional** | CleverTap |
    | [C](#part-c--build-the-campaign-and-personalize-it) | Build the campaign and set up personalization | CleverTap |
    | [D](#part-d--configure-the-callbacks-before-you-send) | Configure the callbacks | OneXtel |
    | [E](#part-e--send-and-validate) | Send to a test audience, validate, then go live | Both |

    ### Part A — Create the provider and configure RCS and SMS fallback

    <Steps>
      <Step title="Create the provider">
        In CleverTap, go to **Settings → Channels → SMS**, add a provider, and set **Provider** to
        **Generic RCS Provider**. Give it a clear nickname.
      </Step>

      <Step title="Set the messaging endpoint">
        | Field | Value |
        | - | - |
        | Request Type | `POST` |
        | HTTPS Endpoint | `https://ct.onex-aura.com/rcs/send` |
        | Authentication | No Authentication |
        | Headers | Key `apikey` → your OneXtel API key |

        Authentication is set to none because the API key travels as a header, not as an auth
        scheme CleverTap manages.

        <Frame caption="Provider Configuration — provider, messaging endpoint, and the apikey header">
          <img src="https://mintcdn.com/onextel-09023014/nBmRXMjXsjq-UyTs/images/plugins/clevertap-provider-config.png?fit=max&auto=format&n=nBmRXMjXsjq-UyTs&q=85&s=62ef718db46e82f21ff3e6a8a3b1be1a" alt="CleverTap Provider Configuration with Generic RCS Provider selected, the messaging endpoint, No Authentication, and an apikey header" width="1340" height="748" data-path="images/plugins/clevertap-provider-config.png" />
        </Frame>
      </Step>

      <Step title="Set the RCS sender and body parameters">
        Set **RCS Sender ID** to your OneXtel RCS sender profile, or to a
        [pool](/plugins/overview#pools-instead-of-a-single-sender). If you use a pool, only
        templates assigned to that pool will resolve. If your account has more than one sender
        profile, you can also choose the profile per campaign with an optional `sender_id` pair —
        see [Part C](#part-c--build-the-campaign-and-personalize-it).

        <Note>
          **Sending from several senders through one provider.** CleverTap fixes the RCS Sender ID on
          the provider, not on the campaign, so by default one provider sends from one profile. If you
          run several brands or senders on one CleverTap project, put a placeholder of the form
          `<brand>_onextel_rcs` in **RCS Sender ID** instead of a real profile — for example
          `acme_onextel_rcs`.

          OneXtel reads any sender ID in that shape as a placeholder rather than a real sender, and
          takes the actual profile from the `sender_id` key-value pair on each campaign. That pair
          stops being optional and becomes required: a campaign that omits it is rejected rather than
          sent from the placeholder.

          The same applies to SMS, with `<brand>_onextel_sms` and the SMS provider's **Sender ID**.
          One provider and one endpoint then serve every sender on the account.
        </Note>

        Under **RCS Body Parameters**, add these key-value pairs. The `$$` syntax tells CleverTap to
        fill the value from the campaign's custom params.

        | Key | Value |
        | - | - |
        | `message_type` | `$$message_type` |
        | `template_id` | `$$template_id` |

        <Frame caption="RCS Config — sender ID and body parameters">
          <img src="https://mintcdn.com/onextel-09023014/nBmRXMjXsjq-UyTs/images/plugins/clevertap-rcs-params.png?fit=max&auto=format&n=nBmRXMjXsjq-UyTs&q=85&s=dc40888b086e00ae80dd3c6a6b85c662" alt="CleverTap RCS Config showing the RCS Sender ID and the message_type and template_id body parameters" width="1042" height="580" data-path="images/plugins/clevertap-rcs-params.png" />
        </Frame>
      </Step>

      <Step title="Enable SMS fallback">
        Turn on **SMS Configuration / Enable Fallback SMS** and set **SMS Sender ID** to your
        OneXtel SMS sender ID.

        Under **SMS Body Parameters**, add:

        | Key | Value |
        | - | - |
        | `type` | `$$type` |
        | `templateId` | `$$templateId` |
        | `unicode` | `$$unicode` |
        | `entityId` | `$$entityId` |
        | `fallback_id` | `$$fallback_id` |

        <Frame caption="SMS Configuration — fallback sender and body parameters">
          <img src="https://mintcdn.com/onextel-09023014/nBmRXMjXsjq-UyTs/images/plugins/clevertap-sms-params.png?fit=max&auto=format&n=nBmRXMjXsjq-UyTs&q=85&s=23d578473b5331bc62fa4f2e71364179" alt="CleverTap SMS Configuration with Enable Fallback SMS on, the SMS Sender ID, and five SMS body parameters" width="748" height="666" data-path="images/plugins/clevertap-sms-params.png" />
        </Frame>
      </Step>

      <Step title="Save, then copy both callback URLs">
        Save the provider, then **reopen it**. Under **Callback Config** you will find two
        read-only URLs. Copy both — you paste them into OneXtel in
        [Part D](#part-d--configure-the-callbacks-before-you-send).

        | URL | Used for |
        | - | - |
        | Delivery Report Callback URL | Delivery reports, clicks, and SMS fallback reports |
        | Inbound Message Callback URL | Inbound replies — carries a `providerId` parameter |

        The Inbound URL only appears after you reopen the saved provider; immediately after the
        first save you may see only the Delivery Report URL.
      </Step>
    </Steps>

    ### Part B — Add templates in CleverTap (optional)

    You do not need a CleverTap template to send a OneXtel template. The `template_id` key-value pair
    you add to the campaign in [Part C](#part-c--build-the-campaign-and-personalize-it) tells OneXtel
    which approved template to send, and the campaign's other key-value pairs fill its variables. A
    **Text Free Form** campaign with the right pairs is enough.

    Add templates here only when you want to build campaigns from them inside CleverTap — for
    example, to start from a prebuilt card or carousel layout in the campaign composer.

    To add one, open the saved provider, switch to its **Templates** tab, and create the template
    with the **exact same name** as its OneXtel template code — for example `payment_success_onex` —
    and the same type (Text, Rich Card or Carousel). Template names are unique per provider, so the
    same name can be reused across a UAT and a production provider.

    CleverTap documents this in
    [Generic RCS → Add a Template](https://docs.clevertap.com/docs/generic-rcs#add-a-template)
    and, for the fields of each template type, in
    [RCS Message Templates](https://docs.clevertap.com/docs/rcs-message-templates#add-message-template).

    <Warning>
      **Do not use CleverTap's `{{1}}` placeholders to personalize.** CleverTap's template editor
      recommends positional variables such as `{{1}}` and `{{2}}`, but their values are not passed to
      OneXtel. If a template you add here contains them, CleverTap still asks for a value before it
      lets you publish — fill it with anything. What the recipient sees comes from the campaign's
      key-value pairs, set up in Part C.
    </Warning>

    ### Part C — Build the campaign and personalize it

    Everything OneXtel needs to render the message travels in the campaign's **RCS Body Key-Value
    Pairs**: which template to send, its message category, and the value of each variable.

    <Steps>
      <Step title="Create the campaign">
        In CleverTap, create a new campaign. Under **From**, select the provider you created in
        Part A. Under **Who**, choose your audience. Under **What**, choose the **Text Free Form**
        type and enter a message body — or, if you added templates in Part B, pick one of those.

        When the campaign sends a OneXtel template through `template_id`, the body you enter here is
        only what CleverTap shows while you build. The recipient receives the OneXtel template.
      </Step>

      <Step title="Add the RCS key-value pairs">
        | Key | Example | Notes |
        | - | - | - |
        | `message_type` | `Transactional` | `Promotional` or `Transactional` |
        | `template_id` | `payment_success_onex` | The OneXtel template to send. Omit to send the composer output instead |
        | `sender_id` | `Acme_1` | **Optional** — only when your account has more than one sender profile. Names the profile to send from; omit it to use the provider's **RCS Sender ID**. **Required**, not optional, when the provider's RCS Sender ID is a `<brand>_onextel_rcs` placeholder. The `template_id` template must belong to this profile |
        | `custom_param1` | `@Profile - Name \| default: "Customer"` | One pair per template variable. The **key** is the placeholder name from the OneXtel template, without the square brackets. The **value** is a CleverTap personalization token |
        | any other key | — | Passed through to OneXtel as a template placeholder value |

        <Frame caption="Campaign composer — RCS body key-value pairs">
          <img src="https://mintcdn.com/onextel-09023014/nBmRXMjXsjq-UyTs/images/plugins/clevertap-campaign-rcs-kv.png?fit=max&auto=format&n=nBmRXMjXsjq-UyTs&q=85&s=2148f8780b7869f8e15e284652079997" alt="CleverTap campaign composer showing the RCS Body Key-Value Pairs section with message_type, template_id and a custom parameter" width="1115" height="796" data-path="images/plugins/clevertap-campaign-rcs-kv.png" />
        </Frame>

        **To personalize a template variable**, add a key-value pair for it here, in the campaign's
        **What** section — not in the provider setup. Type `@` in the value field to open
        CleverTap's personalization menu, choose the user or event property, and set a default for
        recipients who do not have it. CleverTap resolves the token for each recipient at send time
        and the connector passes the resolved value to OneXtel under the same key.

        If the OneXtel template reads `Hi [custom_param1]`, the key is `custom_param1`. A key that
        does not match the bracketed name character for character leaves the placeholder unfilled
        on the handset.

        <Frame caption="Campaign composer — a personalized key-value pair for the template placeholder">
          <img src="https://mintcdn.com/onextel-09023014/HHfvjozrSNVuntC-/images/plugins/clevertap-campaign-personalization.png?fit=max&auto=format&n=HHfvjozrSNVuntC-&q=85&s=7395fec8e7a1179b0c97b7a5c9fc7d7e" alt="CleverTap RCS Body Key-Value Pairs with sender_id, message_type, template_id, and a custom_param0 key whose value is the @Profile - Name token with a default" width="2828" height="1696" data-path="images/plugins/clevertap-campaign-personalization.png" />
        </Frame>

        <Note>
          For the token syntax and defaults, see CleverTap's
          [RCS Message Editor](https://docs.clevertap.com/docs/rcs-message-editor) and
          [Personalize Message](https://docs.clevertap.com/docs/personalize-message-sms).
        </Note>
      </Step>

      <Step title="Add the fallback SMS block">
        Toggle on **Fallback SMS**, enter the fallback text, and add:

        | Key | Example | Notes |
        | - | - | - |
        | `fallback_id` | `4f2005fa-…` | The fallback configuration ID from your OneXtel account |
        | `templateId` | Your DLT template ID | Required for Indian sends |
        | `entityId` | Your DLT entity ID | Required for Indian sends |
        | `type` | `SI` | Must match the DLT template's registered category |
        | `unicode` | `0` | `1` if the body contains non-ASCII characters |

        <Frame caption="Campaign composer — Fallback SMS block and its key-value pairs">
          <img src="https://mintcdn.com/onextel-09023014/nBmRXMjXsjq-UyTs/images/plugins/clevertap-campaign-sms-kv.png?fit=max&auto=format&n=nBmRXMjXsjq-UyTs&q=85&s=31864c9a2a509d6a1c21a6f34dc6a42b" alt="CleverTap Fallback SMS block with its text and the type, templateId, unicode, entityId and fallback_id key-value pairs" width="1135" height="748" data-path="images/plugins/clevertap-campaign-sms-kv.png" />
        </Frame>
      </Step>

      <Step title="Save the campaign as a draft">
        Save the campaign, but **do not publish it yet**. Set up the callbacks in Part D first, so
        the delivery reports, replies, and clicks from the very first send reach CleverTap.
      </Step>
    </Steps>

    <Warning>
      **A fallback only fires if the SMS block is complete.** If `fallback_id`, `templateId`, or
      `entityId` is missing or misnamed, the RCS send still goes out normally — but the fallback
      silently lacks what OneXtel needs, and that failure is **not surfaced back to CleverTap as an
      error**. Verify the fallback explicitly rather than assuming it works.
    </Warning>

    <Warning>
      `type` values are narrower than earlier guides stated. Live testing accepts only `SI`, `OTP`,
      and `SE` — `TXN`, `TRANS`, and `Promo` are rejected as `invalid type`. See
      [Send SMS — India](/api-reference/sms/send-sms-omni).
    </Warning>

    ### Part D — Configure the callbacks before you send

    Before you publish, create **four** callbacks in OneXtel. They carry delivery reports, replies,
    clicks, and fallback reports back to CleverTap. Each one needs a custom header named `callback`,
    set to one of the two CleverTap URLs you copied at the end of Part A.

    | Webhook | Channel | Type | Callback URL | `callback` header |
    | - | - | - | - | - |
    | RCS DLR | RCS | Delivery Notification | `https://ct.onex-aura.com/dlr` | Delivery Report URL |
    | Inbound | RCS | Incoming | `https://ct.onex-aura.com/inbound` | **Inbound Message URL** |
    | URL Click | RCS | URL Click | `https://ct.onex-aura.com/click` | Delivery Report URL |
    | SMS fallback DLR | SMS | Delivery Notification | `https://ct.onex-aura.com/delivery` | Delivery Report URL |

    All four use **HTTP Method `POST`**.

    <Warning>
      **These are two different URLs, and swapping them is the most common setup error.** Pasting the
      Delivery Report URL where the Inbound URL belongs causes CleverTap to reject the relay with
      `providerId query parameter is required for replied events`.
    </Warning>

    <Note>
      Two things that catch people out:

      * RCS delivery reports and suggestion-button replies **share the `/dlr` webhook** — OneXtel
        sends both there.
      * The SMS fallback report is a **genuinely separate webhook on the SMS channel**. Do not reuse
        the RCS DLR entry for it.
    </Note>

    See [Callback configuration](/guides/platform/callback-configuration) for how to add a callback
    and its headers.

    <Frame caption="RCS delivery notification webhook — Channel RCS, Type Delivery Notification, POST">
      <img src="https://mintcdn.com/onextel-09023014/nBmRXMjXsjq-UyTs/images/plugins/clevertap-webhook-rcs-dlr.png?fit=max&auto=format&n=nBmRXMjXsjq-UyTs&q=85&s=27c8ecb4aca15981fef252411ef947d8" alt="OneXtel Edit Callback screen with Channel RCS, Callback Format RCS, Type Delivery Notification and HTTP method POST" width="876" height="813" data-path="images/plugins/clevertap-webhook-rcs-dlr.png" />
    </Frame>

    <Frame caption="Additional Configuration — the callback header carries the CleverTap URL">
      <img src="https://mintcdn.com/onextel-09023014/nBmRXMjXsjq-UyTs/images/plugins/clevertap-webhook-callback-header.png?fit=max&auto=format&n=nBmRXMjXsjq-UyTs&q=85&s=d8fce18ed73f6fe75d471edc43b59d9b" alt="OneXtel Additional Configuration section with a header named callback set to a CleverTap cb.wzrkt.com URL" width="879" height="459" data-path="images/plugins/clevertap-webhook-callback-header.png" />
    </Frame>

    <Frame caption="Inbound webhook — Type Incoming">
      <img src="https://mintcdn.com/onextel-09023014/nBmRXMjXsjq-UyTs/images/plugins/clevertap-webhook-inbound.png?fit=max&auto=format&n=nBmRXMjXsjq-UyTs&q=85&s=0edef9693dac6c4785aa2a6ddcaf08e3" alt="OneXtel Edit Callback screen with Type Incoming and the inbound request preview" width="858" height="685" data-path="images/plugins/clevertap-webhook-inbound.png" />
    </Frame>

    <Frame caption="URL click webhook — Type URL Click">
      <img src="https://mintcdn.com/onextel-09023014/nBmRXMjXsjq-UyTs/images/plugins/clevertap-webhook-urlclick.png?fit=max&auto=format&n=nBmRXMjXsjq-UyTs&q=85&s=f97e9bfa0e3c0f960cb28eae4fa2576c" alt="OneXtel Edit Callback screen with Type URL Click and the click event request preview" width="898" height="712" data-path="images/plugins/clevertap-webhook-urlclick.png" />
    </Frame>

    <Frame caption="SMS fallback webhook — note the channel is SMS, not RCS">
      <img src="https://mintcdn.com/onextel-09023014/nBmRXMjXsjq-UyTs/images/plugins/clevertap-webhook-sms-fallback.png?fit=max&auto=format&n=nBmRXMjXsjq-UyTs&q=85&s=0ed169abe4f8a4902ed52bc0ab44d3b6" alt="OneXtel Edit Callback screen with Channel SMS and the SMS delivery report default parameters" width="906" height="760" data-path="images/plugins/clevertap-webhook-sms-fallback.png" />
    </Frame>

    ### Part E — Send and validate

    Send to a small test audience first, and confirm each of these independently before sending to
    everyone:

    <Steps>
      <Step title="Publish to a test audience">
        Open the draft, choose the send time, review the summary, and publish it to test devices you
        control — including one number that is not RCS-capable, for the fallback check.
      </Step>

      <Step title="Confirm RCS delivery">
        A test send shows as Delivered in OneXtel reporting, and the same event appears in
        CleverTap's campaign stats.
      </Step>

      <Step title="Confirm inbound replies">
        A reply from a test device appears in CleverTap under **People**, in that profile's event
        timeline.
      </Step>

      <Step title="Confirm click tracking">
        A button or URL click on a template message reaches CleverTap.
      </Step>

      <Step title="Confirm SMS fallback">
        An RCS send to a genuinely non-RCS-capable number triggers the fallback, the SMS arrives,
        and its delivery status comes back through the `/delivery` webhook.
      </Step>

      <Step title="Go live">
        Once all four check out, send the campaign to your full audience.
      </Step>
    </Steps>

    ### Personalize a template

    Personalization happens in CleverTap, before the send reaches OneXtel, and it travels entirely in
    the campaign's RCS key-value pairs. The connector does not substitute anything itself: it forwards
    each campaign key-value pair to OneXtel as a template variable under the same key name, and
    OneXtel fills the matching `[placeholder]` in the approved template. The step-by-step is in
    [Part C](#part-c--build-the-campaign-and-personalize-it); this section is the reference.

    | Key | Value | Example |
    | - | - | - |
    | `template_id` | The OneXtel template code | `ct_var2` |
    | `message_type` | `Promotional` or `Transactional` | `Promotional` |
    | `sender_id` — optional | The OneXtel sender profile, only when the account has more than one | `Acme_1` |
    | The placeholder name, without brackets | A CleverTap `@` personalization token, with a default | `custom_param0` set to `@Profile - Name \| default: "Customer"` |

    <Warning>
      **CleverTap's recommended method — positional `{{1}}` placeholders — does not personalize
      OneXtel templates.** Their values are not passed to OneXtel. Use key-value pairs named after the
      OneXtel placeholders instead. Creating a matching template in CleverTap is optional — see
      [Part B](#part-b--add-templates-in-clevertap-optional).
    </Warning>

    When you create OneXtel templates for CleverTap, name the variables `[custom_param1]`,
    `[custom_param2]` and so on. Any name is accepted, but one convention keeps campaigns
    predictable. To check an existing template's variable names, open it in the OneXtel portal or
    use [Fetch templates](/api-reference/rcs/templates#fetch-template).

    What the connector sends to OneXtel for a `custom_param1` pair resolved to `Kabir Sethi`:

    ```json theme={null}
    {
      "templateMessage": {
        "templateCode": "ct_var1",
        "customParams": "{\"custom_param1\":\"Kabir Sethi\"}"
      }
    }
    ```

    <Warning>
      **Provider-level parameters are not personalized per user.** A key added under
      **RCS Body Parameters** in the provider setup (Part A) takes one value per campaign. Per-user
      values must come from a key-value pair added on the campaign itself, in the **What** section.
    </Warning>

    For CleverTap's own guidance on personalization tokens, defaults, and Liquid expressions, see
    [RCS Message Editor](https://docs.clevertap.com/docs/rcs-message-editor),
    [Personalize Message](https://docs.clevertap.com/docs/personalize-message-sms), and
    [Liquid Tags](https://docs.clevertap.com/docs/liquid-tags) in the CleverTap documentation.

    ### Buttons and templates

    CleverTap's composer cannot reference a saved OneXtel template by ID directly. To send one, use
    the `template_id` custom parameter — every other custom param on that campaign is then passed
    through as a placeholder value.

    <Note>
      This is currently the only reliable way to get a working URL-action or dial-action button.
      Ad-hoc, non-template cards reliably support only a plain Reply button.
    </Note>
  </Tab>

  <Tab title="SMS">
    Standalone SMS uses its own CleverTap provider — a **Generic SMS Provider** — separate from the
    RCS provider and from the fallback SMS block inside it. A project can run both.

    | Part | What you do | Where |
    | - | - | - |
    | [A](#part-a--create-the-generic-sms-provider) | Create the SMS provider and its request body | CleverTap |
    | [B](#part-b--configure-the-sms-callbacks) | Configure the delivery callback | OneXtel |
    | [C](#part-c--build-the-sms-campaign) | Build the campaign | CleverTap |
    | [D](#part-d--send-a-test-sms-and-go-live) | Send to a test audience, then go live | Both |

    ### Part A — Create the Generic SMS provider

    <Steps>
      <Step title="Create the provider">
        In CleverTap, go to **Settings → Channels → SMS**, add a provider, and set **Provider** to
        **Generic SMS Provider**. Give it a clear nickname — it is what you pick in the campaign
        composer.
      </Step>

      <Step title="Set the messaging endpoint">
        | Field | Value |
        | - | - |
        | Request Type | `POST`, with a **JSON** body |
        | HTTPS Endpoint | `https://ct.onex-aura.com/sms/send` |
        | Authentication | No Authentication |
        | Headers | Key `apikey` → your OneXtel API key |

        As with RCS, the API key travels as a header rather than an auth scheme CleverTap manages.
      </Step>

      <Step title="Set the request body">
        Paste this into the provider's parameters JSON, then replace the last three values with your
        own:

        ```json theme={null}
        {
          "to": "$$To",
          "body": "$$Body",
          "templateId": "$$TemplateID",
          "msgId": "$$MessageID",
          "campaignId": "$$CampaignID",
          "senderId": "YOUR_SENDER_ID",
          "entityId": "YOUR_DLT_ENTITY_ID",
          "type": "SI"
        }
        ```

        The `$$` values are CleverTap's own macros and stay exactly as written — CleverTap fills them
        for each recipient at send time.

        | Key | Value | Notes |
        | - | - | - |
        | `to` | `$$To` | Recipient number |
        | `body` | `$$Body` | Message text. Must match the DLT template word for word |
        | `templateId` | `$$TemplateID` | The DLT template ID, set per campaign |
        | `msgId` | `$$MessageID` | **Required.** CleverTap matches each delivery report to its message by this value |
        | `campaignId` | `$$CampaignID` | Passed to OneXtel as the campaign name, for reporting |
        | `senderId` | Your DLT sender ID | For example `ONEXTL` |
        | `entityId` | Your DLT entity ID | The principal entity ID the templates are registered under |
        | `type` | `SI`, `OTP` or `SE` | The DLT category the template is registered under. Case-sensitive; defaults to `SI` if left out |
        | `unicode` | `1` | **Optional.** Add it for bodies with non-ASCII characters. Any value other than `0` or `1` is ignored |
        | `urlTracking` | `1` | **Optional.** Turns link shortening ON. Leave it out and your links are sent untouched — see below |

        <Warning>
          **Key names are exact.** A misspelled key — `templateID` instead of `templateId`, say — is
          dropped without an error, and the SMS goes out without it. Keep the quotes around every value
          too: a long ID sent as a bare number loses digits before it arrives.
        </Warning>

        To choose a value per campaign instead of fixing it here, make it a CleverTap custom
        replacement — for example `"senderId": "$$senderId"`. CleverTap then asks for it as a
        required field on every campaign that uses this provider.

        <Note>
          **Link shortening is off by default.** Your links are sent exactly as written unless you ask
          for shortening. Add `"urlTracking": "1"` to the parameters JSON to turn it on: every link in
          the message body is then rewritten to a OneXtel short link, and the taps are counted in
          OneXtel's Clicker Data and Clicker Details reports.

          **Those taps stay in OneXtel.** SMS clicks are not sent back to CleverTap — the `/click`
          webhook above carries RCS URL clicks only, so turning this on will not populate click metrics
          on your CleverTap SMS campaign. If you want SMS clicks in CleverTap, use CleverTap's own link
          tracking instead, and leave `urlTracking` off so the link is not rewritten a second time.

          Shortening is opt-in because the rewrite has consequences under DLT — once it is on, the
          OneXtel short domain has to be whitelisted on the DLT template in place of your own link's
          domain, so switching it on without updating the template registration gets the message
          rejected at scrubbing.

          Values `1`, `true`, `yes` and `on` turn it on; anything else, including a missing or
          misspelled value, leaves your links untouched.
        </Note>
      </Step>

      <Step title="Save, then copy the callback URL">
        Save the provider, then **reopen it** and copy the **Delivery Report Callback URL** under
        **Callback Config**. You paste it into OneXtel in
        [Part B](#part-b--configure-the-sms-callbacks).
      </Step>
    </Steps>

    ### Part B — Configure the SMS callbacks

    In OneXtel, go to **Configuration → Add New Callback** and add the SMS delivery callback against
    the **same API key** you put on the provider:

    | Field | Value |
    | - | - |
    | Channel | `SMS` |
    | Type | `Delivery Notification` |
    | HTTP Method | `POST` |
    | Callback URL | `https://ct.onex-aura.com/delivery` |
    | Header | Key `callback`, value = the Delivery Report Callback URL from Part A |
    | Callback Format | Default |

    <Warning>
      **The `callback` header is required.** It tells the connector which CleverTap account the report
      belongs to. A report that arrives without it is rejected with code `2004` and never reaches
      CleverTap. Never save a callback with an empty header row either — OneXtel then sends a header
      with no name, which the connector's web server refuses.
    </Warning>

    If you also run RCS with SMS fallback on the same API key, this is the same callback as the RCS
    tab's **SMS fallback DLR** — one SMS delivery callback serves both.

    ### Part C — Build the SMS campaign

    <Steps>
      <Step title="Create the campaign">
        In CleverTap, create an SMS campaign. Under **From**, select the Generic SMS provider from
        Part A, and choose your audience under **Who**.
      </Step>

      <Step title="Write the message and set the DLT template ID">
        Under **What**, enter the message exactly as registered on DLT, with personalization where
        the template has variables, and set the DLT template ID CleverTap passes as `$$TemplateID`.
        Fill any custom replacements you added to the provider body.
      </Step>

      <Step title="Save the campaign as a draft">
        Save it, but do not publish until the Part B callback is in place — otherwise the delivery
        reports from the first send never reach CleverTap.
      </Step>
    </Steps>

    ### Part D — Send a test SMS and go live

    <Steps>
      <Step title="Publish to a test audience">
        Send to test devices you control.
      </Step>

      <Step title="Confirm the send was accepted">
        A send OneXtel refuses comes back in the provider's reply with code `900` and OneXtel's own
        reason, rather than as a delivery report — see [Error code mapping](#error-code-mapping).
      </Step>

      <Step title="Confirm delivery">
        The SMS arrives, shows as Delivered in OneXtel reporting, and the same event appears in
        CleverTap's campaign stats.
      </Step>

      <Step title="Go live">
        Once both check out, send the campaign to your full audience.
      </Step>
    </Steps>

    <Note>
      CleverTap's **Preview & Test** sends all share one placeholder message ID, so their delivery
      reports cannot be matched one-to-one. Judge delivery tracking from a real test campaign.
    </Note>
  </Tab>
</Tabs>

## Error code mapping

The connector translates OneXtel's outcome codes into CleverTap's own vocabulary, so campaign
stats in CleverTap show a CleverTap reason. OneXtel's original description travels with each
failure in the `description` field.

<Tabs>
  <Tab title="RCS">
    **Delivery events**

    | OneXtel RCS event | CleverTap event |
    | - | - |
    | `MESSAGE_DELIVERED` | `delivered` |
    | `MESSAGE_READ` | `viewed` |
    | `SEND_MESSAGE_FAILURE` | `failed`, with a code from the table below |
    | Suggestion reply | `replied` |
    | Suggestion action or URL click | `clicked` |
    | `SEND_MESSAGE_SUCCESS` | Not forwarded — CleverTap waits for delivered or failed |

    **Failure codes**

    RCS failure codes differ by operator — Jio and Vi reuse the same numbers for different
    conditions — so the connector classifies a failure by the operator's wording rather than its
    number.

    | The failure says | CleverTap code |
    | - | - |
    | RCS disabled, not RCS enabled, invalid phone or number, user not found, or Vi `404-A` / `400-H` | `910` Invalid subscriber |
    | Anything else — for example template errors, opt-outs or throttling | `914` Undelivered |

    For what each operator code means, see [RCS error codes](/api-reference/rcs/error-codes).

    **Connector response codes**

    When the connector refuses a request itself, it answers with one of these:

    | Code | Meaning |
    | - | - |
    | `2000` | Missing `apikey` header on a send, or OneXtel rejected the API key |
    | `2001` | Invalid send — a missing or wrong `message_type`, a missing `fallback_id` or fallback sender, or OneXtel answered HTTP 400 |
    | `2004` | A OneXtel callback arrived without its `callback` header — the report is not relayed |
    | `2014` | OneXtel did not confirm the message, or another upstream failure |
  </Tab>

  <Tab title="SMS">
    **Send responses**

    Every send gets the Generic SMS reply CleverTap expects: `status` of `success`, `partial` or
    `fail`. A rejected message is listed under `unprocessed` with code `900` and OneXtel's own reason
    in `error` — for example an invalid `type`, a DLT mismatch caught at submission, or a rejected
    number. A missing `apikey` header is the one exception: it is refused with HTTP 400, code `2000`.

    **Delivery reports**

    A report is `delivered` only when OneXtel's code is `000`. Every other code is reported as
    `failed`, with the CleverTap code below. The India codes appear in both their three-digit and
    six-digit forms — see [India SMS error codes](/api-reference/sms/error-codes).

    | CleverTap code | CleverTap meaning | OneXtel codes |
    | - | - | - |
    | `901` | DND failure | `218`, `978`, `900107` |
    | `902` | Spam detected | `224`, `973`, `900102` |
    | `903` | Blacklist rejected | `974`, `976`, `900103`, `900105`, `900129` |
    | `904` | System error — a problem on the sending account or platform, not the recipient | `036`, `970`, `971`, `975`, `977`, `982`–`984`, `986`–`993`, `900088`, `900100`, `900104`, `900106`, `900111`–`900113`, `900115`, `900116`, `900118`–`900123`, `900210` |
    | `905` | Subscriber error | `011`, `013`, `015`, `019`, `021` |
    | `910` | Invalid subscriber | `001`, `009`, `033`, `972`, `900101` |
    | `912` | Inbox full | `022` |
    | `914` | Undelivered | `027`, `029`, `030`, `031`, `208` |
    | `915` | Dropped | `044` |
    | `916` | Expired | `313`, `985`, `994`, `900114`, `900124` |
    | `917` | Force expired — dropped by a sending-hours policy | `995`, `900125` |
    | `918` | Duplicate drop | `900130` |
    | `919` | DLT failure | `201`, `203`–`207`, `209`–`211`, `213`–`216`, `220`, `222`, `223`, `225`–`227`, `979`–`981`, `900108`–`900110`, `900126`–`900128` |

    Any code not in the table falls back to the report's status: `UNDELIV` or `UNDELIVRD` becomes
    `914`, `EXPIRED` becomes `916`, and anything else becomes CleverTap's generic `900`. Within the
    DLT band this now applies only to `202`, `212`, `217`, `219` and `221`, which OneXtel's error-code
    sheet does not define — they are left to the status fallback rather than reported as a DLT
    failure on the strength of their position in the numbering.

    <Note>
      Two codes are mapped on how they arrive in practice rather than on their table meaning. `208`
      arrives on live reports described as *Absent subscriber*, so it maps to `914`; `313` always
      arrives with the status `EXPIRED`, so it maps to `916`.
    </Note>

    The same mapping applies to the SMS leg of an RCS fallback — both report through `/delivery`.
  </Tab>
</Tabs>

## Parameter reference

<Tabs>
  <Tab title="RCS">
    **RCS key-value pairs**

    | Key | Required | Notes |
    | - | - | - |
    | `message_type` | Yes | `Promotional` or `Transactional`. OTP is not a valid RCS message type |
    | `template_id` / `templateid` | No | Selects a pre-made template; both spellings accepted |
    | `sender_id` | No | Only for accounts with more than one sender profile. Omit it to use the provider's RCS Sender ID. Required when that field holds a `<brand>_onextel_rcs` placeholder |
    | any other key | No | Passed through as a template placeholder. Key must equal the `[placeholder]` name in the OneXtel template; value may be a personalization token — see [Personalize a template](#personalize-a-template) |

    **SMS fallback key-value pairs**

    | Key | Required | Notes |
    | - | - | - |
    | `fallback_id` | Yes | Fallback configuration ID in OneXtel |
    | `templateId` | For DLT sends | DLT-approved SMS template ID |
    | `entityId` | For DLT sends | Your DLT entity ID |
    | `type` | No | Must match the DLT template's category |
    | `unicode` | No | `1` for non-ASCII bodies |
  </Tab>

  <Tab title="SMS">
    **Generic SMS provider body**

    | Key | Required | Notes |
    | - | - | - |
    | `to` | Yes | `$$To` |
    | `body` | Yes | `$$Body` |
    | `msgId` | Yes | `$$MessageID`. Without it, delivery reports cannot be matched |
    | `senderId` | Yes | Your DLT sender ID |
    | `templateId` | For DLT sends | `$$TemplateID` — the DLT template ID |
    | `entityId` | For DLT sends | Your DLT entity ID |
    | `campaignId` | No | `$$CampaignID`, used as the OneXtel campaign name |
    | `type` | No | `SI`, `OTP` or `SE`, case-sensitive. Defaults to `SI` |
    | `unicode` | No | `1` for non-ASCII bodies, `0` otherwise |
  </Tab>
</Tabs>

<Note>
  Behind the scenes the connector calls OneXtel's send API — `/oapi/send_sms` for RCS and
  `/send_sms` for SMS, both on `https://api.onexaura.com`. You never configure these directly;
  they are here for troubleshooting.
</Note>

## Limitations

<Tabs>
  <Tab title="RCS">
    * **Template previews will not match the real message.** CleverTap renders through its own
      composer, so what you see when building is not what the recipient receives. Confirm with a
      test send.
    * **Fallback failures are silent.** An incomplete SMS block does not raise an error in
      CleverTap.
    * **Composer templates cannot use saved OneXtel templates directly** — use `template_id`.
    * **CleverTap's `{{1}}` placeholder values are not passed to OneXtel.** Personalize through a
      campaign key-value pair named after the OneXtel placeholder instead — see
      [Personalize a template](#personalize-a-template).
    * **RCS failure codes are coarse.** Every failure reaches CleverTap as `910` or `914`; the
      operator's own code is in OneXtel reporting.
  </Tab>

  <Tab title="SMS">
    * **Inbound SMS is not supported.** Replies to an SMS are not relayed to CleverTap.
    * **India only.** Numbers are sent to OneXtel's India platform with the `+91` prefix; a leading
      `91` on a longer number is treated as the country code.
    * **Rejections at submission all carry code `900`.** The specific reason is in the `error` text,
      not the code.
    * **`unicode` is not detected for you.** Set it on the provider body when your templates use
      non-ASCII characters.
  </Tab>
</Tabs>

## Get support

If a campaign does not behave as this page describes, email
[omni.tech@onextel.com](mailto:omni.tech@onextel.com) with the plugin name (CleverTap), the
provider nickname, and what you saw. To let OneXtel see exactly what CleverTap sent and what
OneXtel answered:

<Steps>
  <Step title="Ask for the logging endpoint">
    Support will give you a logging version of the connector's send URL for the affected
    channel.
  </Step>

  <Step title="Point the provider at it">
    In CleverTap, open the provider under **Settings → Channels → SMS** and replace the
    **HTTPS Endpoint** with the logging URL. Keep the `apikey` header and everything else as
    it is.
  </Step>

  <Step title="Run the campaign again">
    Send the campaign to a small test audience.
  </Step>

  <Step title="Share the campaign ID">
    Reply to support with the CleverTap campaign ID, shown under the campaign name in the
    campaigns list. OneXtel matches it against the logged requests and responses and comes
    back with the exact cause.
  </Step>
</Steps>

Switch the endpoint back to the normal connector URL — `https://ct.onex-aura.com/rcs/send` or
`https://ct.onex-aura.com/sms/send` — once the issue is closed.

## Related

* [RCS API overview](/api-reference/rcs/overview)
* [RCS template guidelines](/guides/rcs-platform/template-guidelines)
* [Configure fallback](/guides/omnichannel/configure-fallback)
* [India SMS error codes](/api-reference/sms/error-codes)
* [DLT registration](/guides/sms/dlt)
* [All plugins](/plugins/overview)


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