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_123

Retries 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 event
  • resumed_runs = waiting runs resumed by this event (wait_for_event)
  • cancelled_runs = active runs cancelled because this event matched trigger.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

  1. Create an automation (dashboard canvas, POST /automations, or supersendtx automations create) with trigger user.created
  2. Activate it (POST /automations/{id} with { "action": "activate" })
  3. Send POST /events from your app when that business event happens
  4. Ranla queues the run in Bull/Redis
  5. 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