Build and test integrations without sending real emails or burning plan caps.
Every key carries a mode in its prefix:
prearrive_live_sk_… → live data, real emails prearrive_test_sk_… → test data, no real emails
The two are isolated end-to-end:
livemode: false in the event payload, so your receiver can branch on it.POST /v1/reservations/{id}/send with a test keyNo real email goes to the guest. Instead:
sent_at = now, status = "sent".email_preview_url on the reservation.reservation.sent webhook fires with livemode: false.GET https://api.prearrive.com/v1/reservations/res_…/email_preview
Authorization: Bearer prearrive_test_sk_…
{
"object": "email_preview",
"reservation_id": "res_…",
"rendered_at": "2026-05-20T05:30:00Z",
"would_send_to": "guest@example.com",
"from": "host@example.com",
"subject": "Your Beachside Loft check-in packet — please review",
"html": "<!doctype html>…full body…",
"text": "Hi Avery, …"
}
The preview disappears after 24 hours. Use it to:
You get the same 3-keys-per-mode cap and the same rotation flow. Test and live keys are fully independent.
/app/settings/api → Usage.Related: Idempotency · Versioning · Full API reference