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 URL https://hub.telinfy.com/unified/developer/api/v1
Auth header x-api-key: YOUR_API_KEY
Content-Type application/json
Webhooks Telinfy POSTs events to your webhook_base_url. Your endpoint must reply 200 OK to acknowledge receipt.
Quick test Copy
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 Copy
{
"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 Copy
{
"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 Copy
{
"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.
Text Body params Header image Header video Header document Authentication (OTP) Carousel
Request body Copy
{
"phoneNumber" : "917093651278" ,
"template" : { "name" : "hello_world" , "language" : { "code" : "en" } }
} Request body Copy
{
"phoneNumber" : "917093651278" ,
"template" : {
"name" : "order_confirmation" ,
"language" : { "code" : "en" },
"components" : [
{
"type" : "body" ,
"parameters" : [
{ "type" : "text" , "text" : "John" },
{ "type" : "text" , "text" : "ORD-12345" }
]
}
]
}
} Request body Copy
{
"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 Copy
{
"phoneNumber" : "917093651278" ,
"template" : {
"name" : "video_template" ,
"language" : { "code" : "en" },
"components" : [
{
"type" : "header" ,
"parameters" : [
{ "type" : "video" , "video" : { "link" : "https://example.com/promo.mp4" } }
]
}
]
}
} Request body Copy
{
"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 Copy
{
"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 Copy
{
"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 Copy
{
"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 Copy
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 Copy
{
"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 Copy
{
"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 Copy
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 Copy
{
"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 Copy
{
"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.
Text Image / media Button reply Location
Payload Copy
{
"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 Copy
"messages" : [{
"from" : "91XXXXXXXXXX" ,
"id" : "<MESSAGE_ID>" ,
"timestamp" : "<TIMESTAMP>" ,
"type" : "image" ,
"image" : {
"caption" : "<OPTIONAL_CAPTION>" ,
"mime_type" : "image/jpeg" ,
"sha256" : "<HASH>" ,
"id" : "<MEDIA_ID>"
}
}] Payload Copy
"messages" : [{
"from" : "91XXXXXXXXXX" ,
"id" : "<MESSAGE_ID>" ,
"timestamp" : "<TIMESTAMP>" ,
"type" : "interactive" ,
"interactive" : {
"type" : "button_reply" ,
"button_reply" : { "id" : "<BUTTON_ID>" , "title" : "<BUTTON_TITLE>" }
}
}] Payload Copy
"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.
sent / delivered / read failed
Payload Copy
{
"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 Copy
"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 Copy
{
"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 Copy
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 Copy
{ "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 Copy
{ "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 Copy
{
"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.
Button click User messaged
/webhook/user-action Copy
{
"senderPhoneNumber" : "918XXXXXXXX" ,
"user_action_clicked" : "Click Now" ,
"messageId" : "" ,
"recordID" : 2345678 ,
"send_timestamp" : "2025-09-16T13:17:32.277068Z" ,
"status" : "200"
} /webhook/user-message Copy
{
"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 Copy
{
"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 Copy
{
"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.
Bulk (array) Single
Request body Copy
{
"Sender_Name" : "ABCDEF" ,
"SMS_Message" : "Your OTP is 1234. Thank you." ,
"mobile_Number" : [ "9876543210" , "8765432109" ],
"template_id" : "1234567890123456789" ,
"campaign_name" : "Bulk_OTP"
} Request body Copy
{
"Sender_Name" : "ABCDEF" ,
"SMS_Message" : "Your OTP is 1234. Thank you." ,
"mobile_Number" : "9876543210" ,
"template_id" : "1234567890123456789"
} Response Copy
{
"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 Copy
{
"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.