Skip to main content
GET /affiliate/v1/daily-activity returns what your referred users did on a UTC trade date, broken down by plan and then by product. Authentication uses the same API key and secret as the rest of the Kraken REST API. For key setup, see REST Authentication. Requests sign each call and send api-key, api-sign, and api-nonce headers (the signed path includes the query string). The key needs permission to query referrals — see API key permissions. Schemas are in Get Daily Activity.

Shared Python helper

Two ways to call it

Both variants are signed with your own API key. Dates are UTC calendar days (YYYY-MM-DD) and must be today or one of the previous 89 UTC days. A future date or a date older than that window is a 400. An in-window day with no rows is an empty page, not an error.

By day

Give a trade date. You get every referred user who was active that day, is still enrolled, and has not opted out, split by plan and then by product, plus day-wide totals.

By person

Give up to ten full IIBANs that participants have shared, plus an inclusive date range. You get the same per-day entries for just those people — never a range total. Day-wide fields (totals, active_users, revision, estimated, opted_out) are omitted.
Empty, duplicate, or malformed IIBAN tokens are a 400. Validity is a format check only, not account existence. Unattributed, unknown, unenrolled, and opted-out valid IIBANs all return the same empty result. The full identifier is never echoed. Sending both variants on one request is a 400.

Identifying a referred user

Use referee_reference as the join key across days. It is stable for the same referred user under your account, it is not a Kraken account id, and it is not joinable across partners. masked_iiban is the last four characters of the IIBAN. It is not unique. Do not key on it. History responses do not echo which requested IIBAN produced the row — correlate via referee_reference from day-variant results. When multiple requested IIBANs share the same last four characters, masked_iiban cannot disambiguate them. enrolled_at on each plan is truncated to the hour.

Products

One key per product that had activity. The map is open-ended: ignore unknown keys; an absent key means zero. Options is not included. maker and taker appear only on execution products, and only when that side had classified fills. When both are present they sum to the classified portion; headline minus maker minus taker is unclassified. Absence means unclassified, not zero. Instant buy/sell and financing charges have no liquidity side. geo_blocked is present only when that product had blocked-region activity. Blocked events pay zero commission. Parent volume, fees, event_count, and commission cover payable activity only; geo_blocked is an additional breakdown and is not included in those parent figures.

Totals, opt-out, and payments

Day-wide totals include every referred user except those who have opted out. Opted-out users do not appear as full rows; their remainder is opted_out. Unenrolled users are omitted from items, including on old dates, but stay in totals so the headline does not move. They are not counted in opted_out:
  • { "suppressed": {} } when the opted-out group is too small to show, or when there are no opted-out participants
  • { "summary": { "active_participants", "products" } } otherwise
Payable for the day is totals plus summary when summary is present. Daily figures will not match weekly payments exactly:
  • Headlines are payable-only
  • Geo-blocked activity is shown separately and pays zero
  • This endpoint windows on trade date; payments window on insert time

Staleness

A trade day is not sealed. Late events land on their trade date and rewrite that partner’s rows. revision (day variant, first page) is when your figures for that UTC day were last written. A later value on re-fetch means your figures moved. Another partner’s late event does not move this value. Re-check the trailing 35 days. When estimated is true on the first page, amounts for that calendar day are still an estimate, including the opted-out remainder.

Pagination

limit defaults to 50 and rejects values over 200. When next_cursor is present, pass it as cursor on the next request.
  • Day variant cursor: the last item’s referee_reference
  • History variant cursor: YYYY-MM-DD: plus that day’s referee_reference
active_users, totals, revision, estimated, and opted_out are first-page only. An empty totals map on a later page is omission, not a zero day.

Errors

Successful bodies are the object itself. Errors are a non-2xx status with a typed error body. The helper raises KrakenApiError with the parsed body on failure. Throttling is covered in Rate limits.