Documentation développeur

Intégrez le registre de décision en une après-midi.

Scellance scelle les décisions de tri de votre ATS dans un journal infalsifiable, chaîné et horodaté. API REST, SDK JavaScript et Python, sandbox immédiate. Voici tout ce qu'il faut pour brancher votre moteur de matching.

1Démarrage

Trois choses : une URL, une clé, un en-tête. Rien de plus pour la première requête.

ÉlémentValeur
URL de basehttps://demo.scellance.com (migrera vers api.scellance.com)
AuthentificationEn-tête X-API-Key: <votre clé>
VersionnagePréfixe /v1/ sur toutes les routes
FormatJSON (requêtes et réponses)
Sandbox. Un tenant de test isolé de la production est prêt. Clé sandbox : sc_live_7PaL-vwRtQMhFz-_wybkXSOG5ZTjwVsqfF6uqQWkWkw. Tout ce que vous y écrivez est cloisonné et jetable. Pour une clé de production dédiée, contactez-nous.
premiere requete - verifier l acces
curl -s https://demo.scellance.com/v1/chain/verify \
  -H "X-API-Key: sc_live_7PaL-vwRtQMhFz-_wybkXSOG5ZTjwVsqfF6uqQWkWkw"
# -> {"verified": true, "checked": N, ...}  (200)
# sans cle -> 401. Reference interactive complete : /docs (Swagger).

2Le flux en 4 gestes

Scellance ne trie jamais (zéro ML). Votre moteur décide, Scellance greffe. Le principe : sceller la fiche de poste, puis chaque décision qui la cite.

a. Sceller la fiche de poste (avant toute décision)

La grille de critères est figée et horodatée. Toute décision devra référencer cette version exacte.

POST /v1/referentials
{
  "reference": "fiche:{jobId}:v1",
  "content": { "titre": "...", "criteres": [ ... ] }
}
# -> renvoie content_hash + sealed_at. A refaire (v2, v3...) a chaque modif de la grille.

b. Sceller chaque décision de tri

Les explications que votre matching produit déjà deviennent les criteria : chacun DOIT citer sa source dans la fiche (source_ref), sinon l'API refuse (422). Le candidat n'est qu'une référence opaque (RGPD).

POST /v1/events - decision.screening
{
  "event_type": "decision.screening",
  "actor":   { "type":"system", "id":"votre-moteur", "role":"algorithme" },
  "subject": { "candidate_ref": "cand_a1b2c3" },
  "job":     { "job_id":"{jobId}", "referential":"fiche:{jobId}:v1" },
  "outcome": { "decision":"shortlist", "score_total":0.82, "rank":3 },
  "criteria": [
    { "criterion_id":"experience", "source_ref":"fiche:{jobId}:v1#experience",
      "weight":0.3, "score":0.8, "threshold":0.6, "passed":true }
  ]
}

c. Superviser : confirmation ou override humain (AI Act art. 14)

Le recruteur reste décideur. Un override exige un motif (sinon 422) et un acteur humain.

POST /v1/events - decision.human_confirm | decision.human_override
{ "event_type":"decision.human_override",
  "actor":{ "type":"human", "id":"recruteur-07", "role":"recruteur" },
  "subject":{...}, "job":{...},
  "outcome":{ "decision":"rejection", "original_decision":"shortlist", "motif":"..." } }

d. Vérifier l'intégrité

GET /v1/chain/verify
{ "verified": true, "checked": 128 }
# toute alteration d'un evenement passe casse la chaine -> verified:false. Detectable par un tiers.

3Exports d'audit, à la demande

Les livrables que le déployeur (votre client, ou une collectivité) doit produire, générés depuis le journal.

Journal (art. 12)

GET /v1/exports/journal - extrait intégral et ordonné.

Notice de transparence (art. 13)

GET /v1/exports/notice - pré-remplie pour le DPO.

Trame FRIA (art. 27)

GET /v1/exports/fria - sections techniques pré-remplies.

Contrefactuel candidat

GET /v1/candidates/{ref}/counterfactual - droit à l'explication.

4Supervision et webhooks

En mode strict, chaque décision automatique émet un webhook supervision.pending : votre UI affiche une corbeille de validation avant toute notification au candidat.

5Idempotence, erreurs, versions

Le journal est append-only par construction (un déclencheur PostgreSQL interdit UPDATE et DELETE, à tout rôle). L'intégrité ne dépend pas de notre bonne foi : elle se vérifie.

6SDK

Deux SDK sans dépendance, miroir l'un de l'autre. Idempotency-Key gérée nativement.

JavaScript / TypeScript - @scellance/sdk
import { ScellanceClient } from "@scellance/sdk";
const sc = new ScellanceClient(process.env.SCELLANCE_BASE_URL, process.env.SCELLANCE_API_KEY);
await sc.sealReferential(`fiche:${jobId}:v1`, { titre, criteres });
await sc.screening({ candidateRef, jobId, referential, decision:"shortlist",
  criteria:[{ criterionId:"experience", sourceRef:"fiche:...#experience", score:0.8, threshold:0.6, passed:true }] });
const v = await sc.verifyChain();
Python - scellance-sdk
from scellance_sdk import ScellanceClient, Criterion
with ScellanceClient(base_url, api_key) as sc:
    sc.seal_referential("fiche:1024:v1", {"criteres": [...]})
    sc.screening(candidate_ref="cand_42", job_id="job-1", referential="fiche:1024:v1",
        decision="shortlist", criteria=[Criterion("exp", "fiche:1024:v1#exp", score=0.8, threshold=0.6, passed=True)])
    assert sc.verify_chain().verified

Méthodes : sealReferential, screening, humanConfirm, humanOverride, listEvents, verifyChain, pendingSupervision, createWebhook. Distribution PyPI et npm en cours ; en attendant, les SDK sont fournis avec l'accès développeur.

7RGPD by design

Une question, un accès de production, un audit de sécurité ? philippe@prestadev.com. Référence API interactive : /docs.