API partenaire v1 · Version préliminaire, pas encore en service

Surveillance

Version préliminaire, pas encore en service. Cette page décrit le contrat v1 proposé pour les partenaires (version 1.0.0-rc.1). Aucun point d’accès décrit ici n’est déployé, et aucune clé d’API ne peut encore être émise.

Un moniteur surveille les modifications apportées à des entrées de listes publiques, à des fiches et à des collections. Il ne conserve jamais le nom, la date de naissance ni le pays d’une personne que vous vérifiez; la nouvelle vérification de vos propres personnes s’effectue donc dans votre propre système.

Pourquoi un moniteur ne conserve pas de personne

Crown Intelligence ne stocke jamais la fiche d’une personne vérifiée. Un moniteur qui surveillerait une personne devrait conserver son nom, sa date de naissance et son pays afin de pouvoir comparer une nouvelle entrée de liste avec ces données. C’est précisément la fiche que la règle interdit. Cette version surveille donc uniquement des cibles publiques, et le lien avec votre propre personne demeure dans votre système.

Création d’un moniteur

La portée requise est monitors:manage. Le corps de la requête comprend un champ customer_ref (votre référence opaque), jusqu’à 50 targets et les changements à signaler dans notify_on. Le schéma est fermé.

  • entity : un identifiant d’entité, par exemple crown-e- suivi d’un UUID. Vous l’obtenez à partir d’un résultat de correspondance.
  • record : un ID de fiche, crown- suivi d’un nombre. Chaque correspondance comprend son record_id.
  • collection : un nom de collection, par exemple sanctions ou peps.
curl https://api.crownintelligence.net/v1/monitors \
  -H "X-Api-Key: $CI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: mon-setup-0001" \
  -d '{"customer_ref": "cust-0042",
       "targets": [{"type": "entity", "id": "crown-e-6f0c2d1e-8a7b-4c39-9d21-5e4b7a10c3f8"}],
       "notify_on": ["listed", "delisted", "amended", "merged"]}'

Un corps de requête contenant un nom, une date de naissance, un pays ou un numéro d’identité est refusé avec le code 400 personal_data_not_accepted. La structure de l’erreur est illustrée ci-dessous; le texte du message est donné à titre indicatif.

{"type":"https://api.crownintelligence.net/problems/personal_data_not_accepted",
 "title":"Personal data is not accepted","status":400,"code":"personal_data_not_accepted",
 "detail":"A monitor stores a customer reference and public targets only.",
 "messages":{"en":"A monitor stores a customer reference and public targets only.",
   "fr":"Un suivi ne conserve qu'une référence client et des cibles publiques."},
 "request_id":"req_01J9Z7..."}

Des événements monitor.hit sont ensuite envoyés à votre webhook lorsqu’une cible surveillée est inscrite, radiée, modifiée ou fusionnée. Consultez la section webhooks.

Nouvelle vérification de vos propres personnes

Lorsqu’un événement survient, vous soumettez de nouveau à la vérification les personnes que vous conservez vous-même. Deux appels permettent de le faire. GET /v1/search avec changed_since ne renvoie que ce qui a changé depuis votre dernière exécution, ce qui limite également la consommation d’unités. POST /v1/match vérifie ensuite chaque sujet à l’aide des renseignements que vous détenez.

curl "https://api.crownintelligence.net/v1/search?changed_since=2026-10-12T00:00:00Z&collection=sanctions&limit=50" \
  -H "X-Api-Key: $CI_API_KEY"
// Runs in YOUR system when a monitor.hit or list.updated event arrives.
// Your subject data never goes to Crown Intelligence except as the query of a match request.
async function rescreenSubjects(subjects, changedSince) {
  // 1. Ask what changed, scoped to the collections you watch.
  const url = "https://api.crownintelligence.net/v1/search?changed_since=" +
    encodeURIComponent(changedSince) + "&collection=sanctions&limit=50";
  const changed = await (await fetch(url, { headers: { "X-Api-Key": process.env.CI_API_KEY } })).json();

  // 2. Re-screen only your own subjects, with your own copy of their details.
  for (const subject of subjects) {
    const body = { queries: [{ query_ref: subject.ref, entity_type: "Person",
                              name: subject.name, dob: subject.dob, country: subject.country }] };
    const res = await fetch("https://api.crownintelligence.net/v1/match", {
      method: "POST",
      headers: { "X-Api-Key": process.env.CI_API_KEY, "Content-Type": "application/json",
                 "Idempotency-Key": "rescreen-" + subject.ref + "-" + changedSince },
      body: JSON.stringify(body)
    });
    // 3. Handle each status as on the matching page: only no_hit_searched is a negative.
  }
  return changed;
}

Crown Intelligence ne voit que la requête de chaque correspondance. Elle en conserve une empreinte à clé, et non le nom.

Points en suspens

  • Surveiller une entrée publique indique à Crown Intelligence que vous vous y intéressez. Cela ne révèle votre sujet à personne. Les conditions des partenaires devraient le préciser.
  • Un partenaire qui conserve ses sujets dans un magasin de données qui appelle Crown Intelligence a, à l’égard de ce magasin, les mêmes obligations que Crown Intelligence à l’égard du sien. Les conditions des partenaires devraient l’indiquer.
  • Des moniteurs conservant des sujets nommés exigeraient une modification de la décision qui les interdit, un magasin distinct et une règle de conservation. Rien de cela n’est prévu dans la v1.

Cette conception suit l’option A de la section 9 de l’ébauche du contrat. L’approbation du responsable est en attente.