Everything You Need
To Grow With Telinfy

Guides, legal documents, API references, and industry insights — all in one place.

Getting started

Every request goes to the unified base URL and is authenticated with an x-api-key header. Request and response bodies are JSON unless noted. Success responses carry success: true (or status: "success"); failures include an error code and message.

Base URLhttps://hub.telinfy.com/unified/developer/api/v1
Auth headerx-api-key: YOUR_API_KEY
Content-Typeapplication/json
WebhooksTelinfy POSTs events to your webhook_base_url. Your endpoint must reply 200 OK to acknowledge receipt.
Quick test
curl "https://hub.telinfy.com/unified/developer/api/v1/whatsapp/templates" \
  -H "x-api-key: YOUR_API_KEY"

WhatsApp

Manage Meta-approved templates, send every message type (text, media headers, OTP, carousel), upload media, pull reports, and receive inbound + delivery webhooks.

GET /whatsapp/templates

List all templates

Returns every WhatsApp template from Meta with status, category, language and components.

Response
{
  "success": true,
  "data": {
    "total": 15,
    "templates": [
      {
        "id": "123456789",
        "name": "hello_world",
        "status": "APPROVED",
        "category": "MARKETING",
        "language": "en",
        "qualityScore": "GREEN"
      }
    ]
  }
}
GET /whatsapp/templates/approved

List approved templates

Only APPROVED templates — the ones you can send.

Response
{
  "success": true,
  "data": { "total": 10, "templates": [ /* ... */ ] }
}
GET /whatsapp/templates/:templateName

Get template by name

Look up a single template by its name. Pass the template name as the :templateName path parameter.

Response
{
  "success": true,
  "data": {
    "id": "123456789",
    "name": "hello_world",
    "status": "APPROVED",
    "category": "UTILITY",
    "language": "en",
    "qualityScore": "GREEN",
    "rejectedReason": null
  }
}
POST /whatsapp/campaigns/send

Send a template message

Send any approved WhatsApp template. Pick a message type below. For media headers, swap "link" for "id" to use a Media ID from the upload endpoint instead of a public URL.

Request body
{
  "phoneNumber": "917093651278",
  "template": { "name": "hello_world", "language": { "code": "en" } }
}
Request body
{
  "phoneNumber": "917093651278",
  "template": {
    "name": "order_confirmation",
    "language": { "code": "en" },
    "components": [
      {
        "type": "body",
        "parameters": [
          { "type": "text", "text": "John" },
          { "type": "text", "text": "ORD-12345" }
        ]
      }
    ]
  }
}
Request body
{
  "phoneNumber": "917093651278",
  "template": {
    "name": "promo_template",
    "language": { "code": "en" },
    "components": [
      {
        "type": "header",
        "parameters": [
          { "type": "image", "image": { "link": "https://example.com/promo.jpg" } }
        ]
      },
      { "type": "body", "parameters": [ { "type": "text", "text": "John" } ] }
    ]
  }
}
Request body
{
  "phoneNumber": "917093651278",
  "template": {
    "name": "video_template",
    "language": { "code": "en" },
    "components": [
      {
        "type": "header",
        "parameters": [
          { "type": "video", "video": { "link": "https://example.com/promo.mp4" } }
        ]
      }
    ]
  }
}
Request body
{
  "phoneNumber": "917093651278",
  "template": {
    "name": "document_template",
    "language": { "code": "en" },
    "components": [
      {
        "type": "header",
        "parameters": [
          {
            "type": "document",
            "document": { "link": "https://example.com/invoice.pdf", "filename": "invoice.pdf" }
          }
        ]
      }
    ]
  }
}
Request body
{
  "phoneNumber": "917093651278",
  "template": {
    "name": "your_auth_template",
    "language": { "code": "en" },
    "components": [
      { "type": "body", "parameters": [ { "type": "text", "text": "123456" } ] },
      {
        "type": "button",
        "sub_type": "url",
        "index": "0",
        "parameters": [ { "type": "text", "text": "123456" } ]
      }
    ]
  }
}
Request body
{
  "phoneNumber": "917093651278",
  "template": {
    "name": "carousel_template",
    "language": { "code": "en" },
    "components": [
      { "type": "body", "parameters": [ { "type": "text", "text": "John" } ] },
      {
        "type": "carousel",
        "cards": [
          {
            "card_index": 0,
            "components": [
              {
                "type": "header",
                "parameters": [
                  { "type": "image", "image": { "link": "https://example.com/product1.jpg" } }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
}
Response
{
  "success": true,
  "message": "Message sent successfully",
  "data": {
    "jobId": 12345,
    "phoneNumber": "+917093651278",
    "templateName": "hello_world",
    "remainingCredits": 150.50,
    "queueStatus": "queued"
  }
}
POST /whatsapp/media/upload

Upload media

Upload an image, video, audio or document to Meta and get a mediaId to reuse in template headers. Sent as multipart/form-data.

cURL
curl -X POST "https://hub.telinfy.com/unified/developer/api/v1/whatsapp/media/upload" \
  -H "x-api-key: YOUR_API_KEY" \
  -F "file=@/path/to/image.jpg"
Response
{
  "success": true,
  "data": {
    "mediaId": "1385825826223524",
    "mediaType": "image",
    "mimeType": "image/jpeg",
    "filename": "image.jpg",
    "fileSize": 102400
  }
}
GET /whatsapp/media/supported-types

Supported media types

Allowed media types with size limits and file extensions.

Response
{
  "success": true,
  "data": {
    "image": { "maxSizeMB": 5, "allowedExtensions": ["jpg", "jpeg", "png"] },
    "video": { "maxSizeMB": 16, "allowedExtensions": ["mp4", "3gp"] },
    "audio": { "maxSizeMB": 16, "allowedExtensions": ["aac", "m4a", "mp3", "amr", "ogg"] },
    "document": { "maxSizeMB": 100, "allowedExtensions": ["pdf", "docx", "xlsx", "pptx"] }
  }
}
POST /whatsapp/reports/request-download

Request a report download

Generate a downloadable campaign report for a date range. Poll the file endpoint with the returned fileID.

cURL
curl -X POST "https://hub.telinfy.com/unified/developer/api/v1/whatsapp/reports/request-download" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "fromDate": "2025-01-01", "toDate": "2025-01-21" }'
Response
{
  "success": true,
  "message": "Download request created successfully",
  "fileID": 12345
}
GET /whatsapp/reports/file/:fileId

Download a report file

Fetch the report by fileID. While the report is generating it returns a "processing" status; once ready it returns the file.

Response
{
  "success": false,
  "message": "Report is still being processed. Please try again later.",
  "status": "processing"
}
GET /whatsapp/reports/campaigns

Get campaign reports

Delivery and engagement reports for your WhatsApp campaigns.

WEBHOOK POST {your_webhook_url}/webhook/whatsapp

Webhook — incoming messages

Telinfy POSTs this Meta-format payload to your endpoint whenever a user messages your business number. The messages[].type field is one of: text, image, video, audio, document, location, contacts, interactive (button_reply / list_reply), reaction, sticker. Respond with HTTP 200 OK to acknowledge.

Payload
{
  "object": "whatsapp_business_account",
  "entry": [{
    "id": "2000824674107740",
    "changes": [{
      "field": "messages",
      "value": {
        "messaging_product": "whatsapp",
        "metadata": { "phone_number_id": "816020224932515", "display_phone_number": "914843503112" },
        "contacts": [{ "wa_id": "91XXXXXXXXXX", "profile": { "name": "Abhi" } }],
        "messages": [{
          "id": 69387,
          "from": "91XXXXXXXXXX",
          "type": "text",
          "text": { "body": "Hi" },
          "timestamp": "1771620995"
        }]
      }
    }]
  }]
}
Payload
"messages": [{
  "from": "91XXXXXXXXXX",
  "id": "<MESSAGE_ID>",
  "timestamp": "<TIMESTAMP>",
  "type": "image",
  "image": {
    "caption": "<OPTIONAL_CAPTION>",
    "mime_type": "image/jpeg",
    "sha256": "<HASH>",
    "id": "<MEDIA_ID>"
  }
}]
Payload
"messages": [{
  "from": "91XXXXXXXXXX",
  "id": "<MESSAGE_ID>",
  "timestamp": "<TIMESTAMP>",
  "type": "interactive",
  "interactive": {
    "type": "button_reply",
    "button_reply": { "id": "<BUTTON_ID>", "title": "<BUTTON_TITLE>" }
  }
}]
Payload
"messages": [{
  "from": "91XXXXXXXXXX",
  "id": "<MESSAGE_ID>",
  "timestamp": "<TIMESTAMP>",
  "type": "location",
  "location": {
    "latitude": 10.8505,
    "longitude": 76.2711,
    "name": "<LOCATION_NAME>",
    "address": "<ADDRESS>"
  }
}]
WEBHOOK POST {your_webhook_url}/webhook/whatsapp

Webhook — delivery status (DLR)

Outbound message lifecycle pushed to your endpoint: sent → delivered → read. A failed status carries a Meta error code and details.

Payload
{
  "object": "whatsapp_business_account",
  "entry": [{
    "id": "2000824674107740",
    "changes": [{
      "field": "messages",
      "value": {
        "messaging_product": "whatsapp",
        "metadata": { "phone_number_id": "816020224932515", "display_phone_number": "914843503112" },
        "statuses": [{
          "id": 1542416,
          "status": "delivered",
          "timestamp": "1771621461",
          "recipient_id": "91XXXXXXXXXX",
          "conversation": { "id": "ba185d99de70bdbec8fba702ae4..." }
        }]
      }
    }]
  }]
}
Payload
"statuses": [{
  "id": "<MESSAGE_ID>",
  "status": "failed",
  "timestamp": "<TIMESTAMP>",
  "recipient_id": "91XXXXXXXXXX",
  "errors": [{
    "code": 131047,
    "title": "Re-engagement message",
    "error_data": {
      "details": "Message failed to send because more than 24 hours have passed since the customer last replied."
    },
    "href": "https://developers.facebook.com/docs/whatsapp/cloud-api/support/error-codes/"
  }]
}]

RCS

Send rich and basic RCS messages with placeholder personalisation, check credit, look up records, and receive delivery + user-interaction webhooks.

GET /rcs/templates

List all templates

RCS templates grouped by type (rich / basic) and credit level (standard / dynamic).

Response
{
  "richStandard": [],
  "basicStandard": [],
  "richDynamic": [],
  "basicDynamic": []
}
POST /rcs/messages/:contactID

Send an RCS message

Send a template to a contact (the :contactID path param). lcustomParam fills [PLACEHOLDER] tokens. The optional messageId query param sets your own reference.

cURL
curl -X POST "https://hub.telinfy.com/unified/developer/api/v1/rcs/messages/919876543210?messageId=custom-msg-123" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "templateName": "welcome",
    "lcustomParam": { "NAME": "John Doe", "AMOUNT": "1000" }
  }'
Response
{ "message": "Sent Successfully", "jobId": 12345 }
GET /rcs/wallet

Get wallet balance

Your RCS credit balance and expiry.

GET /rcs/record/:recordID

Get a record by ID

Retrieve a specific RCS message record (the :recordID path param).

Response
{ "status": true, "data": { /* ... */ } }
WEBHOOK POST {your_webhook_url}/webhook/delivery

Webhook — delivery status

Delivery events pushed to your endpoint. eventDLR is one of MESSAGE_READ, MESSAGE_DELIVERED, MESSAGE_UNDELIVERED. Respond with HTTP 200 OK.

Payload
{
  "status": 200,
  "eventDLR": "MESSAGE_DELIVERED",
  "recordID": 2345678,
  "messageId": "",
  "campaignId": 0,
  "send_timestamp": "2025-09-16T13:17:32.277068Z",
  "senderPhoneNumber": "+918XXXXXX"
}
WEBHOOK POST {your_webhook_url}/webhook/user-action

Webhook — user interactions

Button clicks arrive at /webhook/user-action; free-text replies arrive at /webhook/user-message.

/webhook/user-action
{
  "senderPhoneNumber": "918XXXXXXXX",
  "user_action_clicked": "Click Now",
  "messageId": "",
  "recordID": 2345678,
  "send_timestamp": "2025-09-16T13:17:32.277068Z",
  "status": "200"
}
/webhook/user-message
{
  "senderPhoneNumber": "919XXXXXXXX",
  "user_Messaged": "STOP",
  "messageId": "",
  "recordID": "607626",
  "sendTime": "2025-09-16T13:16:57.211552Z",
  "status": "200"
}

SMS

Send single or bulk DLT-approved SMS, list templates, check your wallet, and pull delivery reports by date range.

GET /sms/templates

List all templates

Your DLT-approved SMS templates with full details.

Response
{
  "status": "success",
  "templates": [
    {
      "template_id": "1234567890123456789",
      "template_name": "OTP Template",
      "template_content": "Your OTP is {#var#}. Thank you.",
      "status": "approved"
    }
  ],
  "count": 1
}
GET /sms/template-ids

List template IDs

A lightweight response with just the approved template IDs.

Response
{
  "status": "success",
  "templates": ["1234567890123456789", "1234567890123456790"]
}
POST /sms/send

Send SMS

Pass mobile_Number as an array for bulk, or a string for a single send. Requires a DLT template_id and an approved Sender_Name.

Request body
{
  "Sender_Name": "ABCDEF",
  "SMS_Message": "Your OTP is 1234. Thank you.",
  "mobile_Number": ["9876543210", "8765432109"],
  "template_id": "1234567890123456789",
  "campaign_name": "Bulk_OTP"
}
Request body
{
  "Sender_Name": "ABCDEF",
  "SMS_Message": "Your OTP is 1234. Thank you.",
  "mobile_Number": "9876543210",
  "template_id": "1234567890123456789"
}
Response
{
  "status": "Success",
  "message": "Bulk SMS queued successfully",
  "total_numbers": 2,
  "processed": 2
}
GET /sms/wallet

Get wallet balance

Your SMS credit balance and expiry date.

Response
{
  "success": true,
  "wallet": 15000.50,
  "credit_expiry": "2026-12-31"
}
GET /sms/reports?startDate=2026-01-01&endDate=2026-01-27

Get delivery reports

SMS delivery reports for a date range, passed as startDate and endDate query parameters.

Need keys or a channel enabled? Talk to our team — we'll get you set up on WhatsApp, RCS and SMS.