Skip to content
WaaruDocs

Activity reports

Inspect seven UTC dates of key-specific API requests and number-specific webhook delivery health without customer payloads.

Reviewed

This read-only report covers seven UTC dates ending at the request time. It takes no query parameters or body. retention.startsAt, endsAt and dates describe the actual window; the current UTC date can be partial.

api contains this key's totalCalls, daily counts, operation counts and result counts. The historical wire value LEGACY_API_KEY groups resource, webhook and other API-key operations; the dashboard labels it Other API requests. It is an operation bucket, not a kind or age of key. Dashboard sessions, OAuth/MCP requests and internal jobs do not contribute to these API request counts.

messages counts accepted API message intents for this key, not HTTP requests or retry attempts. Each daily bucket groups messages by the UTC date they were accepted. Its counts show their current mutually exclusive status: pending, sent, delivered, read, or failed. Pending includes sends still awaiting a definitive provider result. Sent does not mean delivered; a read message appears only in read.

webhook.outcomes groups deliveries by their creation date. Each appears once as pending (including in progress), delivered (acknowledged by the endpoint), or stopped (terminal). These are current outcomes, not the number of status transitions that occurred on that date.

webhook also covers the number's delivery count, attempt count, daily/event/status counts and up to 20 recent deliveries. Delivery rows include safe status and error codes with timestamps, not callback bodies, recipients or signing material. API-key rotation changes which key's calls you are inspecting, while the webhook summary remains number-specific.

The response schema below lists every nested field and enum. The zero-activity example still includes all seven daily buckets. Arbitrary date ranges, campaign analytics, conversions and cost reporting are not provided by this endpoint.

Inspect the dashboard

Open Settings > Developer and choose your WhatsApp number. API keys shows API request counts separately from the message delivery graph. Its key filter limits both API requests and message outcomes. Webhooks shows delivery health for the whole selected number; it is not narrowed to one key. The overview shows request and delivery graphs with operation/result breakdowns. Select View … data to open the exact counts in an accessible dialog. View recent deliveries opens webhook details; Manage API keys opens the workspace key table. Refresh activity to fetch current outcomes.

The active key list hides revoked keys, including keys replaced by rotation. All API keys still includes their retained number-specific history. Counts can therefore remain when there is no active key for the selected number. This does not mean that another number or workspace contributed. A number that has never had an authenticated key request should have zero API request counts; investigate unexpected activity rather than replacing it with a fabricated zero. Webhook events are number-specific and do not require a currently active API key.

Endpoint details

Every request uses Authorization: Bearer $WAARU_API_KEY and a connected number in Developer API mode. The scope below is required. IDs and payloads are illustrative; replace them with your own permitted resources. See authentication and common errors, size limits and retries.

GET /v1/developer/reports/activity

Required scope: reports:read

Requires reports:read. Fixed seven UTC days. API calls belong to this key; callback summaries belong to its number. No message content or recipients.

No path or query parameters.

Request

curl --fail-with-body --request GET 'https://api.waaru.app/v1/developer/reports/activity' \
  --header "Authorization: Bearer $WAARU_API_KEY"

Send no request body.

Response: HTTP 200

{
  "retention": {
    "days": 7,
    "timezone": "UTC",
    "startsAt": "2026-09-25T00:00:00.000Z",
    "endsAt": "2026-10-01T09:00:00.000Z",
    "dates": [
      "2026-09-25",
      "2026-09-26",
      "2026-09-27",
      "2026-09-28",
      "2026-09-29",
      "2026-09-30",
      "2026-10-01"
    ]
  },
  "api": {
    "totalCalls": 0,
    "daily": [
      {
        "date": "2026-09-25",
        "count": 0
      },
      {
        "date": "2026-09-26",
        "count": 0
      },
      {
        "date": "2026-09-27",
        "count": 0
      },
      {
        "date": "2026-09-28",
        "count": 0
      },
      {
        "date": "2026-09-29",
        "count": 0
      },
      {
        "date": "2026-09-30",
        "count": 0
      },
      {
        "date": "2026-10-01",
        "count": 0
      }
    ],
    "operations": [],
    "results": []
  },
  "webhook": {
    "deliveryCount": 0,
    "attemptCount": 0,
    "daily": [
      {
        "date": "2026-09-25",
        "count": 0
      },
      {
        "date": "2026-09-26",
        "count": 0
      },
      {
        "date": "2026-09-27",
        "count": 0
      },
      {
        "date": "2026-09-28",
        "count": 0
      },
      {
        "date": "2026-09-29",
        "count": 0
      },
      {
        "date": "2026-09-30",
        "count": 0
      },
      {
        "date": "2026-10-01",
        "count": 0
      }
    ],
    "events": [],
    "statuses": [],
    "recentDeliveries": [],
    "outcomes": [
      {
        "date": "2026-09-25",
        "pending": 0,
        "delivered": 0,
        "stopped": 0
      },
      {
        "date": "2026-09-26",
        "pending": 0,
        "delivered": 0,
        "stopped": 0
      },
      {
        "date": "2026-09-27",
        "pending": 0,
        "delivered": 0,
        "stopped": 0
      },
      {
        "date": "2026-09-28",
        "pending": 0,
        "delivered": 0,
        "stopped": 0
      },
      {
        "date": "2026-09-29",
        "pending": 0,
        "delivered": 0,
        "stopped": 0
      },
      {
        "date": "2026-09-30",
        "pending": 0,
        "delivered": 0,
        "stopped": 0
      },
      {
        "date": "2026-10-01",
        "pending": 0,
        "delivered": 0,
        "stopped": 0
      }
    ]
  },
  "messages": {
    "total": 0,
    "daily": [
      {
        "date": "2026-09-25",
        "pending": 0,
        "sent": 0,
        "delivered": 0,
        "read": 0,
        "failed": 0
      },
      {
        "date": "2026-09-26",
        "pending": 0,
        "sent": 0,
        "delivered": 0,
        "read": 0,
        "failed": 0
      },
      {
        "date": "2026-09-27",
        "pending": 0,
        "sent": 0,
        "delivered": 0,
        "read": 0,
        "failed": 0
      },
      {
        "date": "2026-09-28",
        "pending": 0,
        "sent": 0,
        "delivered": 0,
        "read": 0,
        "failed": 0
      },
      {
        "date": "2026-09-29",
        "pending": 0,
        "sent": 0,
        "delivered": 0,
        "read": 0,
        "failed": 0
      },
      {
        "date": "2026-09-30",
        "pending": 0,
        "sent": 0,
        "delivered": 0,
        "read": 0,
        "failed": 0
      },
      {
        "date": "2026-10-01",
        "pending": 0,
        "sent": 0,
        "delivered": 0,
        "read": 0,
        "failed": 0
      }
    ]
  }
}
Response body fields
FieldRequiredType and constraints
retentionYes{"type":"object","required":["days","timezone","startsAt","endsAt","dates"],"additionalProperties":false} Nested fields are in the complete schema below.
messagesYes{"type":"object","required":["total","daily"],"additionalProperties":false} Nested fields are in the complete schema below.
apiYes{"type":"object","required":["totalCalls","daily","operations","results"],"additionalProperties":false} Nested fields are in the complete schema below.
webhookYes{"type":"object","required":["outcomes","deliveryCount","attemptCount","daily","events","statuses","recentDeliveries"],"additionalProperties":false} Nested fields are in the complete schema below.
Response body: complete JSON schema

Required fields appear in required. Omit optional fields unless needed. Null is accepted only where the schema includes it. Arrays describe their elements in items; variants appear in anyOf or oneOf.

{
  "type": "object",
  "properties": {
    "retention": {
      "type": "object",
      "properties": {
        "days": {
          "type": "number",
          "const": 7
        },
        "timezone": {
          "type": "string",
          "const": "UTC"
        },
        "startsAt": {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
        },
        "endsAt": {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
        },
        "dates": {
          "minItems": 7,
          "maxItems": 7,
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
          }
        }
      },
      "required": [
        "days",
        "timezone",
        "startsAt",
        "endsAt",
        "dates"
      ],
      "additionalProperties": false
    },
    "messages": {
      "type": "object",
      "properties": {
        "total": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "daily": {
          "minItems": 7,
          "maxItems": 7,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "pending": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "sent": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "delivered": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "read": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "failed": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "date",
              "pending",
              "sent",
              "delivered",
              "read",
              "failed"
            ],
            "additionalProperties": false
          }
        }
      },
      "required": [
        "total",
        "daily"
      ],
      "additionalProperties": false
    },
    "api": {
      "type": "object",
      "properties": {
        "totalCalls": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "daily": {
          "minItems": 7,
          "maxItems": 7,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "count": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "date",
              "count"
            ],
            "additionalProperties": false
          }
        },
        "operations": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "operation": {
                "type": "string",
                "enum": [
                  "SEND_MESSAGE",
                  "GET_MESSAGE",
                  "LIST_CONVERSATIONS",
                  "LIST_CONVERSATION_MESSAGES",
                  "GET_MEDIA",
                  "LEGACY_API_KEY"
                ]
              },
              "count": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "operation",
              "count"
            ],
            "additionalProperties": false
          }
        },
        "results": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "result": {
                "type": "string",
                "enum": [
                  "SUCCESS",
                  "CLIENT_ERROR",
                  "RATE_LIMITED",
                  "SERVER_ERROR"
                ]
              },
              "count": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "result",
              "count"
            ],
            "additionalProperties": false
          }
        }
      },
      "required": [
        "totalCalls",
        "daily",
        "operations",
        "results"
      ],
      "additionalProperties": false
    },
    "webhook": {
      "type": "object",
      "properties": {
        "outcomes": {
          "minItems": 7,
          "maxItems": 7,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "pending": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "delivered": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "stopped": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "date",
              "pending",
              "delivered",
              "stopped"
            ],
            "additionalProperties": false
          }
        },
        "deliveryCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "attemptCount": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "daily": {
          "minItems": 7,
          "maxItems": 7,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "date": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "count": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "date",
              "count"
            ],
            "additionalProperties": false
          }
        },
        "events": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "event": {
                "type": "string",
                "enum": [
                  "MESSAGE_RECEIVED",
                  "MESSAGE_SENT",
                  "MESSAGE_DELIVERED",
                  "MESSAGE_READ",
                  "MESSAGE_FAILED"
                ]
              },
              "count": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "event",
              "count"
            ],
            "additionalProperties": false
          }
        },
        "statuses": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "PENDING",
                  "CLAIMED",
                  "DELIVERED",
                  "TERMINAL"
                ]
              },
              "count": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "status",
              "count"
            ],
            "additionalProperties": false
          }
        },
        "recentDeliveries": {
          "maxItems": 20,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "eventType": {
                "type": "string",
                "enum": [
                  "MESSAGE_RECEIVED",
                  "MESSAGE_SENT",
                  "MESSAGE_DELIVERED",
                  "MESSAGE_READ",
                  "MESSAGE_FAILED"
                ]
              },
              "status": {
                "type": "string",
                "enum": [
                  "PENDING",
                  "CLAIMED",
                  "DELIVERED",
                  "TERMINAL"
                ]
              },
              "attempts": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "responseStatus": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 100,
                    "maximum": 599
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "lastErrorCode": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "terminal_response",
                      "endpoint_paused",
                      "delivery_expired",
                      "retryable_response",
                      "media_ingest_expired"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "createdAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
              },
              "deliveredAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "terminalAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "eventType",
              "status",
              "attempts",
              "responseStatus",
              "lastErrorCode",
              "createdAt",
              "deliveredAt",
              "terminalAt"
            ],
            "additionalProperties": false
          }
        }
      },
      "required": [
        "outcomes",
        "deliveryCount",
        "attemptCount",
        "daily",
        "events",
        "statuses",
        "recentDeliveries"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "retention",
    "messages",
    "api",
    "webhook"
  ],
  "additionalProperties": false
}

Failures use a stable code and safe message. They never expose internal exception messages, traces or provider diagnostics. Check the error reference before retrying. An inaccessible resource can return 404 even if its identifier exists elsewhere.

Next: All public API operations or authentication and scopes.

On this page