GET/v1/partner/end_users/{external_id}/transactions

List transactions

Returns a cursor-paginated history of all ledger events for the specified end user across all their portfolios. Includes deposits, withdrawals, yield syncs, harvest events, and fee deductions. Supports both Entra token + user token.

This endpoint is also your recovery path after a dropped connection during a deposit or withdrawal — poll here with the same portfolio_id to confirm whether the on-chain transaction completed. See Pagination for cursor usage.

Path parameters

external_idstringrequired

Your stable identifier for the end user.

Headers

Authorizationstringrequired

Entra M2M access token. Format: Bearer <token>. See Entra authentication.

X-User-Tokenstringoptional

Partner-minted JWT for the end user. Required in user-scoped. The sub claim must equal external_id. See User authentication.

Query parameters

limitnumberoptional

Maximum number of transactions to return. Range 1–100. Default: 25. See Pagination.

starting_afterstringoptional

Cursor for forward pagination — the id of the last transaction from the previous page.

ending_beforestringoptional

Cursor for backward pagination — the id of the first transaction from the current page.

Example request

const baseUrl = process.env.YIELDFORCE_API_BASE_URL ?? 'https://yieldforce.io/api';
 
const res = await fetch(
  `${baseUrl}/v1/partner/end_users/alice-bunq-id/transactions?limit=25`,
  {
    headers: {
      Authorization: `Bearer ${entraToken}`,
      'X-User-Token': partnerJwt,
    },
  }
);
const data = await res.json();

Response

200 Paginated list of transactions (newest first)

{
  "data": [
    {
      "id": "txn_01HZ4KXQM5E8WRTYN3P7VBJD6F",
      "portfolio_id": "jar_01HZ4KXQM5E8WRTYN3P7VBJD6F",
      "type": "deposit",
      "amount_changed": "10000000",
      "yield_delta": "0",
      "deposited_amount_before": "0",
      "deposited_amount_after": "10000000",
      "yield_earned_before": "0",
      "yield_earned_after": "0",
      "tx_hash": "0xdeadbeef...1234",
      "fx_rate_usd": 1.0,
      "aave_apy": 0.042,
      "timestamp": "2026-05-20T10:02:00.000Z"
    },
    {
      "id": "txn_01HZ4KXQM5ABCDEF12345678",
      "portfolio_id": "jar_01HZ4KXQM5E8WRTYN3P7VBJD6F",
      "type": "yield_harvest",
      "amount_changed": "42000",
      "yield_delta": "42000",
      "deposited_amount_before": "10000000",
      "deposited_amount_after": "10000000",
      "yield_earned_before": "0",
      "yield_earned_after": "42000",
      "tx_hash": null,
      "fx_rate_usd": 1.0,
      "aave_apy": 0.042,
      "timestamp": "2026-05-20T10:05:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null,
  "prev_cursor": null
}

Transaction types:

typeDescription
depositUser deposited funds into the portfolio
withdrawUser withdrew funds from the portfolio
syncOff-chain yield accounting sync (no on-chain tx)
yield_harvestOn-chain yield harvested and credited to the portfolio
harvest_feeProtocol fee deducted from harvested yield

All amount fields are strings in token minor units. tx_hash is null for off-chain accounting events.

Use this endpoint to recover after a dropped deposit/withdraw connection

If your HTTP connection drops during a deposit or withdrawal, the on-chain transaction may still complete. Poll this endpoint filtering by portfolio_id in your own code — the most recent transaction of type deposit or withdraw will confirm the operation. Retry the original money-flow call with the same Idempotency-Key to get the response if the server still has it cached.

Errors

401 token_missing — No Authorization: Bearer header on the request.

401 invalid_entra_token — Token is expired, malformed, or has an unexpected audience.

401 invalid_user_token — The X-User-Token failed signature verification or is expired.

403 sub_url_mismatch — The sub claim in X-User-Token does not match external_id in the URL.

404 end_user_not_found — No user with this external_id exists in your tenant.