Skip to content

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 finalRésultats de l'enquêteRésultat
POST /parse/asyncJusqu'à 25 liens CV (file_urls), ou téléchargés filesUn résultat de partage par CV, dans l'ordre, de la même forme que POST /parse/
POST /evaluate/asyncJusqu' à 25 liens CV (resume_urls), ou téléchargés resume_pdfs, plus job_details ou job_idUne évaluation par CV, dans l'ordre, de la même forme que POST /evaluate/
POST /summary/asyncUn lien d'enregistrement (media_url), ou un fichier media téléchargé; optionnel interview_id et languagetranscript_text, transcript_entries et summary
POST /transcribe/asyncUn lien d'enregistrement (media_url), ou un fichier media téléchargétranscript_text et transcript_entries
POST /translate/asynctext, texts ou des liens vers des documents (file_urls), ou téléchargés files;source_language et target_languageLa même forme que POST /translate/

Chaque demande d'asynchronisation peut également inclure un callback_url.

Point final des sondagesRetour
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_language est nécessaire. Pour /evaluate/async, envoyez le travail comme job_details ou job_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.

champsLa signification
task_idL'identifiant de la tâche.
opQuelle opération la tâche est menée.
statusqueued, processing, succeeded ou failed.
status_codeL'état de HTTP produit par l'opération elle-même, une fois terminé.
resultLe corps de réponse de l'opération une fois que status est succeeded;null avant.
errorLe message d'erreur lorsque la tâche a échoué.
deliveryStatut de livraison des rappels: not_requested,pending,delivered ou dead, avec le nombre de tentatives.
created_at, completed_atDes 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:

TitreLa valeur
X-Curriculo-Signaturesha256=<hex>: le hexagone minuscule HMAC-SHA256 du corps exact de la demande brute, tablié avec votre callback_secret
X-Curriculo-Task-IdIdentification de la tâche
Content-Typeapplication/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 non2xx est 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 publics https . 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 renvoie 400. 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