A simple pull-based alternative to the GSM Delivery Report webhook — use this if you'd rather fetch delivery status on demand instead of (or in addition to) receiving webhook pushes. This is especially useful as a fallback for cases where a webhook delivery attempt fails or is missed.
Fetch Delivery Report
Endpoint
GET https://wa20.nuke.co.in/webhook/api/getGSMreport.php?request_id={your_request_id}
POST with the same parameter in a JSON body also works.
Query / Body Parameters
Any one of the following is accepted (checked in this order — the first non-empty one found is used):
| Parameter | Where | Description |
|---|---|---|
request_id | Query or body | The request_id returned when you originally sent the broadcast. |
requestid | Query or body | Alternate name for the same value. |
provider_message_id | Query or body | Alternate name for the same value. |
providermessageid | Query or body | Alternate name for the same value. |
providerMessageId | Body only | Alternate name for the same value. |
Example Request
GET https://wa20.nuke.co.in/webhook/api/getGSMreport.php?request_id=GSMCAMP_20260711_6BA86822
cURL Example
curl -X GET "https://wa20.nuke.co.in/webhook/api/getGSMreport.php?request_id=GSMCAMP_20260711_6BA86822"
Example Response — 200 OK
{
"success": true,
"request_id": "GSMCAMP_20260711_138476",
"data": {
"summary": {
"requestid": "GSMCAMP_20260711_138476",
"username": "yourusername",
"deduction": "4",
"contacts": "2",
"broadcast_name": "anything",
"schedule_time": "2026-07-11 10:15:32",
"schedule_date": "2026-07-11"
},
"total_rows": 2,
"status_counts": {
"DELIVERED": 1,
"PP1": 1
},
"records": [
{
"event": "gsm.status.update",
"providerMessageId": "GSMCAMP_20260711_138476",
"receiver": "919912345678",
"status": "DELIVERED",
"status_code": 0,
"error_code": null,
"errorMessage": null
},
{
"event": "gsm.status.update",
"providerMessageId": "GSMCAMP_20260711_138476",
"receiver": "918812345678",
"status": "PP1",
"status_code": 0,
"error_code": null,
"errorMessage": null
}
]
}
}
Response Fields
| Field | Description |
|---|---|
request_id | The request_id you queried for. |
data.summary | The original broadcast record — username, credits deducted, contact count, broadcast name, and schedule info. |
data.total_rows | Number of individual recipient records found for this request_id. |
data.status_counts | A quick count of how many recipients are in each status. |
data.records | Per-recipient delivery detail, in the same shape as the delivery report webhook payload — so you can reuse the same parsing logic on your end. |
records[].status values you'll typically see:
| Status | Meaning |
|---|---|
SENT | Message has been sent out and is awaiting final delivery confirmation. |
DELIVERED | Message was successfully delivered to the recipient's handset. |
FAILED | Message could not be delivered. Check errorMessage for details. |
Anything else (e.g. PP1) | Still being processed — hasn't reached a final delivery state yet. Poll again after a short interval. |
Error Responses
| Status | Message | Reason |
|---|---|---|
| 400 | request_id is required | No request_id (or any of its aliases) was found in the request. |
| 404 | Report not found | No broadcast or delivery records exist for the given request_id. |
| 500 | Database connection failed / Failed to prepare report query / Failed to prepare delivery details query | Server/database error. |
Notes
- No authentication is currently required to pull a report — any
request_id(or alias) that matches a broadcast will return its data. Sincerequest_idvalues aren't easily guessable, treat this as security-through-obscurity rather than a hard access control, and avoid exposing request IDs publicly. - Use this endpoint if you didn't get (or aren't sure you got) a webhook push for a given message — it always reflects the latest known status.
- This is a good complement to the webhook: use the webhook for real-time updates, and fall back to this pull API to double-check or backfill anything you might have missed.
