Skip to main content
Check the status of sent emails — deliveries, opens, clicks, bounces, and complaints — by ID or with filters.

Authentication

Include your project API key in every request:
Without a valid API key, the response is 401 with { "error": "..." }. Learn more in Public API.

Endpoints

GET /v1/activity/:id

Get the details of a specific send by its ID. Parameters: Request:
Response 200 OK
Fields: Possible current_status values: With ?include=events — adds an events array with the full timeline, ordered by event_timestamp ascending:
event_type can be: sent, delivered, bounce, complaint, reject, open, click, rendering_failure, delivery_delay. With ?include=html — adds the html_content field with the full rendered HTML of the email (it can be large, only request it when needed). Errors: Error responses have the form { "error": "message" }.

GET /v1/activity

Lists sends with filters to obtain historical datasets and analyze delivery patterns. Parameters (query): Typical case with automation_run_id: save the automation_run_id returned by POST /v1/automations/:id/enroll. Once the flow has sent N emails, retrieve them all by filtering on that ID. Typical case with sender_domain: if you send on behalf of several customers from a single project, this filter isolates the sends of just one. It’s how you debug “what happened to this customer’s emails?” without splitting them into separate projects.
sender_domain matches the full domain, not a prefix: filtering by acme.com will not return sends from acme.com.mx. A value that isn’t a valid domain returns 400 INVALID_SENDER_DOMAIN.
Request:
Filter by automation_run_id:
One customer’s bounces — useful when you send on behalf of several:
Response 200 OK
Each element of data includes the same base fields as GET /v1/activity/:id (abbreviated here). Ordered by created_at DESC (most recent first). Errors: Error responses have the form { "error": "message" }.

Pull vs Webhook

  • Pull (this endpoint): query whenever you need. Simple to integrate, but with latency — opens and clicks are processed in the background and may take a few seconds (~5s) to appear in opened_first_at / clicked_first_at and in the event timeline.
  • Webhook: real-time push events. Better for reactive triggers.
To analyze delivery patterns in batch, use pull. For real-time reactive automations, use webhooks. Learn more in Webhooks.

GET /v1/domain-stats

Aggregated metrics by sender domain. If you send on behalf of several customers from a single project, this endpoint gives you each one’s summary: GET /v1/activity?sender_domain= lists sends one by one, this aggregates them. Parameters (query): Request:
Response:
Response fields:
Watch hard_bounce_rate, not the total bounce count. Email providers calculate the suspension threshold (typically 5%) on permanent bounces. Transient ones don’t count, and confusing the two leads to false alarms: a domain can show 12% total bounces while staying below 1% hard bounce.If hard_bounce_rate stays above 3%, review that list’s quality before sending more.

Rate limits

  • Max 200 results per page in GET /v1/activity (per_page greater than 200 is clamped to 200).
  • GET /v1/domain-stats aggregates over the requested period; very long ranges take longer.