Events
Send custom events into Ranla to trigger transactional automations.
Base URL: https://api.ranla.ai
Authentication
Authorization: Bearer rnl_…Dashboard session cookies also work for browser requests to /api/events, which is how the automations canvas editor sends test events.
Trigger an event
POST /events
{
"name": "user.created",
"user_id": "user_123",
"email": "[email protected]",
"data": {
"name": "Ada Lovelace",
"plan": "pro"
}
}type is accepted as an alias for name.
Idempotency
Use Idempotency-Key for replay-safe retries:
Idempotency-Key: evt_user_created_123Retries with the same key and body return the original response. Reusing the key with a different body returns HTTP 409.
202 Accepted
{
"event": {
"id": "ae_123",
"name": "user.created",
"user_id": "user_123",
"email": "[email protected]",
"data": {
"name": "Ada Lovelace",
"plan": "pro"
},
"source": "api",
"created_at": "2026-07-26T12:00:00.000Z"
},
"matched_automations": 2,
"resumed_runs": 1,
"cancelled_runs": 0
}matched_automations= active automations whose trigger matched this eventresumed_runs= waiting runs resumed by this event (wait_for_event)cancelled_runs= active runs cancelled because this event matchedtrigger.cancel_on_events
Event shape
| Field | Type | Notes |
|---|---|---|
name |
string | Required unless type is provided |
type |
string | Alias for name |
user_id |
string | Optional identity hint for wait/resume matching |
email |
string | Optional identity hint for wait/resume matching |
data |
object | Optional event payload used by conditions and email templates |
dry_run |
boolean | Dashboard only — with automation_id, runs that one automation even if draft/paused; skips delays/waits and stubs email/SMS |
test_send |
boolean | Dashboard only — with automation_id, same targeting as dry-run but sends real email/SMS; still skips delays/waits. Mutually exclusive with dry_run |
automation_id |
string | Required with dry_run or test_send; rejected on API-key requests |
Inside automations, you can reference:
{{event.name}}{{event.email}}{{event.user_id}}{{event.data.foo}}
Typical flow
- Create an automation (dashboard canvas,
POST /automations, orsupersendtx automations create) with triggeruser.created - Activate it (
POST /automations/{id}with{ "action": "activate" }) - Send
POST /eventsfrom your app when that business event happens - Ranla queues the run in Bull/Redis
- Send-email steps flow through the same transactional send path as
POST /emails
See also docs/api/automations.md.
SDK
import { Ranla } from '@supersend/ranla'
const client = new Ranla(process.env.RANLA_API_KEY!)
await client.events.trigger({
name: 'user.created',
user_id: 'user_123',
email: '[email protected]',
data: { name: 'Ada Lovelace' },
idempotencyKey: 'evt_user_created_123',
})CLI
RANLA_API_KEY=$RANLA_API_KEY npx -y --package=ranla-cli -- ranla events send \
--name user.created \
--email [email protected] \
--user-id user_123 \
--data '{"name":"Ada Lovelace"}'OpenAPI
Machine-readable spec: openapi/supersendtx.yaml