Email API
A REST API for accepted, observable email delivery.
Send messages, query delivery events, manage suppressions, and receive signed status webhooks through the deployed HTTP surface. REST and cURL are the public integration path today.
Core endpoints
Use the deployed resources.
POST /v1/messagesaccepts one message and returns202.POST /v1/messages/batchaccepts up to 100 independently keyed items.GET /v1/messageslists tenant-scoped messages.GET /v1/message-logsqueries message-log records.GET /v1/eventsreturns delivery events, optionally filtered by message id.POST /v1/compliance/suppressionsadds one tenant-wide suppression.GET /v1/webhooks/statuslists status webhook subscriptions.PUT /v1/webhooks/statusandPATCH /v1/webhooks/statuscreate or update a subscription.GET /v1/webhooks/status/deliverieslists status webhook delivery attempts.
Responses carry X-Request-ID. Error responses use HTTP status codes and structured detail codes; clients should inspect the response contract before deciding whether to retry.
cURL example
Send against the public REST schema.
curl -X POST https://api.pulsepigeon.com/v1/messages \
-H "Authorization: Bearer $PULSEPIGEON_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-123-receipt" \
-d '{
"project_id": "project_123",
"from_email": "[email protected]",
"to": [{"email": "[email protected]"}],
"subject": "Your receipt",
"text": "Order 123 is complete.",
"category": "billing",
"metadata": {"order_id": "123"}
}'The single-message idempotency header is optional. Supply a stable key for the logical send so network retries collapse to one accepted message. A reused key with a different body returns409 idempotency_key_reused.
Webhooks
Consume only the events the delivery model emits.
Public delivery event types are accepted, queued, delivered, deferred, bounced, and complained. Status webhook payloads use a timestamped signature over canonical JSON. Store the raw body until signature verification is complete.
Failed status webhook deliveries use a configurable retry budget, defaulting to three attempts. Authorized replay usesPOST /v1/webhooks/status/{id}/deliveries/{delivery_id}/replay.
SDK status
Python and TypeScript SDKs are available.
TypeScript and Python SDKs are published at version 1.0.0 on npm and PyPI for the project-key surface. Use the REST API for tenant-wide and operator-gated resources.
Request limits
Use enforced limits, not advertised guesses.
- Batch requests contain at most 100 items.
- The batch request body is capped at 10,000,000 bytes.
- A message can carry at most 10 attachments.
- Single-message recipients are represented as an array of email objects.
- Plan email and retention limits are published on the pricing page.
Read next
- Developer documentation for current request and response contracts.
- Error reference for status and retry guidance.
- Transactional email for category and queue routing.
- Bulk email for campaigns and audience snapshots.
- Pricing for plan limits and retention.