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.