<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, including a read-only key. 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

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

    • breaking

      query request parameter cursor list-of-types was narrowed by removing types null

    • info

      for the query request parameter cursor, the type was generalized from no type to string

    • info

      the security scope read_only was added to the endpoint's security scheme PersonalAccessTokenAuth

    • info

      the security scope full_access was removed from the endpoint's security scheme PersonalAccessTokenAuth