Quickstart
This walkthrough takes you from "no account" to "event delivered to a real destination" in about five minutes. It uses a webhook destination because webhooks are the fastest thing to point at a request-bin URL, once you have the flow working, swap the destination type to whatever you actually care about.
1. Create an account
Sign up at app.pushrail.io. The first user in a workspace becomes the tenant owner and can invite teammates from Settings → Members. Each workspace is one tenant; tenants are isolated end to end (events, destinations, keys, audit logs).
You land in a Development environment by default. Production and Staging exist alongside it, they share schemas and member permissions but never share events, keys, or destinations.
2. Get an API key
Open Settings → API keys and create a key scoped to Development. Keys are prefixed (pr_dev_..., pr_sta_..., pr_pro_...) so they are visually distinct in code review and log output. Copy the secret once, Pushrail shows it only on creation and stores a hash thereafter. See Authentication for scopes and rotation.
Treat API keys like database passwords. Never commit them to git; load them from your secret store at runtime.
3. Send your first event
Pick any HTTP client. The shape below is the canonical ingestion request, see the ingest endpoint reference for every field.
curl -X POST https://api.pushrail.io/events \
-H "Authorization: Bearer $PUSHRAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"eventType": "order.completed",
"occurredAt": "2026-05-16T18:24:00Z",
"source": "checkout-service",
"customerExternalId": "cust_42",
"payload": { "orderId": "ord_9001", "totalCents": 4999, "currency": "USD" }
}'
import { Pushrail } from "@pushrail/sdk";
const pushrail = new Pushrail({ apiKey: process.env.PUSHRAIL_API_KEY! });
await pushrail.events.emit({
eventType: "order.completed",
source: "checkout-service",
customerExternalId: "cust_42",
payload: { orderId: "ord_9001", totalCents: 4999, currency: "USD" },
});
from pushrail import Pushrail
client = Pushrail(api_key=os.environ["PUSHRAIL_API_KEY"])
client.events.emit({
"eventType": "order.completed",
"source": "checkout-service",
"customerExternalId": "cust_42",
"payload": {"orderId": "ord_9001", "totalCents": 4999, "currency": "USD"},
})
A successful call returns 202 Accepted with an event id and a status of accepted or duplicate. The event is now persisted; delivery happens asynchronously.
4. Configure a destination
In the dashboard, open Destinations → New, pick Webhook, and paste a request-bin URL (sites like webhook.site are perfect for the first test). Leave authentication as "None" for now, and pick a signing scheme, pushrail_v1 is the default and gives you replay-protected HMAC signatures out of the box.
Then add a routing rule that matches eventType = order.completed and points at this destination. The dashboard offers a one-click "send test event" button if you want to verify the wiring before re-emitting from your code.
5. Watch it deliver
Open Observability → Deliveries. Filter by event type or destination; click into a delivery to see the request body, response headers, response body, latency, and any retry attempts. If the destination returned a 5xx, you will see the backoff schedule and the next attempt time. If it returned a 2xx, you are done, your event made it.
Unless Private Payload Mode is enabled for the environment, in which case the event and delivery contents are shown as [sealed] while status codes, latency, error category, and retry history stay visible.
For ongoing operations, this is the page you will live in. See Delivery logs and observability for the underlying API.
What's next
Read Sending events for batch ingest, idempotency, and error handling. Skim the destination guides for whichever real destination you intend to use. When something fails, Replay & recovery is the page you want bookmarked.