Skip to main content
Run a write or a large export across many connected users in one asynchronous call. You submit a job, poll its status, and (for exports and writes) download a results file.
Runs a bulk operation across your connected users in one call. Unlike the synchronous reads (Get Bulk Balances, Get Bulk Transactions), submitBulkOperation is asynchronous: it validates the request, creates a job plus one item per target, and returns immediately with a jobId. The work runs in the background — track the job to follow progress and retrieve results.
Available in staging only at this point.
One mutation covers all five operations, selected by the operation field:

Requirements

  • Authorization: Basic <API_KEY>
  • The bulk API capability on your application.
  • The scopes the chosen operation needs, granted by each target user (see the table above). A target missing them becomes a per-item failure — it never fails the whole job.
Every submit must carry an idempdempotencyKey input or anIdempotency-Key` header (if both are sent they must match). Re-submitting the same key returns the original job instead of creating a dequest is byte-for-byte identical; a different request under the same key is rejected. There is no safe default for a fan-out write, so the key is required.

Mutation

A successful submit returns the job in QUEUED status. acceptedItemCount is how many targets will be processed; skippedItemCountd up front (e.g. missing the required scope). Poll the job to watch succeededItemCount/failedItemCount` fill in — see Track a Bulk Job.

Variables — export balances / transactions

exportOptions bounds the window (defaults to the last 90 days; GET_BALANCES_EXPORT is a point-in-time snapshot and ignores tselection](/bulk-api#selecting-target-users) like the reads.

Variables — create transfer

Each item names its own from and to endpoint, so one job can mix directions: operator→user, user→operator, and user→user. An endpoint is either { "operator": true } (your application’s payout account) or { "externalReferenceId": "…" } (a connected user). from and to must differ. The source user’s grant RANSFER_SEND; the destination onlyneeds to be connected. A transfer stays within one sponsor bank. targetSpec` is not required for transfers — participants are taken f

Variables — deposit cash balance

Funds a connected user’s spend account from a payment method they own — exactly one of bankCardId or bankAccountId per own target user, so there’s notargetSpec — the deposit targets are derived from the items (each user at most once). userCashBalanceId is optional (defted/default spend account).

Variables — update transaction metadata

Edits memo and/or transactionCateions. Each item names its own targetuser, so there's no targetSpec— the targets are derived from the items (each user at most once). **At most 100 edits in total** per submission. A field set tonull` clears it; an omitted field is left untouched. Metadata edits execute synchronously — the returned job is already terminal, so you can read per-edit results immediately without polling.

Response

Arguments

Response fields

Failures are per item — one target’s failure never fails the job (see the [per-target failure contract](/bulk-api#per-target-failu itself is only rejected for an authfailure, an invalid operation, a cap exceeded, or when every target is unresolvable. After a terminal status, read per-item detai each write produced — with Track aBulk Job.

Errors

The whole submission is rejected (nohese cases. Everything else becomes a per-item result you read via Track a Bulk Job.