RCS Delivery Receipt (DR) Callback Events

The RCS Delivery Receipt Callback Events provide real-time updates on the status of messages sent via the RCS messaging protocol. These events are essential for tracking the lifecycle of a message, from submission to reading by the recipient.

This section outlines the types of DR callback events, their significance, and the structure of the payloads returned by the API.

Callback Types

Each DR callback type includes a 'type' field that indicates which type of event the Delivery Receipt refers to. The following types are supported:

Type

Description

SENT

Message successfully submitted from Google to the carrier.

DELIVERED

Message successfully delivered to the recipient's handset.

READ

Message has been read on the recipient's handset.

COMPOSING

Recipient has started composing a reply.

TTL_EXPIRATION_REVOKED

Message expired due to TTL before delivery and was revoked.

ERROR

Message was undelivered due to an error.
Note: The "Callback Error Codes" along with the description, and reason, will be provided in the future update.

Field Descriptions

The following list contains the field description for delivery receipts:

FieldTypeDescription
typeStringStatus of the message (SENT, DELIVERED, READ, ERROR).
eventIdStringUnique identifier for the delivery event.
fromStringSender is the recipient's mobile number to which messages have been sent.
toStringTo represent the RCS Agent Service Code that was used to process the request to send an RCS MT message. It can be alphanumeric/numeric/long number/short number/special characters.
sentAtStringISO 8601 timestamp indicating when the event occurred.
messageIdStringUnique identifier for the message to which the event refers to.
carrierIdStringIdentifier of the carrier or network operator responsible for delivering the message.

Sample Payloads

Each DR event payload is a JSON object containing metadata about the message and its delivery status.

SENT callback:

{
  "code": "4000",
  "message": "Message successfully submitted to the carrier",
  "data": {
    "type": "SENT",
    "eventId": "81500376-6398-4301-8d51-de4720XXXXX9",
    "from": "19XXXXXXXXX",
    "to": "kio_rcs",
    "sentAt": "2026-04-16T17:08:23.992Z",
    "messageId": "db8ff102-fe16-4d79-a682-fXXXXXb3fe07",
    "carrierId": "VZ"
  },
  "error": {}
}
📘

Note:

The "to" parameter is the RCS Agent (that was used to send the RCS MT message) service code.

SENT Callback including optional Ref parameters

📘

Note:

If the initial RCS API request to send an MT message includes the optional Ref parameters, see Ref parameters in Send a Plain Text Message API for details. These parameters are also returned in the callback payload for reference.

{
  "code": "2000",
  "message": "Message successfully submitted to the carrier",
  "data": {
    "type": "SENT",
    "eventId": "b38bb617-b1b2-4d33-8746-XXXXXXXX264c",
    "from": "17XXXXXXXXX",
    "to": "kio_rcs",
    "sentAt": "2026-04-16T13:46:05.845Z",
    "messageId": "ce976c3b-8373-411c-9b02-8eXXXXXXXXfc",
    "ref": "test",
    "ref1": "test1",
    "ref2": "test2",
    "carrierId": "ATT"
  },
  "error": {}
}

DELIVERED Callback:

{
  "code": "4001",
  "message": "Message successfully delivered to the end user",
  "data": {
    "type": "DELIVERED",
    "eventId": "Mx0YTsHP3NSPXXXXXXXXWSRw",
    "from": "19XXXXXXXXX",
    "to": "kio_rcs",
    "sentAt": "2026-04-16T17:08:25.519Z",
    "messageId": "db8ff102-fe16-4d79-a682-fb38XXXXX307",
    "carrierId": "VZ"
  },
  "error": {}
}

DELIVERED callback with additional optional Ref parameters

📘

Note:

If the initial RCS API request to send an MT message includes the optional Ref parameters, see Ref parameters in Send a Plain Text Message API for details. These parameters are also returned in the callback payload for reference.

{
  "code": "2001",
  "message": "Message successfully delivered to the end user",
  "data": {
    "type": "DELIVERED",
    "eventId": "MxSJWCUA6NSXXXXXXXXpm3XQ",
    "from": "17XXXXXXXXX",
    "to": "kio_rcs",
    "sentAt": "2026-04-16T13:46:06.303Z",
    "messageId": "ce976c3b-8373-411c-9b02-8eXXXXXXXXfc",
    "ref": "test",
    "ref1": "test1",
    "ref2": "test2",
    "carrierId": "ATT"
  },
  "error": {}
}

READ Callback:

{
  "code": "4002",
  "message": "Message read confirmation received",
  "data": {
    "type": "READ",
    "eventId": "MxM8b9hRVtS=emYHXXXXXXXX",
    "from": "19XXXXXXXXX",
    "to": "kio_rcs",
    "sentAt": "2026-04-16T17:08:32.318Z",
    "messageId": "db8ff102-fe16-4d79-a682-fbXXXXXXXX37",
    "carrierId": "VZ"
  },
  "error": {}
}

READ Callback with additional optional Ref parameters

📘

Note:

If the initial RCS API request to send an MT message includes the optional Ref parameters, see Ref parameters in Send a Plain Text Message API for details. These parameters are also returned in the callback payload for reference.

{
  "code": "2002",
  "message": "Message read confirmation received",
  "data": {
    "type": "READ",
    "eventId": "MXXXXXXXXxa=mmx9SDfMaJVA",
    "from": "17XXXXXXXXX",
    "to": "kio_rcs",
    "sentAt": "2026-04-16T13:55:33.034Z",
    "messageId": "ce976c3b-8373-411c-9b02-8eXXXXXXXXXc",
    "ref": "test",
    "ref1": "test1",
    "ref2": "test2",
    "carrierId": "ATT"
  },
  "error": {}
}

TTL_EXPIRATION_REVOKED

{
  "code": "4004",
  "message": "Message TTL expiration revoked by the carrier",
  "data": {
    "type": "TTL_EXPIRATION_REVOKED",
    "eventId": "MXXXXXXXXxa=mmx9SDfMaJVA",
    "from": "19XXXXXXXXX",
    "to": "kio_rcs",
    "sentAt": "2026-04-16T17:08:51.650Z",
    "messageId": "08d060d0-2392-4efd-a7c2-e6cXXXXX604e",
    "carrierId": "VZ"
  },
  "error": {}
}

INTERNAL ERROR

{
  "code": "2101",
  "message": "Rcs INTERNAL_ERROR",
  "data": {
    "type": "ERROR",
    "eventId": "c4509648-1e51-43a0-ad08-dXXXXXXXXee3",
    "from": "17XXXXXXXX8",
    "to": "US_prod_1",
    "sentAt": "2026-04-16T13:33:04.741Z",
    "messageId": "597f7d13-21fa-419e-9739-fXXXXXXXX9bf",
    "carrierId": "ATT"
  },
  "error": {
    "error_code": "INTERNAL_ERROR",
    "error_message": "com.mgage.XXXX.rcsi.service.integration.atnt.ApiException: Unauthorized"
  }
}

THIS OPERATION IS BLOCKED

{
  "code": "3101",
  "message": "This operation is blocked",
  "data": {
    "type": "ERROR",
    "eventId": "1db6f7c5-cb70-49b5-ba92-cXXXXXXXXXee",
    "from": "13XXXXXXXXX",
    "to": "rcs_stage_04",
    "sentAt": "2026-04-10T06:47:40.509Z",
    "messageId": "3434a1ab-a467-4ec7-80f0-2761XXXXX01e",
    "carrierId": "TMO",
  },
  "error": {
    "error_code": "CARRIER_ERROR",
    "error_message": "This operation is blocked",
  }
}

UNKNOWN DEVICE OR RCS CAPABILITIES UNKNOWN FOR NUMBER

{
  "code": "9101",
  "message": "Unknown device or RCS capabilities unknown for number",
  "data": {
    "type": "ERROR",
    "eventId": "f3eae9e4-2ed0-4ba1-9c10-abXXXXXXXXb8",
    "from": "17XXXXXXXXX",
    "to": "rcs_stage_05",
    "sentAt": "2026-04-13T09:14:47.789Z",
    "messageId": "4e754be8-2526-485f-906d-22XXXXXXXXX4",
    "carrierId": "",
  },
  "error": {
    "error_code": "RCS_UNKNOWN",
    "error_message": "Unknown device or RCS capabilities unknown for number",
  }
}

Agent not provisioned or lacks permission for the service or MSISDN not found or destination is not an AT&T subscriber

{
  "code": "2101",
  "message": "Agent not provisioned or lacks permission for the service or MSISDN not found or destination is not an AT&T subscriber",
  "data": {
    "type": "ERROR",
    "eventId": "ee10bcb3-8e42-4f8e-9910-XXXXXXXX042b",
    "from": "17XXXXXXXXX",
    "to": "rcs_stage_05",
    "sentAt": "2026-04-13T09:21:47.705Z",
    "messageId": "ed8e107e-746a-4683-a021-bbXXXXXXXXa0",
    "carrierId": "ATT",
  },
  "error": {
    "error_code": "INTERNAL_ERROR",
    "error_message": "Agent not provisioned or lacks permission for the service or MSISDN not found or destination is not an AT&T subscriber",
  }
}

NO PROVIDER FOUND FOR SERVICE CODE

{
  "code": "4101",
  "message": "Rcs NO_ROUTE",
  "data": {
    "type": "ERROR",
    "eventId": "9688119a-88a8-407f-b72e-3XXXXXXXXec7",
    "from": "19XXXXXXXXX",
    "to": "rcs_stage_05",
    "sentAt": "2026-04-13T09:09:03.173Z",
    "messageId": "79298f27-1e52-4013-a466-c62XXXXXXXX6",
    "carrierId": "VZ",
  },
  "error": {
    "error_code": "NO_ROUTE",
    "error_message": "No provider found for service code: rcs_stage_05",
  }
}

Message Lifecycle Example

A typical message lifecycle may include the following sequence of events:

  1. SENT → Message submitted to carrier.
  2. DELIVERED → Message delivered to recipient's device.
  3. READ → Message opened/read by recipient.

If delivery fails, an ERROR event may be triggered instead of a DELIVERED event.

Event Code Mapping by Carrier:

EventATTTMOBVerizonVIJIODefault
SENT200030004000500060009000
DELIVERED200130014001500160019001
READ200230024002500260029002
COMPOSING200330034003500360039003
TTL_EXPIRATION_REVOKED200430044004500460049004
SUBSCRIBE200530054005500560059005
UNSUBSCRIBE200630064006500660069006
USER_MESSAGE200730074007500760079007
ERROR CODE210131014101510161019101

Sample Error Response:

{
  "code": "5101",
  "message": "This operation is blocked",
  "data": {
    "type": "ERROR",
    "eventId": "9e2e1c8e-1a4e-49da-9211-4572XXXXXf37",
    "from": "91XXXXXXXXXX",
    "to": "rcs-viTCLstage",
    "sentAt": "2026-04-20T05:47:14.324Z",
    "messageId": "55c81380-15b7-43d8-b742-a29XXXXX1eff",
    "carrierId": "VI"
  },
  "error": {
    "error_code": "CARRIER_ERROR",
    "error_message": "401-D:User is not in conversation and provided message is not a template"
  }
}

Refer to the following table for error messages in India:

Error CodeError Message
402Insufficient balance. Please recharge to send message.
450Bot blocked for spam.
409User is not in a conversation and provided message template is not approved.
410Opted out.
423DND enabled.
429Monthly message limit exceeded.
404Number is RCS disabled.
429GToo many requests: request limit exceeded.
502Unable to charge for this message.
500Internal server error.
400MaaP specific error.
400ATemplate provided with insufficient custom params.
403Invalid ClientID/IP.
0Unknown error.
400-ATemplate provided with insufficient params.
400-BTemplate not approved.
400-CTest template limit exceeded.
400-DTemplate code with bot does not exist.
400-EAgent not found.
400-FNot a valid JSON message.
400-GMessage type not supported.
400-HInvalid phone number.
400-MOIMaaP specific error (Google).
401-AUnauthorized.
401-BInvalid Client ID.
401-CInvalid IP address.
401-DUser not in conversation and message is not a template.
402-ALow balance: Please recharge.
403-ABot not launched.
403-BUser opted out.
403-CBot blocked for spam.
404-ARCS disabled.
409-MOIMaaP specific error (Google).
429-AToo many requests.
429-BMonthly message limit exceeded.
429-MOIMaaP specific error (Google).
500-AInternal server error.
502-ABad gateway.
502-MOITimeout from downstream MaaP (Google).
503-ACurfew hours.
504-ATimeout.
400-M14MaaP specific error.
409-M14MaaP specific error.
429-M14MaaP specific error.
502-M14Timeout from downstream MaaP.
423-ADND enabled.
500-BUnable to charge for this message.
403-DAgent suspended.
429-B-MOITraffic limit reached for agent on distinct users.
404-BOperation blocked – DND enabled.
429-C-MOIRecipient daily promotional message quota exceeded.




© 2026 Kaleyra Inc. All rights reserved.
Trademarks, logos and service marks displayed on this site are registered and unregistered trademarks of Kaleyra Inc.