Ingestion Semantics
How the Partner API fetches, validates, dedupes, and processes documents.
Both Resume imports and Job Match candidate uploads share one ingestion pipeline. Understanding it explains the validation errors and the dedup behavior you'll see.
File vs URL
Every document can be supplied two ways:
- Multipart file — send the bytes directly as a
file(orfiles) part. The part must carry a correctContent-Type; an empty type is rejected with415. - URL — send a URL and Talentino fetches it server-side.
You can mix files and URLs freely in the bulk and Job Match endpoints.
Validation limits
These mirror the in-app upload flow exactly:
- Size: max 5 MB per document. Oversized documents return
413. The cap is enforced on the actual streamed bytes — a lyingContent-Lengthwon't get past it. - Type: the allowlist is
pdf,doc,docx,png,jpeg,jpg. Anything else returns415. (Images are allowed because the in-app resume dropzone allows them.)
URL fetching & SSRF protection
Server-side URL fetches are guarded:
- Only
http/httpsURLs; embedded credentials are rejected. - The host is resolved and every resulting address is checked — private, loopback, link-local, and metadata ranges are blocked (e.g.
127.0.0.1,10.0.0.0/8,169.254.169.254, IPv6::1/fc00::/7, IPv4-mapped forms, and decimal/hex-obfuscated literals). - Redirects are followed up to a limit, and every hop is re-validated before it's fetched.
- A 30-second timeout applies.
- A fetch failure (DNS, timeout, blocked address, bad response) surfaces as
502.
Deduplication
Talentino computes a SHA-256 content hash of each document:
- Within a single request (bulk / Job Match), an identical document is accepted once; later copies in the same batch are reported as in-batch duplicates.
- Across requests, a previously-seen document returns
409— but this cross-request dedup runs on production stages only. On dev/testing stages duplicates pass through.
Straight-through processing
For Resume imports, the Import Activity drives what happens next:
- No
import_activity_idsupplied → Talentino auto-creates avalidateddisk Import Activity. Because it's alreadyvalidated, the pipeline's deep-processing phase runs immediately — there's noawaiting_validationpause. import_activity_idsupplied → the Resume is linked to that Import Activity (which must belong to your Business Unit, else404). The processing machine is triggered without changing the activity's status; anawaiting_validationactivity will shallow-process the new Resume and pause again, preserving in-app semantics.
Credits
Ingestion verifies credits up front. If your Business Unit lacks enough credits for the requested work, the request is rejected with 402 before any document is processed.
Billable Action Types are process_resume, process_job_requirements, score_resume, and request_info — the billable act of requesting additional information from a candidate by email (1 credit). See the Credit API for how services reserve and settle credits.
Partial success (bulk & Job Match)
The batch endpoints don't fail the whole request when one document is bad:
- Each item gets an entry with
status: "accepted"(carrying itsresume_id) orstatus: "failed"(carrying anerrormessage), returned in input order. - A
summaryreports{ total, accepted, failed }. - HTTP status is
201when at least one item is accepted, or422when all items failed.
See the reference for the exact item shape.