Traitement de l'arrière-plan et rappels
On this page
L'analyse d'un dossier de CV ou l'analyse d'une entrevue d'une heure ne devrait pas maintenir une connexion ouverte. Les endpoints asynchrone acceptent les liens ou les téléchargements, répondent immédiatement avec un task_id, et exécutent le travail de notre côté. Ramassez le résultat par sondage ou envoyez-le à votre serveur.
Points d'extrémité de synchronisation
| Point final | Résultats de l'enquête | Résultat |
|---|---|---|
POST /parse/async | Jusqu'à 25 liens CV (file_urls), ou téléchargés files | Un résultat de partage par CV, dans l'ordre, de la même forme que POST /parse/ |
POST /evaluate/async | Jusqu' à 25 liens CV (resume_urls), ou téléchargés resume_pdfs, plus job_details ou job_id | Une évaluation par CV, dans l'ordre, de la même forme que POST /evaluate/ |
POST /summary/async | Un lien d'enregistrement (media_url), ou un fichier media téléchargé; optionnel interview_id et language | transcript_text, transcript_entries et summary |
POST /transcribe/async | Un lien d'enregistrement (media_url), ou un fichier media téléchargé | transcript_text et transcript_entries |
POST /translate/async | text, texts ou des liens vers des documents (file_urls), ou téléchargés files;source_language et target_language | La même forme que POST /translate/ |
Chaque demande d'asynchronisation peut également inclure un callback_url.
| Point final des sondages | Retour |
|---|---|
GET /{op}/tasks/{task_id} | Le statut de la tâche et, une fois terminée, son résultat. {op} est parse,evaluate,summary,transcribe ou translate. |
Envoyer une tâche
Envoyez application/json avec une liste de liens, ou multipart/form-data avec des téléchargements. Dans les multipartements, un champ de lien peut être répété ou envoyé un lien par ligne.
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"}'Pour les demandes JSON à
/translate/async,source_languageest nécessaire. Pour/evaluate/async, envoyez le travail commejob_detailsoujob_id.
Le API répond immédiatement avec 202:
{ "task_id": "…", "status": "queued", "callback_secret": "whsec_…" }callback_secret ne sera retourné que si vous avez envoyé un callback_url. Il est affiché exactement une fois, comme une clé API, alors stockez-le.
Obtenir le résultat
Les sondages
curl https://api.curriculo.me/public/parse/tasks/<task_id> \
-H 'Authorization: Bearer key_abc123_yoursecret'Une tâche est lisible avec la même clé qui l'a créée, que l'appel ait été rendu ou non. La réponse n'inclut jamais l'appel URL ou le secret.
| champs | La signification |
|---|---|
task_id | L'identifiant de la tâche. |
op | Quelle opération la tâche est menée. |
status | queued, processing, succeeded ou failed. |
status_code | L'état de HTTP produit par l'opération elle-même, une fois terminé. |
result | Le corps de réponse de l'opération une fois que status est succeeded;null avant. |
error | Le message d'erreur lorsque la tâche a échoué. |
delivery | Statut de livraison des rappels: not_requested,pending,delivered ou dead, avec le nombre de tentatives. |
created_at, completed_at | Des timestamps. |
Retour d'appels
Si vous avez envoyé un callback_url, la tâche terminée est postée comme application/json avec ces en-têtes:
| Titre | La valeur |
|---|---|
X-Curriculo-Signature | sha256=<hex>: le hexagone minuscule HMAC-SHA256 du corps exact de la demande brute, tablié avec votre callback_secret |
X-Curriculo-Task-Id | Identification de la tâche |
Content-Type | application/json |
Le corps est {task_id, op, status, status_code, result, error, completed_at}.
Il n'y a pas d'en-tête de timestamp, de sorte que les livraisons de déduplication sur task_id: la même tâche peut arriver plus d'une fois si votre serveur répond lentement ou avec une erreur.
Vérifiez la signature
Calculez le HMAC-SHA256 du corps de demande brute, en utilisant votre callback_secret exactement comme retourné (y compris le préfixe whsec_ ) comme clé. Comparer sha256= plus le digeste hexagonal avec X-Curriculo-Signature en temps constant. Utilisez les octets bruts tels qu'ils sont reçus, avant toute analyse JSON, et rejetez tout ce qui ne correspond pas.
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);
}Ensuite, déduplicer sur l'en-tête X-Curriculo-Task-Id (ou task_id dans le corps) et répondre 2xx.
Livraison et réessais
- Toute réponse non
2xxest considérée comme une livraison ratée et les redirections ne sont pas suivies. - Retour à la livraison avec des retards croissants (1, 5, 15 et 60 minutes, puis 4 heures), pendant environ 5 heures et 21 minutes au total, avant la livraison est marquée
dead. - Le résultat reste lisible à
GET /{op}/tasks/{task_id}de toute façon, donc rien n'est perdu pour une livraison manquée.
Exigences pour les adresses URL
Les adresses URL des appels doivent être
https, accessibles au public et ne contenir aucune pièce d'identité. Les adresses sur les réseaux privés sont refusées.
- Les liens que vous envoyez (
file_urls,resume_urls,media_url) doivent être des liens publicshttps. Un lien public ou un stockage URL prédéfini (par exemple S3) fonctionnent tous les deux. - Les liens qui redirigent sont refusés.
- Les enregistrements par lien peuvent être jusqu'à 1 GB et 2 heures. Les fichiers téléchargés sont limités à 12 MB chacun.
Réservation des factures
- Une tâche est facturée une fois, à son résultat final, comme une requête de son opération : une analyse asynchrone de 25 liens coûte $0.01.
- Une tâche qui échoue (un lien mort, un fichier illisible) n'est jamais chargée.
- Les tâches d'enregistrement (
/summary/async,/transcribe/async) se réservent la charge pour un maximum de 2 heures lorsque la tâche est acceptée. Sans suffisamment de crédit pour cette réservation, la demande renvoie400. La réservation est libérée si la tâche échoue.
Voir Prix et facturation.
Données conservées par tâches
Contrairement aux opérations synchrones, une tâche de fond conserve son résultat afin que vous puissiez en procéder à un sondage, et les fichiers téléchargés sont stockés sous votre compte. Voir Traitement des données.
Updated