Public Email API — programmatic sends

If you need to trigger campaigns or enroll contacts in journeys from your own systems, the public REST API exposes the email surface under a Bearer-authenticated endpoint.

Base URL:
https://api.turtini.com/v1/email/

Required: an API key with the email:send scope (Settings → API Keys → New key → check "email:send"). Pass it as Authorization: Bearer <key>.

Endpoints:

POST /v1/email/campaigns/{id}/send
• Triggers a send of an existing draft campaign
• Body: { "scheduledFor": "2026-05-01T14:00Z" } (optional — omit to send now)
• Response: { "campaignId": "...", "status": "sending" | "scheduled", "audienceCount": 423 }
• Use case: "send our weekly digest" from your own cron

POST /v1/email/campaigns/{id}/send-to
• Sends an existing campaign to a single contact (one-off transactional)
• Body: { "contactId": "..." } or { "email": "[email protected]" }
• Use case: order confirmation, welcome email triggered by your app

POST /v1/email/journeys/{id}/enroll
• Enrolls a contact in a journey
• Body: { "contactId": "..." } or { "email": "[email protected]" }
• Use case: external system signals "lead converted" → enroll in onboarding journey

Rate limits:
• 500 requests per minute per API key
• 429 with Retry-After header when exceeded
• Bulk sends (campaigns/send) don't count against per-contact rate limits

Error responses:
• 401 — missing or invalid Bearer key
• 403 — key lacks email:send scope
• 404 — campaign or journey not found / not in your org
• 422 — campaign not sendable (e.g. has no recipients)

Costs:
• Sends count toward the same +15% Resend chargeback as in-app sends
• Visible on Account → Pay-as-you-go → Email line item

For full schema, hit /v1/email/openapi.json or open Settings → API Keys → Documentation.