POST /bulk. You send one request that holds a list of ordinary Admin API calls; Findity runs them one after another and returns one result per call. It’s the way to create or read many items — dimension values, approvers, organizations — without making one HTTP round trip each.
Overview
A bulk request wraps up to 50 calls in one envelope. Each call (a sub-request) is dispatched to its normal endpoint and behaves exactly as if you had called it directly: it is authenticated and authorized against its own target, and it returns its own status code and body. Keep these rules in mind — they shape how you design a batch:- One endpoint per batch. Every sub-request in a batch must call the same endpoint (the same HTTP method and the same action). You can repeat it with different ids, but you can’t mix endpoints.
- Partial success. Sub-requests run in order, and each one commits on its own. A failing sub-request doesn’t roll back or block the others.
- A
200doesn’t mean everything worked. The overall response is200whenever the batch itself is well-formed. Always check each entry’s ownstatus.
Prerequisites
- Complete Authentication and obtain an admin-scoped Bearer token. Every sub-request runs as the caller who made the bulk request, so the token must be allowed to call each target endpoint.
- Know the endpoint you want to batch and its requirements — for example, to create dimension values you need the organization id and the dimension
id.
Key concepts
API endpoints
All bulk requests use the v1 admin host. Examples in this guide use the stage environment — switch to the production host only when you’re ready to go live.Required headers
Include these on the bulk request:Request format
POST /bulk
The body is a JSON object with one required field, requests.
Sub-request fields
Rules for
path and params:
- Put query parameters in
params, not in the path. A path that contains?is rejected. - Percent-encoding and path traversal (
..) in the path are rejected. - A path that points at
/bulkis rejected — you can’t nest a bulk request inside another. - Authentication parameters (such as
authenticationToken) are removed. A sub-request always runs as the caller of the bulk request.
The same-endpoint rule
Every sub-request in a batch must resolve to the same endpoint, matched on the HTTP method and the target action — not on the exact path. That means you can repeat one endpoint with different ids:
If you need to run different operations — for example creating some values and updating others — send one batch per operation.
Response format
The response is a JSON object with aresponses array. It has one entry per sub-request, in the same order as requests.
Two special statuses:
415— the target endpoint returns binary or streamed content (images, PDFs, downloads), which isn’t supported in a batch. Call that endpoint directly instead.500— the sub-request failed to dispatch.
DELETE) comes back with status 204, body null, and no headers:
JSON
ids are not checked for uniqueness: two sub-requests with the same id both run and both come back with that id, so use the index to tell them apart.
A response body larger than the capture limit (10 MB by default) is replaced with { "omitted": true, "reason": "response too large", "contentType": "...", "contentLength": 0 }.
Example 1 — Create dimension values in one request
This batch creates two values on a dimension. Every sub-request is aPOST to the same values endpoint, so the batch is allowed. The organization and the dimension already exist; the path carries their ids.
POST /bulk
cURL
200 OK)
JSON
201 Created status and the created value, exactly as a direct call would return it.
Example 2 — Read several organizations
AGET sub-request takes its query parameters in params. This batch fetches two organizations, including their address and partner sections. The second organization doesn’t exist, which shows partial success.
POST /bulk
cURL
200 OK)
JSON
200 even though the second sub-request returned 404. The first entry’s body is abbreviated here.
Example 3 — Add approvers to dimension values
This batch builds a two-step approval chain on one dimension value: John Doe approves first (level 0), then Carol Park (level 1). Both sub-requests call the same approvers endpoint, so the batch is allowed. The approval section and the two users already exist; sectionItemId is the id of a dimension value.
POST /bulk
cURL
200 OK)
JSON
Handling partial failure
Because each sub-request commits on its own, a batch can succeed in part. Check the result of every entry, not just the overall200:
- Loop over
responsesand read each entry’sstatus. - Match failures back to your requests with the
idyou supplied (or theindex). - Retry or fix only the entries that failed. Don’t resend the whole batch — the sub-requests that succeeded have already been applied, and sending them again can fail (for example, creating a dimension value whose
idalready exists returns409).
body. For example, a duplicate dimension value returns:
JSON
Common integration patterns
Batches larger than 50. A batch holds at most 50 sub-requests. Split a longer list into chunks of 50 and send one bulk request per chunk. One batch per operation. Because a batch can call only one endpoint, a sync that creates, updates, and deletes items needs one batch per operation — for example, one batch ofPOST calls for new dimension values, one of PUT calls for changed values, and one of DELETE calls for removed values.
Reading many items. Use GET sub-requests to fetch several organizations, or several records of the same kind, in one round trip. Send query parameters such as include in params.
Several organizations. The same-endpoint rule is about the endpoint, not the path ids, so one batch can call the same endpoint for several organizations by putting each organization’s id in its sub-request path.
Error handling
A bulk request can fail in two places: the batch as a whole, or an individual sub-request. The batch is rejected. If the batch itself is malformed, the response is400 and no sub-request is run:
JSON
400 and runs nothing. Match on the code: the description is human-readable text that can be translated (stage returned a Swedish message for invalid JSON), and where a sub-request is at fault it names its position (index).
A sub-request fails. The overall response is
200, and the failure is in that entry:

