Reminders
Two ways to drive Auto reminders from your own system:
- Schedule one reminder for one contact — “remind Asha about invoice 1042 on Friday at 10 am”. Create, change or cancel it with your own
external_id. - Send an event —
cart_abandoned,visit_completed,order_completed… Reminder rules set up in the panel (Automation → Auto reminders, type After an event) start on it, or stop on it.
Dates for the date-based rules (appointment, payment due, renewal, birthday) are plain contact fields: set them with POST /v1/contacts fields, e.g. "payment_due": "2026-11-10" or "appointment_at": "2026-11-02 15:30". Accepted formats: 2026-11-02, 02/11/2026 (day first), either with a time (15:30 or 3:30 pm), or an ISO date-time with an offset.
Every reminder goes through the same rules as the panel: an approved template any time, free text only inside the 24-hour window; opted-out contacts never get one; quiet hours (default 9 am–9 pm in your time zone), the per-contact daily limit and the catch-up rule after downtime apply.
Schedule a reminder
Section titled “Schedule a reminder”POST https://login.meapi.in/api/v1/reminders| Field | Type | Description |
|---|---|---|
phone |
string | Required. The customer, e.g. +919812345678. Created as a contact if new. |
at |
string | Required. When to send — ISO 8601 with an offset, e.g. 2026-11-02T10:00:00+05:30. Must be in the future. |
template |
object | { "name", "language"?, "variables"? } — one of your approved templates. variables fill {{1}}, {{2}}… in order: a string is fixed text, { "field": "amount_due" } reads a contact field at send time, { "contact": "name" } the contact’s name. |
text |
string | Instead of template: free text, delivered only if the 24-hour window is open at at (otherwise the reminder is skipped). |
external_id |
string | Your reference (invoice, booking…), up to 120 of A-Z a-z 0-9 _ . : -. Sending the same external_id again returns the existing reminder (200, "created": false) instead of a second one. |
note |
string | Shown to your team beside the chat |
name |
string | The contact’s name, if the contact is new |
channel_id |
integer | Which of your numbers |
curl https://login.meapi.in/api/v1/reminders \ -H "Authorization: Bearer $MEAPI_KEY" -H "Content-Type: application/json" \ -d '{ "phone": "+919812345678", "at": "2026-11-07T10:00:00+05:30", "external_id": "inv-1042", "template": { "name": "payment_due_reminder", "language": "en", "variables": [ { "contact": "name" }, "Rs 4,500", "10 Nov" ] } }'await fetch('https://login.meapi.in/api/v1/reminders', { method: 'POST', headers: { Authorization: `Bearer ${process.env.MEAPI_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ phone: '+919812345678', at: '2026-11-07T10:00:00+05:30', external_id: 'inv-1042', template: { name: 'payment_due_reminder', variables: [{ contact: 'name' }, { field: 'amount_due' }, '10 Nov'] }, }),});requests.post("https://login.meapi.in/api/v1/reminders", headers={"Authorization": f"Bearer {MEAPI_KEY}"}, json={"phone": "+919812345678", "at": "2026-11-07T10:00:00+05:30", "external_id": "inv-1042", "template": {"name": "payment_due_reminder", "variables": [{"contact": "name"}, "Rs 4,500", "10 Nov"]}}, timeout=30)201 Created (or 200 for an external_id you already used):
{ "success": true, "created": true, "reminder": { "id": 9182, "external_id": "inv-1042", "status": "scheduled", "reason": null, "note": null, "source": "api", "rule": null, "contact": { "id": 3310, "phone": "+919812345678", "name": "Asha Patel" }, "scheduled_at": "2026-11-07T04:30:00.000Z", "sent_at": null, "replied_at": null, "message_id": null, "cost_estimate": null }}Status
Section titled “Status”status |
Meaning |
|---|---|
scheduled |
Waiting for its time (quiet hours or the daily limit may move it later — scheduled_at shows when) |
sent, delivered, read |
Sent; the WhatsApp message’s own status. message_id works with GET /v1/messages/:id. |
replied |
The customer wrote back within 7 days |
failed |
Meta refused it or delivery failed — reason says why |
skipped |
Not sent on purpose — reason says why (opted out, window closed for free text, too late after downtime, no longer in the audience…) |
cancelled |
Cancelled by you, or its rule stopped (the customer paid, replied, the date changed) |
cost_estimate ({ amount, currency, category, note }) is filled when it is sent: an estimate from Meta’s list rates for the recipient’s country — Meta bills per delivered message, and its invoice is what counts.
List and read reminders
Section titled “List and read reminders”GET https://login.meapi.in/api/v1/reminders?phone=%2B919812345678GET https://login.meapi.in/api/v1/reminders/9182GET https://login.meapi.in/api/v1/reminders/by-external-id/inv-1042| Query | Description |
|---|---|
phone |
Only this contact’s reminders — including the ones your reminder rules scheduled |
external_id |
Only this reference |
status |
scheduled, sent, failed, skipped or cancelled |
limit |
1–200 (default 50), newest first |
Change or cancel a reminder
Section titled “Change or cancel a reminder”PATCH https://login.meapi.in/api/v1/reminders/by-external-id/inv-1042DELETE https://login.meapi.in/api/v1/reminders/by-external-id/inv-1042/v1/reminders/:id works the same. PATCH takes at, note, template or text and only changes a scheduled reminder you created (one-off or API) — a rule’s reminder follows its rule and its date field; change the field instead. DELETE cancels a scheduled reminder (409 if it already went out); add ?stop_rule=true to stop a rule’s whole sequence for that contact.
Send an event
Section titled “Send an event”POST https://login.meapi.in/api/v1/reminders/events| Field | Type | Description |
|---|---|---|
phone |
string | Required. The customer |
event |
string | Required. Lowercase letters, digits and _, e.g. cart_abandoned |
external_id |
string | The cart / order / visit id. The same event with the same id starts nothing a second time. |
fields |
object | Saved on the contact first, so the reminder can use them — e.g. { "cart_url": "https://…" } |
tags |
string[] | Tags to add |
curl https://login.meapi.in/api/v1/reminders/events \ -H "Authorization: Bearer $MEAPI_KEY" -H "Content-Type: application/json" \ -d '{ "phone": "+919812345678", "event": "cart_abandoned", "external_id": "cart-77", "fields": { "cart_url": "https://shop.example.com/cart/77" } }'{ "success": true, "event": "cart_abandoned", "contact": { "id": 3310, "phone": "+919812345678" }, "reminders_started": 1, "reminders_stopped": 0 }Send order_completed when the order is placed: an Abandoned cart reminder set to stop on it stops at once.
Errors
Section titled “Errors”| Code | When |
|---|---|
BAD_TIME |
at missing, not a date-time, or in the past |
BAD_PHONE |
Not a valid number with country code |
MISSING_TEMPLATE / MISSING_TEXT |
Neither a template nor text |
TEMPLATE_NOT_APPROVED |
No approved template with that name (and language) |
BAD_EXTERNAL_ID, BAD_EVENT, BAD_FIELDS |
The value does not fit the rules above |
NOT_FOUND |
No such reminder on your account |
NOT_SCHEDULED (409) |
Cancelling or changing a reminder that already went out |
Webhook events for reminders — reminder.sent, reminder.failed, reminder.skipped — are on Webhooks.
Was this page helpful?
Thank you — we read every comment.
Could not send right now. Please try again later.
© 2026 MeAPI by TheWebStore028 · RADHAMADHAV WEBSTORE LLP · GSTIN 27ABJFR6148J1ZO · Contact us ·Cookie settings