{
  "schema": "consentr-export-v1",
  "exported_at": "2026-10-04T06:43:49.865Z",
  "dictionary": "https://consentr.nanocorp.app/blog/preuve-consentement-rgpd",
  "verification": {
    "hash_algorithm": "SHA-256 (hexadécimal minuscule)",
    "canonicalization": "JSON compact : séparateurs « , » et « : » sans espace, clés triées par point de code Unicode, UTF-8. Pour les types utilisés ici (chaînes, null, tableaux, objets), cette sérialisation est équivalente au JSON canonique JCS (RFC 8785).",
    "consent_hash_rule": "consent_hash = SHA-256(consent_content.canonical_json). Le contenu reconstitué (parties avec e-mail haché, rencontre, périmètre, phrase de révocabilité) est inclus ci-dessus : l'empreinte se recalcule hors de Consentr.",
    "event_hash_rule": "event_hash = SHA-256(sérialisation canonique de { action, agreement_id, event_id, occurred_at_utc, party_role, payload_hash, previous_event_hash, trace }). Tous les champs sont présents dans l'export.",
    "payload_hash_rule": "payload_hash = SHA-256(sérialisation canonique de { action, payload }). Pour les événements dont payload est présent dans l'export, l'empreinte se recalcule.",
    "first_event_rule": "Le premier événement d'un accord porte previous_event_hash = null ; chaque événement suivant porte l'event_hash du précédent (chaînage).",
    "email_hash_rule": "email_sha256 = SHA-256 de l'adresse e-mail telle qu'enregistrée : espaces de début/fin retirés, minuscules, 254 caractères maximum. Aucune autre normalisation.",
    "signature_hash_rule": "signature_sha256 = SHA-256 du texte de signature tel qu'enregistré : espaces de début/fin retirés, fins de ligne CRLF ramenées à LF, 160 caractères maximum.",
    "time_reference_rule": "occurred_at (écriture serveur) fait foi pour l'ordre des événements du journal ; signed_at est l'instant du geste déclaré dans l'accord. Un écart de quelques centaines de millisecondes entre les deux est normal (latence d'écriture).",
    "trace_hash_rule": "trace.ip_hash et trace.user_agent_hash = SHA-256(salt + valeur) tronquée à 24 caractères hexadécimaux : le sel est un secret serveur, jamais inclus dans l'export. Un tiers peut vérifier l'homogénéité (même valeur → même empreinte), pas la valeur elle-même. Les événements antérieurs au 2026-10-04 utilisent SHA-256(valeur) non salée.",
    "payload_retention_note": "Les événements antérieurs au 2026-10-03 ne conservent pas leur payload (payload_hash tient lieu d'engagement au moment de l'écriture). Les événements postérieurs incluent leur payload.",
    "reference_verifier": "https://consentr.nanocorp.app/consentr-export-verify.mjs"
  },
  "agreement": {
    "public_id": "CNSTR-F6BF-50D0-5A85",
    "agreement_id": "2fddd628-499b-469a-b1c3-7e5f15f241fc",
    "status": "active",
    "integrity_verified": true,
    "consent_version": "consentr-proof-v1",
    "consent_hash": "e41da7277a974b96419e33b2ca7e3e4d1c2231e23fee74224a164d07b6d51081",
    "created_at": "2026-10-03T06:46:01.349Z",
    "updated_at": "2026-10-03T06:46:03.138Z",
    "meeting_moment": "Samedi 17 octobre 2026, 19h30",
    "meeting_context": "Accord de test fictif : dîner et visite d'exposition. Aucune personne réelle. Créé le 2026-10-03 comme échantillon d'export pour vérification indépendante par un tiers.",
    "consent_scope": "Limites précisées par Anouk : pas de partage de photos, retour avant 23h.",
    "consent_scope_items": [
      {
        "id": "meet_in_person",
        "label": "Se rencontrer en personne dans le contexte décrit"
      },
      {
        "id": "conversation_topics",
        "label": "Échanger sur les sujets explicitement mentionnés dans les limites"
      }
    ],
    "consent_scope_rule": "Le consentement porte sur l'ensemble des items listés ; tout retrait vaut pour l'ensemble des items.",
    "record_holder": {
      "name": "Consentr",
      "role": "Dépositaire du registre : Consentr héberge et conserve l'acte de consentement pour les deux parties, sans en être partie.",
      "contact": "consentr@nanocorp.app"
    },
    "party_a": {
      "name": "Anouk Exemple",
      "email": "anouk.exemple@example.fr",
      "signed_at": "2026-10-03T06:46:01.926Z",
      "signature": "Anouk Exemple",
      "revoked_at": null,
      "revocation_reason": null
    },
    "party_b": {
      "name": "Basile Exemple",
      "email": "basile.exemple@example.fr",
      "signed_at": "2026-10-03T06:46:03.138Z",
      "signature": "Basile Exemple",
      "revoked_at": null,
      "revocation_reason": null
    },
    "minimisation_note": "L'adresse e-mail de chaque partie est visible dans l'export des deux côtés : c'est voulu, la preuve étant bilatérale (chaque partie doit pouvoir identifier l'acte et son vis-à-vis). Aucune autre donnée personnelle n'est exportée."
  },
  "consent_content": {
    "payload": {
      "schema_version": "consentr-proof-v1",
      "consent_id": "CNSTR-F6BF-50D0-5A85",
      "created_at_utc": "2026-10-03T06:46:01.349Z",
      "parties": [
        {
          "role": "party_a",
          "display_name": "Anouk Exemple",
          "email_sha256": "97ae7d5f26fbc835933fa2ec565b57da72fdb2183821e40194a4c5859d613710"
        },
        {
          "role": "party_b",
          "display_name": "Basile Exemple",
          "email_sha256": "6767068b07326a7c67a8c3bf0a284fa85f88dde71ef69b3fe7320e67ec9cbcf7"
        }
      ],
      "meeting": {
        "moment": "Samedi 17 octobre 2026, 19h30",
        "context": "Accord de test fictif : dîner et visite d'exposition. Aucune personne réelle. Créé le 2026-10-03 comme échantillon d'export pour vérification indépendante par un tiers."
      },
      "consent_scope": {
        "selected_items": [
          {
            "id": "meet_in_person",
            "label": "Se rencontrer en personne dans le contexte décrit"
          },
          {
            "id": "conversation_topics",
            "label": "Échanger sur les sujets explicitement mentionnés dans les limites"
          }
        ],
        "details_and_limits": "Limites précisées par Anouk : pas de partage de photos, retour avant 23h."
      },
      "revocability_statement": "Chaque partie peut retirer son consentement à tout moment ; cet accord ne vaut jamais consentement futur ou irrévocable."
    },
    "canonical_json": "{\"consent_id\":\"CNSTR-F6BF-50D0-5A85\",\"consent_scope\":{\"details_and_limits\":\"Limites précisées par Anouk : pas de partage de photos, retour avant 23h.\",\"selected_items\":[{\"id\":\"meet_in_person\",\"label\":\"Se rencontrer en personne dans le contexte décrit\"},{\"id\":\"conversation_topics\",\"label\":\"Échanger sur les sujets explicitement mentionnés dans les limites\"}]},\"created_at_utc\":\"2026-10-03T06:46:01.349Z\",\"meeting\":{\"context\":\"Accord de test fictif : dîner et visite d'exposition. Aucune personne réelle. Créé le 2026-10-03 comme échantillon d'export pour vérification indépendante par un tiers.\",\"moment\":\"Samedi 17 octobre 2026, 19h30\"},\"parties\":[{\"display_name\":\"Anouk Exemple\",\"email_sha256\":\"97ae7d5f26fbc835933fa2ec565b57da72fdb2183821e40194a4c5859d613710\",\"role\":\"party_a\"},{\"display_name\":\"Basile Exemple\",\"email_sha256\":\"6767068b07326a7c67a8c3bf0a284fa85f88dde71ef69b3fe7320e67ec9cbcf7\",\"role\":\"party_b\"}],\"revocability_statement\":\"Chaque partie peut retirer son consentement à tout moment ; cet accord ne vaut jamais consentement futur ou irrévocable.\",\"schema_version\":\"consentr-proof-v1\"}"
  },
  "events": [
    {
      "id": "4ddc64f2-5362-4433-8d56-3ba3c3a89883",
      "agreement_id": "2fddd628-499b-469a-b1c3-7e5f15f241fc",
      "party_role": "system",
      "action": "created",
      "occurred_at": "2026-10-03T06:46:01.518Z",
      "payload_hash": "dad2eaf1f0a2569ad745e27c13abce63011037cce6f0d5d538fe966bbecfa26e",
      "previous_event_hash": null,
      "event_hash": "c66b391d39f8c7d7d6e800998500472112732560b00aa3182ff571e0a51081d0",
      "payload": {
        "public_id": "CNSTR-F6BF-50D0-5A85",
        "consent_hash": "e41da7277a974b96419e33b2ca7e3e4d1c2231e23fee74224a164d07b6d51081",
        "consent_version": "consentr-proof-v1"
      },
      "trace": {
        "side": "system",
        "ip_hash": "exemple",
        "event_id": "test-trace-a",
        "trace_hash": "exemple",
        "user_agent_hash": "exemple"
      }
    },
    {
      "id": "3ccb586a-6ea9-419b-a629-401211b530f6",
      "agreement_id": "2fddd628-499b-469a-b1c3-7e5f15f241fc",
      "party_role": "party_a",
      "action": "signed",
      "occurred_at": "2026-10-03T06:46:02.088Z",
      "payload_hash": "3b3480563dcfa19caf4c113eacaf60e79eff9d8865eca8795276b09977f15316",
      "previous_event_hash": "c66b391d39f8c7d7d6e800998500472112732560b00aa3182ff571e0a51081d0",
      "event_hash": "3ec61d1546486a5fa16eed147abb891b8bda1b9743ca9683911b6a80f0944156",
      "payload": {
        "method": "lien privé unique (envoyé par e-mail) + bouton « Signer » sur la page de l'accord ; rétractation possible à tout moment depuis la même page",
        "public_id": "CNSTR-F6BF-50D0-5A85",
        "consent_hash": "e41da7277a974b96419e33b2ca7e3e4d1c2231e23fee74224a164d07b6d51081",
        "signed_at_utc": "2026-10-03T06:46:01.926Z",
        "signature_sha256": "1156bdca54595eb5deb0674ecf709c276084c4fa6ef6e3d37000fff3204951e2"
      },
      "trace": {
        "side": "party_a",
        "ip_hash": "exemple",
        "event_id": "test-trace-a",
        "trace_hash": "exemple",
        "user_agent_hash": "exemple"
      }
    },
    {
      "id": "6173e9ad-9a2c-42a6-89bd-af6461c4bc13",
      "agreement_id": "2fddd628-499b-469a-b1c3-7e5f15f241fc",
      "party_role": "party_b",
      "action": "signed",
      "occurred_at": "2026-10-03T06:46:03.297Z",
      "payload_hash": "6d80d5ff6651ec1e02073ab8f2544f839609db722743f889929b44a2c867c46a",
      "previous_event_hash": "3ec61d1546486a5fa16eed147abb891b8bda1b9743ca9683911b6a80f0944156",
      "event_hash": "75255ed7c9df78a2a8bdfa2c07dcfc93be63ae293e65e15f94763c58693b3b06",
      "payload": {
        "method": "lien privé unique (envoyé par e-mail) + bouton « Signer » sur la page de l'accord ; rétractation possible à tout moment depuis la même page",
        "public_id": "CNSTR-F6BF-50D0-5A85",
        "consent_hash": "e41da7277a974b96419e33b2ca7e3e4d1c2231e23fee74224a164d07b6d51081",
        "signed_at_utc": "2026-10-03T06:46:03.138Z",
        "signature_sha256": "7760b55439e4bcdbad49c83523028b7c230576d5b9dd3451437d8e470c778255"
      },
      "trace": {
        "side": "party_b",
        "ip_hash": "exemple",
        "event_id": "test-trace-a",
        "trace_hash": "exemple",
        "user_agent_hash": "exemple"
      }
    }
  ]
}