Get email stats

Changed on

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Returns delivery and engagement counts for the emails the app sent, for each template and in total, over the last days days. Each count has a daily breakdown and the totals for the same number of days before, so you can compare periods.

Days are UTC. A send counts on the day it was sent, and a delivery, open or click on the day it happened, so a rate can include outcomes of emails sent before the period. Opens and clicks are counted only for emails sent with tracking on. Emails the app sends from its own email domain aren't counted yet, so an app that sends from its own domain gets zeros for those.

templates is paginated. Pass next_cursor back as cursor, with the same days and limit, to get the next page. Every page carries the same app-wide totals, previous_totals and daily.

Email stats need a paid workspace plan.

This is limited to 60 requests per minute per app for each workspace's personal API keys, so every key in a workspace shares one allowance. Some workspaces have a different limit. List email templates shares it.

<Note>This endpoint accepts a personal API key belonging to a user with access to the app. A read-only key is refused, and workspace API keys are not accepted.</Note>

get/api/apps/{app_id}/emails/stats

Request

  • Base URL: https://app.base44.com
  • URL: https://app.base44.com/api/apps/{app_id}/emails/stats
  • Auth: HTTP bearer

Path parameters

app_idstring required

ID of the app the emails belong to.

Query parameters

daysinteger

Number of days to count, from 1 to 90, ending today in UTC. Defaults to 30. The previous totals cover the same number of days just before.

limitinteger

Maximum number of entries in templates per page, from 1 to 200. Defaults to 50.

cursorstring nullable

next_cursor from the previous page. Send the same days and limit with it. A cursor expires after 24 hours.

Response

The app's email stats.

daysinteger required

Number of days counted, as requested.

next_cursorstring nullable required

Pass it as cursor to get the next page of templates, or null on the last page.

Example response

{
  "days": 30,
  "templates": [
    {
      "daily": [
        {
          "bounced": 1,
          "clicked": 5,
          "day": "2026-09-14",
          "delivered": 41,
          "opened": 18,
          "sent": 42,
          "spam": 0,
          "unsubscribed": 0
        }
      ],
      "template_key": "Welcome",
      "totals": {
        "bounce_rate": 0.025,
        "bounced": 31,
        "clicked": 143,
        "delivered": 1198,
        "delivered_rate": 0.966,
        "opened": 512,
        "sent": 1240,
        "spam": 2,
        "unsubscribed": 4
      },
      "tracked": true
    }
  ],
  "totals": {
    "sent": 1240,
    "delivered": 1198,
    "opened": 512,
    "clicked": 143,
    "bounced": 31,
    "spam": 2,
    "unsubscribed": 4,
    "delivered_rate": 0.966,
    "bounce_rate": 0.025
  },
  "previous_totals": {
    "sent": 1240,
    "delivered": 1198,
    "opened": 512,
    "clicked": 143,
    "bounced": 31,
    "spam": 2,
    "unsubscribed": 4,
    "delivered_rate": 0.966,
    "bounce_rate": 0.025
  },
  "daily": [
    {
      "bounced": 1,
      "clicked": 5,
      "day": "2026-09-14",
      "delivered": 41,
      "opened": 18,
      "sent": 42,
      "spam": 0,
      "unsubscribed": 0
    }
  ],
  "next_cursor": "eyJuIjoiYXBwX2VtYWlsX3N0YXRzIiwicCI6eyJhZnRlciI6IldlbGNvbWUifX0"
}

Changes