batch_id immediately; each profile is processed independently and
delivers its own webhook.
The scan mode is selected by the path you call — every profile in the
batch runs in that mode:
| Mode | Endpoint | Behaviour |
|---|---|---|
| Deep | POST /api/v2/batch/deep | Full analysis per profile. Each scan typically completes in under two minutes. |
| Quick | POST /api/v2/batch/quick | Cheaper and faster per profile — skips link traversal, social-media scraping, and external context search. Each scan typically completes in about 30 seconds. |
scan_mode field echoes which one ran). See
Scan modes for the full
comparison.
Request body
Array of creator profile URLs. Each URL must be a valid HTTP or
HTTPS URL.
HTTPS endpoint Tumban will
POST each result to as profiles
complete. Optional: if omitted, Tumban falls back to the
organization’s default_callback_url.
If neither is set, the batch still runs and individual scans can be
polled via GET /api/v2/scans/{scan_id} — no
webhooks are sent.Arbitrary JSON object applied to every profile in the batch. Echoed
back on each per-profile webhook payload.
Response
UUID of the batch. Use it to fetch aggregate progress via
GET /api/v2/batches/{batch_id}.Always
processing on submission. See
Status values.Count of profiles accepted in the batch.
ISO 8601 UTC timestamp of when Tumban accepted the batch.
ISO 8601 UTC timestamp of the expected completion time. Scales
roughly linearly with batch size at the deployment’s concurrency
cap.
Which mode ran for every profile in the batch:
deep or quick.
Echoes the endpoint you called.Present and
true only when the batch was partially accepted because
the org’s daily_scan_limit had remaining capacity for fewer profiles
than were requested. Absent (or null) when every submitted URL was
accepted.Present only when
daily_limit_truncated is true. The number of
trailing profile URLs from the request that were not queued for
scanning. The first total_profiles URLs (in submission order) were
accepted; the last profiles_skipped URLs were dropped. Resubmit the
remainder after the daily limit window resets (00:00 UTC).Example
/api/v2/batch/quick with the same
body. The response is identical except scan_mode is "quick".
The batch’s
scan_ids are not returned in the response. Read each
per-profile result via the webhook callback or by querying
GET /api/v2/batches/{batch_id} for
aggregate progress.Example — partial acceptance
When the org’sdaily_scan_limit has capacity for fewer profiles than
were requested, the batch is accepted with the leading N profiles only
and the response sets daily_limit_truncated and profiles_skipped.
Worked example. Submit 50 URLs with 30 remaining in the daily
quota → the first 30 URLs (in submission order) are queued; the
last 20 are dropped:
total_profiles is the count actually queued (30), not the count
submitted (50). To recover the skipped URLs, take the last
profiles_skipped entries from your original profile_urls array — in
the same order — and resubmit them after the next daily window opens at
00:00 UTC.
Errors
| Status | Detail |
|---|---|
| 422 | Body failed schema validation — typically a malformed URL in profile_urls. See Errors → validation. |
| 429 | The org’s daily_scan_limit is fully exhausted (no remaining capacity for even one profile). Body is structured: {"error": "daily_scan_limit_exceeded", "limit": N, "used": N}. See Rate limits. A partially-fillable batch returns 200 with daily_limit_truncated instead — see above. |

