API para agentes de IA
Todas as rotas de /api/v1. A chave (Authorization: Bearer cpv_...) é opcional, menos nas rotas da conta. A especificação completa está em /api/v1/openapi.json
GET/api/v1/applications
200 The applications with a job, in board order · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/applications
application/jsonjobIdstringcompany* stringtitle* stringjobUrlstring
200 The application, at "Quero me candidatar" · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/ats
ATS score of a resume, optionally against a job
application/jsonresumeText* stringjobstringlanguagept-BR | en | es | fr | de | it
multipart/form-datafilefilejobstringlanguagept-BR | en | es | fr | de | it
200 The score, its categories and its checks · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
GET/api/v1/coupons/validate
Parâmetros: code (query, *) · sku (query)
200 Whether the coupon applies, and the price with it · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/device-codes
Starts the CLI's login
200 The code the person confirms on the site · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/device-codes/token
Asked every 3 seconds until the person allows the CLI
application/jsondeviceCode* string
200 Pending, or the key – shown this once · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/events
application/jsonevent* extension_installed | extension_opened | extension_actiondistinctId* stringactionstringdomainstring
200 Sent to PostHog when it is configured · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
GET/api/v1/gifts/{code}
Parâmetros: code (path, *)
200 The gift: product, names, message and state · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/gifts/{code}/redeem
Redeems a gift into the key owner's account
Parâmetros: code (path, *)
200 What the gift became · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/handoffs
application/jsonkindjob | resume_text | linkedin_profile | screenshotspayloadobject
200 The code, valid for 15 minutes · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
PATCH/api/v1/handoffs/{code}
Parâmetros: code (path, *)
application/jsonemailstringphonestringcitystring
200 The profile with what was completed (RF-M13-009) · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
GET/api/v1/health
200 Up, with the deployed commit · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/interviews
Creates an interview preparation session and returns its page in the panel
application/jsonjob* stringresumeIdstringstagescreening | technical | finalinterviewAtstring
200 The session, being prepared · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/jobs
application/jsonsourceextensionurlstring | nulltextstring
200 The job, ready or still being read · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
GET/api/v1/jobs/{id}
Parâmetros: id (path, *)
200 The job and its extraction · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
DELETE/api/v1/keys/self
200 The key no longer works · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
GET/api/v1/keys/self
Who the key belongs to (`cpv whoami`)
200 The key's owner · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/match
Match score, potential and improvement plan for a job
application/jsonjobIdstringresumeIdstringresumeTextstring
multipart/form-datajobId* stringfilefile
200 The match report: score, potential and plan · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
GET/api/v1/match/{id}
Parâmetros: id (path, *)
200 A match report, while it is made · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
GET/api/v1/orders
The key owner's orders, newest first (`cpv order list`)
200 The orders · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/orders
Creates an order and returns the PIX and the order page; never pays
application/jsonsku* tailor | tailor_batch | create_resume | cover_letter | linkedin | linkedin_resume | kit | photoemail* stringname* stringcpfstringphonestringlanguagept-BR | en | es | fr | de | itgoalmore_interviews | career_change | first_job | level_upjobstring | string[]resumeFilefileresumeTextstringphotoFilefilephotoProfessionstringcouponstringgiftstringgiftRecipientEmailstringgiftRecipientNamestringgiftMessagestringparentOrderIdstringoptionsstring
multipart/form-datasku* tailor | tailor_batch | create_resume | cover_letter | linkedin | linkedin_resume | kit | photoemail* stringname* stringcpfstringphonestringlanguagept-BR | en | es | fr | de | itgoalmore_interviews | career_change | first_job | level_upjobstring | string[]resumeFilefileresumeTextstringphotoFilefilephotoProfessionstringcouponstringgiftstringgiftRecipientEmailstringgiftRecipientNamestringgiftMessagestringparentOrderIdstringoptionsstring
200 The order, waiting for a person to pay · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
GET/api/v1/orders/{id}
The whole order: status, step, deliveries, scores and files
Parâmetros: id (path, *)
200 The order · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
GET/api/v1/orders/{id}/events
NDJSON of the order's changes until a final status or 30 minutes
Parâmetros: id (path, *)
200 application/x-ndjson: one JSON object per line, one line per change
GET/api/v1/orders/{id}/files/{fileId}
Downloads a file of the order
Parâmetros: id (path, *) · fileId (path, *)
302 To the file's signed link, good for 5 minutes · 404 not_found
POST/api/v1/orders/{id}/regenerate-photo
One more photo of a style, up to 3 per order (RF-M08-001)
Parâmetros: id (path, *)
application/jsonstyle* corporativo | linkedin | startup | criativoprofessionstring
200 The photo order's view · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/orders/{id}/resend-email
Sends the delivery e-mail again (at most 3 per order)
Parâmetros: id (path, *)
200 Sent · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/orders/{id}/retailor
A retailoring of a tailored resume for a new job (R$ 3,40)
Parâmetros: id (path, *)
application/jsonjob* stringcouponstringpaymentMethodpix | card
200 The retailoring order, waiting for a person to pay · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
GET/api/v1/resumes
200 The account's resumes · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
GET/api/v1/resumes/{id}
Parâmetros: id (path, *)
200 A resume · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/screening
application/jsonjobId* stringresumeId* stringitems* object[]
200 Each question with its answer or needsUserInfo · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/screening/{id}/info
Parâmetros: id (path, *)
application/jsonvalue* string
200 The question answered with what the person said · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/support
application/jsonname* stringemail* stringmessage* stringorderIdstring
200 The ticket · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/uploads
application/jsonpurpose* resume | resume_screenshot | linkedin_file | selfie | job_screenshot | resume_photocontentType* application/pdf | application/vnd.openxmlformats-officedocument.wordprocessingml.document | text/plain | image/jpeg | image/png | image/webpsizeBytes* integeroriginalNamestring
200 The signed URL to PUT the file to, for 120 s · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
POST/api/v1/uploads/{fileId}/confirm
Parâmetros: fileId (path, *)
200 The file, checked · 400 invalid_input · 401 unauthorized · 404 not_found · 429 rate_limited or quota_exceeded
Os erros saem sempre num objeto error, com code, message, hint e retryAfterMs, e o status HTTP do código.
