Submit CV + job description for asynchronous matching
POST/api/v1/cvdeepmatch/submit
Submits a CV (PDF) plus a job description and a requirements
configuration. Returns 202 Accepted with an id. Poll
GET /api/v1/cvdeepmatch/{id} for the current status,
or wait for the webhook callback to fire.
Saved-job references
Instead of sending job_description + config inline, you can
reference a job saved in the Jobs catalog:
- At least one of
position_id/job_idis required.position_idis your own key;job_idis the platform id (jobs.id). When both are sent they must resolve to the same saved job (400 INVALID_INPUTotherwise);job_idwins for resolution. job_descriptionandconfigare both-or-neither. Send both to run with inline content (exactly as before), or neither to run with the referenced job's stored content. Sending exactly one returns400 INVALID_INPUT— partial updates go throughPATCH /api/v1/jobs/{jobId}, never the run endpoint.- A reference that resolves to no saved job for your client returns
400 JOB_NOT_FOUND. saveJob: truesaves the inlinejob_description+configto the catalog before running: an existing job under the reference is updated, otherwise a new one is created underposition_id. Ajob_idalone can only update an existing job — it never creates one (400 INVALID_INPUT: useposition_idto create).- Responses on the poll/list endpoints expose the run's
job_idattribution (null for pure inline runs).
File requirements
- Format: PDF only at launch (
application/pdfMIME +.pdfextension). DOCX returnsINVALID_INPUT. - Magic-byte check: the uploaded bytes must start with a
valid PDF header (
%PDF-). Files that pass the extension/MIME gate but fail the magic-byte check returnINVALID_FILE_CONTENT. - Max size: 5 MB.
Webhook URL requirements
- Must use
https://(plain HTTP returnsINSECURE_WEBHOOK_URL). - Must NOT resolve to a private, loopback, or link-local address
(returns
PRIVATE_WEBHOOK_URL). The DNS resolution is re-checked immediately before each delivery attempt to defend against DNS-rebinding.
Idempotency
Pass an idempotency_key to make the submit safe to retry. If
the same key arrives within 24 h the existing id is
returned with HTTP 200 and idempotent_replay: true instead
of a fresh 202.
Required permission
Client's permissions[] must contain cvdeepmatch. Without
it the request returns 403 MISSING_PERMISSION.
Credits
Each successful match deducts credits when the run completes.
At submission time the available balance is checked — submits
from clients with insufficient credits are rejected with 402 INSUFFICIENT_CREDITS.
Request
Responses
- 200
- 202
- 400
- 401
- 402
- 403
- 429
- 500
- 502
Idempotency replay — the supplied idempotency_key was seen
within the last 24 h. The returned id is the
original one; no new match is started.
Request accepted. The match runs asynchronously; poll the status endpoint or wait for the webhook callback.
Validation failure. error.code is one of:
INVALID_INPUT— a field failed validation; per-field detail inerror.details.fields. Also returned when only one ofjob_description/configwas sent (both-or-neither), whenposition_idandjob_idresolve to two different saved jobs, whensaveJobwas requested with an unknownjob_id(a system id never creates), or when asaveJobfailed validation (nothing is saved and no run is started).JOB_NOT_FOUND— the saved-job reference (position_id/job_id, with no inline content) resolved to no saved job for your client. Provide bothconfigandjob_description, or create the job first viaPOST /api/v1/jobs.INVALID_FILE_CONTENT— the uploadedcv_filebytes do not begin with a valid PDF magic header.INSECURE_WEBHOOK_URL—webhook_urlishttp://.PRIVATE_WEBHOOK_URL—webhook_urlresolves to a private / loopback / link-local address.
Missing or invalid API key.
Insufficient credits. The client's available balance is below
the per-match cost. The body carries top-level cost and
availableBalance (both PRE-hold) so you can see the gap
without a separate GET /api/v1/credits call.
Authenticated but missing the cvdeepmatch permission.
Rate-limited. Respect the Retry-After header.
Response Headers
Seconds until the next request will be accepted.
Internal error.
STEP_FUNCTIONS_FAILED — the downstream matching pipeline
failed to start. Retry-safe; resubmit with the same
idempotency_key.