Aller au contenu

API partenaire

L'indice de citation de vos clients, dans vos propres outils

L'API partenaire est en lecture seule : elle sert les mêmes données que le tableau de bord — sites, historique de l'indice, audits, export CSV — pour que votre reporting et le nôtre ne puissent jamais se contredire. Elle fait partie de l'offre Agence.

Authentification

Chaque requête porte votre clé dans l'en-tête X-Api-Key. Les clés se créent dans Paramètres → API (jusqu'à cinq clés actives), commencent par ck_live_ et ne sont affichées qu'une fois — nous n'en stockons qu'une empreinte. Une clé absente, inconnue, révoquée ou portée par une offre sans accès API reçoit la même réponse 401, sans distinction : une clé ne doit pas être sondable.

curl -H "X-Api-Key: ck_live_votre_cle" \
  https://api.citezmoi.com/api/v1/partner/sites

Les quatre lectures

GET/partner/sites

Vos sites suivis, du plus récent au plus ancien, avec le dernier indice de citation (0 à 100) de chacun. latest_score est nul tant qu'aucun audit n'est terminé.

{
  "items": [
    {
      "id": "0b0e8a52-…",
      "url": "https://cabinet-durand-lyon.com",
      "domain": "cabinet-durand-lyon.com",
      "brand_name": "Cabinet Durand",
      "city": "Lyon",
      "sector_label": "Expert-comptable",
      "latest_score": 47,
      "latest_audit_id": "9f2c11d0-…",
      "tracking_active": true,
      "created_at": "2026-09-02T09:14:00Z"
    }
  ],
  "total": 1
}

GET/partner/sites/{site_id}/score-history

L'indice d'un site dans le temps, du plus ancien au plus récent (limit : 52 par défaut, 520 au plus), avec les correctifs marqués « fait » en événements datés. Les points récents portent aussi subscores et le détail par surface dans engines.

curl -H "X-Api-Key: ck_live_votre_cle" \
  "https://api.citezmoi.com/api/v1/partner/sites/{site_id}/score-history?limit=52"
{
  "site_id": "0b0e8a52-…",
  "points": [
    { "captured_at": "2026-09-07T06:00:00Z", "score": 44, "audit_id": "…" },
    { "captured_at": "2026-09-14T06:00:00Z", "score": 47, "audit_id": "…" }
  ],
  "events": [
    { "at": "2026-09-10T15:22:00Z", "label": "Page « équipe » avec vos experts nommés" }
  ]
}

GET/partner/audits/{audit_id}

L'état d'un audit et son indice. access_token ouvre la page publique du rapport (https://www.citezmoi.com/a/{access_token}) — le lien à transmettre à votre client.

curl -H "X-Api-Key: ck_live_votre_cle" \
  https://api.citezmoi.com/api/v1/partner/audits/{audit_id}
{
  "id": "9f2c11d0-…",
  "status": "ready",
  "tier": "tracked",
  "score": 47,
  "engines_failed": [],
  "access_token": "…",
  "created_at": "2026-09-14T05:58:00Z",
  "generated_at": "2026-09-14T06:01:12Z"
}

GET/partner/audits/{audit_id}/export

Le même export CSV que le tableau de bord : point-virgule comme séparateur, BOM UTF-8 pour Excel. Répond 409 tant que l'audit n'est pas terminé.

curl -H "X-Api-Key: ck_live_votre_cle" \
  -o audit.csv https://api.citezmoi.com/api/v1/partner/audits/{audit_id}/export

Webhooks

Un endpoint HTTPS par organisation, enregistré dans Paramètres → API. Deux événements existent : audit.ready (un audit vient de se terminer) et score.drop (l'indice d'un site suivi a nettement baissé d'une semaine sur l'autre). Vous pouvez n'écouter qu'un sous-ensemble ; ne rien choisir signifie « tout recevoir », y compris les événements ajoutés plus tard.

POST https://votre-endpoint.example.com/citezmoi
Content-Type: application/json
User-Agent: CitezMoi-Webhooks/1.0
X-CitezMoi-Event: audit.ready
X-CitezMoi-Signature: sha256=3f1a…

{"event":"audit.ready","created_at":"2026-09-14T06:01:13+00:00","data":{
  "audit_id":"9f2c11d0-…","site_id":"0b0e8a52-…",
  "domain":"cabinet-durand-lyon.com","score":47,"tier":"tracked",
  "report_url":"https://www.citezmoi.com/a/…"}}
{"event":"score.drop","created_at":"…","data":{
  "site_id":"0b0e8a52-…","domain":"cabinet-durand-lyon.com",
  "score":39,"previous":47,"delta":-8}}

Vérifier la signature

Chaque livraison est signée HMAC-SHA256 avec le secret montré une seule fois à l'enregistrement de l'endpoint : X-CitezMoi-Signature vaut sha256=<hex>, calculé sur les octets exacts du corps reçu. Vérifiez avant de re-sérialiser le JSON — un JSON ré-encodé ne redonne pas les mêmes octets.

import hashlib
import hmac

def verify(secret: str, raw_body: bytes, header: str) -> bool:
    expected = "sha256=" + hmac.new(
        secret.encode("utf-8"), raw_body, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, header)
import { createHmac, timingSafeEqual } from "node:crypto";

export function verify(secret, rawBody, header) {
  const expected =
    "sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
  return (
    header.length === expected.length &&
    timingSafeEqual(Buffer.from(header), Buffer.from(expected))
  );
}

Livraison, accusé et relances

Depuis votre assistant IA (MCP)

La même clé ouvre un serveur Model Context Protocol : votre assistant (Claude Code, ou tout client MCP qui parle le transport HTTP) interroge vos sites en langage naturel — « quels clients ont perdu des points cette semaine ? » — avec la même portée en lecture seule que l'API. Transport HTTP, clé dans X-Api-Key ou en Authorization: Bearer.

claude mcp add --transport http citezmoi https://api.citezmoi.com/api/v1/partner/mcp \
  --header "X-Api-Key: ck_live_votre_cle"
{
  "mcpServers": {
    "citezmoi": {
      "type": "http",
      "url": "https://api.citezmoi.com/api/v1/partner/mcp",
      "headers": { "X-Api-Key": "${CITEZMOI_API_KEY}" }
    }
  }
}

Commencer

L'accès API est inclus dans l'offre Agence. Créez une clé dans votre espace, ou comparez les offres.