---
title: "Get program activity"
method: GET
path: "/v1/reports/program-activity"
tags: ["Reporting"]
---

# Get program activity

`GET /v1/reports/program-activity`

## Request

- Base URL: `https://api.scrip.dev`
- URL: `https://api.scrip.dev/v1/reports/program-activity`
- Auth: HTTP bearer

Returns activity metrics per program with a per-asset breakdown. Pass program_id for a single program's scorecard.
This report does not accept created_after or created_before.

## Query parameters

- `program_id` string, uuid
- `active_after` string, date-time
- `period_start` string, date-time
- `period_end` string, date-time

## Response `200`

Program activity metrics

- ProgramActivityListResponse: Program activity results
  - `data` ProgramActivityResponse[]: Per-program activity metrics
    - `asset_count` integer: Non-archived assets linked to this program (current state)
    - `by_asset` AssetAmountsResponse[]: Per-asset breakdown of issued/redeemed with asset identity and scale, scoped to the requested period when `period_start` and `period_end` are provided, with redeemed amounts net of reversals for all-time and gross for a period. Empty when the program has no issuance or redemption activity.
      - `asset_id` string, uuid: Unique identifier for this asset
      - `asset_name` string: The name people see for the asset, such as `Points`.
      - `asset_symbol` string: Ticker or symbol for this asset (e.g., `POINTS`)
      - `issued` string: Amount issued in this asset, rendered at the asset's scale
      - `redeemed` string: Amount redeemed in this asset, rendered at the asset's scale
      - `scale` integer: Number of decimal places for this asset; amounts are rendered with exactly this many decimals
    - `event_count` integer: Events processed. All-time when no period is specified; scoped to the period when `period_start`/`period_end` are provided.
    - `journal_count` integer: Total journal entries created (always all-time, regardless of `period_start`/`period_end`)
    - `last_activity_at` string, date-time: When the most recent event was processed (RFC 3339, always all-time; null if no activity)
    - `program_id` string, uuid: Unique identifier for this program
    - `program_name` string: The name of the program the activity belongs to.
    - `reward_count` integer: Non-archived catalog rewards in this program (current state)
    - `rule_count` integer: Non-archived rules in this program (current state)
    - `tier_count` integer: Tier types defined on this program (current state)
    - `unique_participants` integer: Total enrolled participants (always all-time, regardless of `period_start`/`period_end`)
  - `pagination` PaginationResponse: Cursor details for a list. `has_more` says whether another page exists, and `next_cursor` is the value to send to get it.
    - `has_more` boolean, required: Whether more results are available beyond this page
    - `next_cursor` string, nullable, required: Cursor to fetch the next page. Null on the last page

## Other responses

- `400`: Invalid query parameters (code: validation_error)
- `401`: The API key is missing or not valid. See [Authentication](https://docs.scrip.dev/authentication).
- `429`: Too many requests. Wait the number of seconds in the `Retry-After` header, then retry. See [Limits and durations](https://docs.scrip.dev/limits#rate-limits).
- `500`: Something failed on Scrip's side. Retry the request, and quote `request_id` if it keeps failing. [Errors](https://docs.scrip.dev/errors) lists every code, and the [API introduction](https://docs.scrip.dev/api-reference/introduction) describes the error format.

---

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