---
title: "One person's P2P activity over time (admin)"
method: GET
path: "/admin/fulfillments/timeseries"
tags: ["fulfillment"]
---

# One person's P2P activity over time (admin)

`GET /admin/fulfillments/timeseries`

## Request

- Base URL: `https://api.instruxi.dev/api/v1/enforcer`
- URL: `https://api.instruxi.dev/api/v1/enforcer/admin/fulfillments/timeseries`
- Auth: one of:
  - API key in header `Authorization`
  - API key in header `X-API-Key`

Bucketed counts + notional sums for a single user, for the operator activity chart. `user_id` is matched on EITHER side (sender, receiver or creator) — the same party test GET /admin/fulfillments uses, so the chart and the list it drills into agree about whose transfer a row is. `bucket` is day|week|month. Sent/received split by the CHARTED user's role, not the caller's. `settled` counts only confirmed; `cancelled` folds cancelled|declined|expired and is returned as its OWN series rather than dropped — climbing cancellations are signal. `self_payments` defaults to **exclude**: a self→self fulfillment is funding plumbing, and counting it as customer activity misreads treasury operations as behaviour. Aggregated in SQL, so cost scales with buckets rather than transfers.

## Query parameters

- `user_id` string, required
- `bucket` 'day' | 'week' | 'month'
- `since` string
- `until` string
- `direction` 'sent' | 'received' | 'all'
- `self_payments` 'include' | 'exclude' | 'only'
- `tenant_id` string

## Response `200`

OK

- InternalDeliveryHttpHandlerAdminFulfillmentTimeseriesResponse
  - `bucket` string
  - `data` EnforcerV3InternalDomainFulfillmentTimeseriesBucket[]
    - `bucket` string: Bucket is the period start, RFC3339 date (day/week) or month start.
    - `cancelled_count` integer: Cancelled folds cancelled | declined | expired — ended without payment.
    - `cancelled_notional_uoa` string
    - `received_count` integer
    - `received_notional_uoa` string
    - `sent_count` integer: Sent / Received count every non-cancelled row in the period.
    - `sent_notional_uoa` string
    - `settled_count` integer: Settled is the subset that actually moved money (status = confirmed).
    - `settled_notional_uoa` string
  - `success` boolean
  - `tenant_id` string
  - `user_id` string

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden

---

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