Processamento em segundo plano e retornos de chamada
On this page
Parser um lote de currículos ou analisar uma entrevista de uma hora não deve manter uma conexão aberta. Os endpoints assíncronos aceitam links ou uploads, respondem imediatamente com um task_ide executam o trabalho em nosso lado. Coletar o resultado por polling ou recebê-lo em seu servidor.
Endpoints assíncronos
| Ponto de extremidade | Entrada | Resultado |
|---|---|---|
POST /parse/async | Até 25 CV links (file_urls), ou carregados files | Um resultado de parse por CV, em ordem, mesma forma que POST /parse/ |
POST /evaluate/async | Até 25 CV links (resume_urls), ou carregados resume_pdfs, mais job_details ou job_id | Uma avaliação por CV, em ordem, mesma forma que POST /evaluate/ |
POST /summary/async | Um link de gravação (media_url), ou um arquivo media carregado; opcional interview_id e language | transcript_text, transcript_entries e summary |
POST /transcribe/async | Um link de gravação (media_url), ou um arquivo media carregado | transcript_text e transcript_entries |
POST /translate/async | text, texts ou links de documentos (file_urls), ou filescarregado;source_language e target_language | Mesma forma que POST /translate/ |
Cada solicitação assíncrona também pode incluir um callback_url.
| Ponto de extremidade de polling | Retorna |
|---|---|
GET /{op}/tasks/{task_id} | O status da tarefa e, uma vez concluída, seu resultado. {op} é parse,evaluate,summary,transcribe ou translate. |
Envio de tarefa
Envie application/json com uma lista de links ou multipart/form-data com uploads. Em multipart, um campo de link pode ser repetido ou enviado um link por linha.
curl -X POST https://api.curriculo.me/public/parse/async \
-H 'Authorization: Bearer key_abc123_yoursecret' \
-H 'Content-Type: application/json' \
-d '{"file_urls": ["https://example.com/cvs/candidate_a.pdf", "https://example.com/cvs/candidate_b.pdf"], "callback_url": "https://example.com/curriculo/callback"}'curl -X POST https://api.curriculo.me/public/summary/async \
-H 'Authorization: Bearer key_abc123_yoursecret' \
-H 'Content-Type: application/json' \
-d '{"media_url": "https://example.com/interviews/interview.mp4", "interview_id": "int_0042", "language": "ko"}'curl -X POST https://api.curriculo.me/public/translate/async \
-H 'Authorization: Bearer key_abc123_yoursecret' \
-H 'Content-Type: application/json' \
-d '{"texts": ["Senior backend engineer", "Remote within Europe"], "source_language": "en", "target_language": "fr"}'Para requisições de JSON para
/translate/async,source_languageé obrigatório. Para/evaluate/async, envie o trabalho comojob_detailsoujob_id.
O API responde de uma vez com 202:
{ "task_id": "…", "status": "queued", "callback_secret": "whsec_…" }callback_secret é retornado apenas quando você enviou um callback_url. É exibido exatamente uma vez, como uma chave API, então armazene-o.
Obtendo o resultado
Polling
curl https://api.curriculo.me/public/parse/tasks/<task_id> \
-H 'Authorization: Bearer key_abc123_yoursecret'Uma tarefa é legível com a mesma chave que a criou, independentemente de um callback ter sido entregue. A resposta nunca inclui o callback URL ou segredo.
| Campo | Significado |
|---|---|
task_id | O id da tarefa. |
op | Qual operação a tarefa executa. |
status | queued, processing, succeeded ou failed. |
status_code | O status da operação em si, uma vez concluída, produzido pela HTTP. |
result | O corpo da resposta da operação, uma vez que status é succeeded;null anteriormente. |
error | A mensagem de erro quando a tarefa falhou. |
delivery | Status de entrega de callback: not_requested,pending,delivered ou dead, com a contagem de tentativas. |
created_at, completed_at | Carimbos de data e hora. |
Retornos de Chamada
Se você enviou uma callback_url, a tarefa concluída é POSTada lá como application/json com estes cabeçalhos:
| Cabeçalho | Valor |
|---|---|
X-Curriculo-Signature | sha256=<hex>: o hexadecimal em minúsculas HMAC-SHA256 do corpo da solicitação bruta exata, chaveada com o seu callback_secret |
X-Curriculo-Task-Id | O id da tarefa |
Content-Type | application/json |
O corpo é {task_id, op, status, status_code, result, error, completed_at}.
Não há cabeçalho de carimbo de data/hora, portanto, deduplicar entregas em task_id: a mesma tarefa pode chegar mais de uma vez se o servidor respondeu lentamente ou com um erro.
Verificar a assinatura
Calcular o HMAC-SHA256 do corpo da solicitação bruta, usando sua callback_secret exatamente como retornado (incluindo o prefixo whsec_ ) como a chave. Comparar sha256= mais o resumo hexadecimal em minúsculas com X-Curriculo-Signature em tempo constante. Usar os bytes brutos como recebidos, antes de qualquer análise JSON, e rejeitar qualquer coisa que não corresponda.
Python:
import hashlib
import hmac
def is_valid(raw_body: bytes, signature_header: str, callback_secret: str) -> bool:
# callback_secret is used as-is, including the "whsec_" prefix
expected = "sha256=" + hmac.new(
callback_secret.encode(), raw_body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature_header or "")JavaScript (Node.js):
import crypto from "node:crypto";
// rawBody must be the unparsed request body (a Buffer)
export function isValid(rawBody, signatureHeader, callbackSecret) {
const expected =
"sha256=" +
crypto.createHmac("sha256", callbackSecret).update(rawBody).digest("hex");
const a = Buffer.from(expected);
const b = Buffer.from(signatureHeader || "");
return a.length === b.length && crypto.timingSafeEqual(a, b);
}Em seguida, deduplicar no cabeçalho X-Curriculo-Task-Id (ou task_id no corpo) e responder 2xx.
Entrega e reenvios
- Qualquer resposta não-
2xxé considerada uma entrega falha, e redirecionamentos não são seguidos. - Reenvios de entrega com atrasos crescentes (1, 5, 15 e 60 minutos, então 4 horas), por cerca de 5 horas e 21 minutos no total, antes que a entrega seja marcada
dead. - O resultado permanece legível em
GET /{op}/tasks/{task_id}de qualquer forma, portanto, nada se perde devido a uma entrega perdida.
Requisitos para URLs
Os URLs de callback devem ser
https, acessíveis publicamente e não devem conter credenciais. Endereços em redes privadas são recusados.
- Os links que você envia (
file_urls,resume_urls,media_url) devem ser links públicoshttps. Um link público ou um armazenamento pré-assinado URL (por exemplo S3) também funcionam. - Links que redirecionam são recusados.
- Gravações por link podem ter até 1 GB e 2 horas. Arquivos carregados são limitados a 12 MB cada.
Faturamento
- Uma tarefa é cobrada uma vez, em seu resultado final, como uma solicitação de sua operação: uma análise assíncrona de 25 links custa $0.01.
- Uma tarefa que falha (um link morto, um arquivo ilegível) nunca é cobrada.
- Tarefas de gravação (
/summary/async,/transcribe/async) reservam a cobrança para o máximo de 2 horas quando a tarefa é aceita. Sem crédito suficiente para essa reserva, a solicitação retorna400. A reserva é liberada se a tarefa falhar.
Consulte Preços e cobrança.
Dados mantidos pelas tarefas
Ao contrário das operações síncronas, uma tarefa em segundo plano mantém seu resultado para que você possa pesquisá-lo, e arquivos carregados são armazenados em sua conta. Consulte Manipulação de dados.
Updated