---
title: "Account-level email metrics, in Resend's shape: totals for a date range, or broken down by period, domain, email or broadcast."
method: GET
path: "/emails/metrics"
tags: ["metrics"]
---

# Account-level email metrics, in Resend's shape: totals for a date range, or broken down by period, domain, email or broadcast.

`GET /emails/metrics`

## Request

- Base URL: `https://api.agentisend.com`
- URL: `https://api.agentisend.com/emails/metrics`
- Auth: HTTP bearer

Counted from the event log; a simulator send is not counted. A call that sends since, until, group_by, event, domain or api_key_id answers as GET /metrics does instead.

## Query parameters

- `start_date` string: The start of the range, an ISO 8601 date or datetime. Defaults to 6 days before end_date.
- `end_date` string: The end of the range, an ISO 8601 date or datetime. A date covers that whole day. A future value is clamped to now. Defaults to now.
- `timezone` string: IANA timezone that buckets periods when period is a dimension. Defaults to UTC.
- `granularity` 'hourly' | 'daily' | 'weekly' | 'monthly': Bucket size when period is a dimension. Defaults to daily. At most 10,000 periods.
- `metrics` union: Metrics to return, comma-separated or repeated. Omit for all. One of: received, sent, delivered, delivery_delayed, failed, suppressed, bounced, bounced_transient, bounced_permanent, bounced_undetermined, opened, unique_opened, clicked, unique_clicked, complained, unsubscribed, delivery_rate, open_rate, click_rate, bounce_rate, complaint_rate, unsubscribe_rate.
  - string
  - string[]
- `dimensions` union: Dimensions to break the answer down by, comma-separated or repeated. Omit for one totals row. Any of: period, domain, email, broadcast. email cannot be combined with broadcast.
  - string
  - string[]
- `domain_id` union: Sending domain ids to restrict to, up to 100.
  - string
  - string[]
- `email_id` union: Email ids to restrict to, up to 100. Not with the broadcast dimension or broadcast_id.
  - string
  - string[]
- `broadcast_id` union: Broadcast ids to restrict to, up to 100. Not with the email dimension or email_id.
  - string
  - string[]
- `since` string: This API's name for the start of the window. Answers in the GET /metrics shape.
- `until` string: This API's name for the end of the window. Answers in the GET /metrics shape.
- `group_by` string: One or several comma-separated. One of: domain, api_key.
- `event` 'sent' | 'delivered' | 'bounced' | 'complained' | 'opened' | 'clicked'
- `domain` string
- `api_key_id` union
  - string, uuid
  - 'none'

## Response `200`

Success

- GetEmailsMetricsReply
  - `object` 'metrics'
  - `start_date` string: The start of the requested range, as an ISO 8601 datetime.
  - `end_date` string: The end of the requested range, as an ISO 8601 datetime.
  - `metrics` string[]: The metrics in the response.
  - `dimensions` string[]: The dimensions the response is broken down by.
  - `granularity` 'hourly' | 'daily' | 'weekly' | 'monthly'
  - `totals` object: The requested metrics over the whole range.
  - `data` object[]: One row per combination of the requested dimensions. Omitted when there are none.
    - `period` string
    - `domain_id` string, nullable
    - `domain_name` string, nullable
    - `email_id` string
    - `broadcast_id` string
    - `broadcast_name` string, nullable

## Other responses

- `400`: The request is malformed or a field failed validation. Codes: validation_error, invalid_idempotency_key, invalid_cursor, plan_not_purchasable, stripe_signature_invalid, support_upload_rejected, sign_in_check_required.
- `401`: No usable credential was sent. Codes: missing_api_key, session_required, mfa_required.
- `403`: The credential may not do this, or the account or key is stopped. Codes: sending_domain_blocked, young_domain_held, domain_sending_disabled, domain_not_verified, onboarding_recipient_not_a_member, onboarding_sender_unavailable, account_suspended, account_sandboxed, human_action_required, csrf_origin_rejected, charge_not_this_account, invalid_api_key, restricted_api_key, insufficient_role, invite_email_mismatch, domain_scope_violation, dedicated_ip_assigned_by_us, approval_required, staff_review_required, trust_paused, kill_switch_active.
- `422`: A field is well formed but was refused. Codes: missing_required_field, invalid_from_address, invalid_parameter, invalid_attachment, invalid_region, tracking_subdomain_unverified, tracking_subdomain_cannot_be_removed, domain_field_immutable, open_tracking_on_transactional, header_replaced, html_clipped_by_gmail, link_domain_listed, domain_blocklisted, mailbox_provider_domain, onboarding_shape_refused, dkim_key_mismatch, domain_check_window_expired, spf_conflict, spf_lookup_limit, review_sandbox_recipient_only, suppressed_recipient, content_refused, recipient_blocklisted, last_owner_required, seat_limit_reached, invite_not_valid, key_budget_exceeds_plan, domain_limit_reached, webhook_endpoint_limit_reached.
- `429`: A rate, quota or ramp ceiling was reached. Codes: onboarding_daily_cap_reached, trust_throttled, invite_limit_reached, rate_ceiling_exceeded, daily_quota_exceeded, monthly_quota_exceeded, rate_limit_exceeded, support_rate_limited.
- `500`: Something failed on our side. Codes: internal_server_error.

---

[API](https://skmtc.dev/agentisend/apis/agentisend-api.md) · [All operations](https://skmtc.dev/agentisend/apis/agentisend-api/llms.txt) · [OpenAPI document](https://skmtc.dev/agentisend/apis/agentisend-api/revisions/3066dda62a56?raw)
