Skip to content
Developers

One API call per event. Renotify handles the rest.

Tell Renotify what happened. Workflows decide who to notify, on which channel and what to say, so your code never has to know about templates, consent or fallback.

1 · Send an event

Post what happened, with who it happened to.

Identify the customer by your own ID, phone or email; Renotify creates or updates the contact. Anything in data is available to workflow conditions and messages as {{ event.field }}.

Send an Idempotency-Key header and a retried request is recorded once, so a customer is never notified twice.

Request
curl https://renotify.app/api/v1/events \
  -H "Authorization: Bearer $RENOTIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: invoice-1042-due" \
  -d '{
    "name": "payment.due",
    "contact": {
        "external_id": "cus_1042",
        "phone": "+15551234567",
        "email": "[email protected]",
        "name": "Jane Doe"
    },
    "data": {
        "amount": "$120.00",
        "due_date": "1 October",
        "pay_url": "https://pay.example.com/inv-1042"
    }
}'
2 · Let workflows decide

Rules live in Renotify, not in your code.

The event is accepted straight away, and every active workflow listening for payment.due starts for that contact in the background. A repeated Idempotency-Key returns the original event with 200.

Change the messages, timing or channels in the app without a deploy. When the customer pays, send payment.completed and the reminders stop.

202 Accepted
{
    "data": {
        "id": "8812",
        "type": "events",
        "attributes": {
            "name": "payment.due",
            "contact_id": 311,
            "data": {
                "amount": "$120.00",
                "due_date": "1 October",
                "pay_url": "https://pay.example.com/inv-1042"
            },
            "source": "api",
            "occurred_at": "2026-10-01T09:00:00.000000Z"
        }
    }
}
3 · Hear back

Signed webhooks for everything that follows.

Subscribe an HTTPS endpoint to message.delivered, message.failed, outcome.recorded, consent.revoked and more. Each request is signed with your secret and retried with backoff for about a day.

Webhooks come with the Business and Agency plans. Sending events to Renotify works on every plan.

Verify a webhook (Node.js)
// Renotify-Signature: t=1727600000,v1=5257a869…
const [t, v1] = header.split(",").map((part) => part.split("=")[1]);
const expected = crypto
  .createHmac("sha256", process.env.RENOTIFY_WEBHOOK_SECRET)
  .update(`${t}.${rawBody}`)
  .digest("hex");

if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1))) {
  throw new Error("Invalid signature");
}

REST API

Contacts, audiences, templates, campaigns, messages and events, with API tokens scoped to a workspace.

Integrations

HubSpot and Shopify send events for you: new contacts, orders and abandoned checkouts.

Rate limits

Up to 1,200 events a minute per workspace. Talk to us if you need more.

Send your first event in minutes.

Try any plan free for 14 days with messaging credit included. Pick a recipe, connect WhatsApp or SMS, and watch the first message arrive on your own phone.