{
  "info": {
    "_postman_id": "0fe43115-5c39-5eb3-bcdc-5971b9c3b170",
    "name": "illico API v1.29 — CAIRN Media",
    "description": "Collection générée depuis la spécification OpenAPI illico v1.29 préparée par CAIRN Media.\n\n**Avant le premier appel** : onglet Variables de la collection → renseigner `cle_publique`, `cle_secrete` et `base_url` (préprod `https://fr-cairn-test.illico.io`, production `https://fr-cairn.illico.io`).\n\nLes en-têtes `Application`, `Timestamp` et `Signature` sont calculés automatiquement par le script pre-request de la collection à chaque envoi ; ne pas les saisir à la main. Le body est signé exactement tel qu'il est envoyé.\n\nAprès un `POST /commande` réussi, la `reference` renvoyée est mémorisée et réutilisée par les appels de suivi (statut, documents, factures, annulation).",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "Annonces",
      "description": "Devis, commande, annulation et suivi des annonces",
      "item": [
        {
          "name": "Devis — calcul du tarif d'une annonce",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/devis",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "devis"
              ]
            },
            "description": "Calcule le tarif d'une annonce sans l'enregistrer.\n\n- Si `date_parution` n'est pas précisée, la prochaine date est proposée en tenant compte du délai de bouclage.\n- Si la date demandée ne respecte pas le bouclage, la prochaine date est calculée et retournée dans `date_parution`.\n- `forfait` est obligatoire selon la catégorie (`CONSTI`, `MODIF`).\n- Justificatifs papier : 0 par défaut si la publication propose le justificatif numérique, sinon 1.\n- Retourne également le `texte` composé après traitement (classes de style résolues).",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"publication\": 1,\n  \"departement\": \"33\",\n  \"date_parution\": \"2022-12-31\",\n  \"categorie\": \"CONSTI\",\n  \"forfait\": \"SARL\",\n  \"entete\": {\n    \"mime_type\": \"image/jpeg\",\n    \"data\": \"ZGF0YV9iYXNlNjRfZW50ZXRl\"\n  },\n  \"texte\": \"<p class=\\\"fs-titre\\\">AVIS</p><p class=\\\"fs-texte fs-texte_centre\\\">Aux termes d'un acte</p><p>En date du…</p>\",\n  \"justificatifs_papiers\": 1,\n  \"justificatif_numerique\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Commande — enregistre la commande d'une annonce",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/commande",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "commande"
              ]
            },
            "description": "Enregistre la commande d'une annonce.\n\n- Si `date_parution` n'est pas précisée, la prochaine date est automatiquement affectée en tenant compte du délai de bouclage.\n- `forfait` est obligatoire selon la catégorie (`CONSTI`, `MODIF`).\n- `facturation` est **obligatoire si `mode_facturation` = `annonceur`**.\n- Si `contact` n'est pas spécifié, le contact par défaut du compte API est utilisé.\n- `numero_commande` (50 caractères max.) permet ensuite d'utiliser ce numéro à la place de la `reference` illico dans tous les endpoints de suivi.\n- Justificatifs papier : 0 par défaut si la publication propose le justificatif numérique, sinon 1.\n- `largeur` / `largeur_texte` : leur prise en compte dépend du paramétrage du journal et de la clé API.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"publication\": 1,\n  \"departement\": \"33\",\n  \"date_parution\": \"2022-12-31\",\n  \"categorie\": \"CONSTI\",\n  \"forfait\": \"SARL\",\n  \"numero_commande\": \"COMMANDE001\",\n  \"dossier\": \"CONSTITUTION/IDM SOLUTIONS\",\n  \"entete\": {\n    \"mime_type\": \"image/jpeg\",\n    \"data\": \"ZGF0YV9iYXNlNjRfZW50ZXRl\"\n  },\n  \"texte\": \"<p class=\\\"fs-titre\\\">AVIS DE CONSTITUTION</p><p>Aux termes d'un acte sous ssp <br/> en date du <strong>31/12/2022</strong></p>\",\n  \"mode_facturation\": \"annonceur\",\n  \"facturation\": {\n    \"nom_raison_sociale\": \"IDM SOLUTIONS\",\n    \"adresse\": \"7 rue du bois d'Huré\",\n    \"adresse_complement\": \"2ème étage Bâtiment 2 bis\",\n    \"code_postal\": \"17138\",\n    \"ville\": \"LAGORD\",\n    \"pays\": \"FRA\",\n    \"telephone\": \"0972500404\",\n    \"email\": \"support@idm-solutions.com\"\n  },\n  \"justificatifs_papiers\": 1\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Annulation — annule une annonce",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/annonce/:reference",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "annonce",
                ":reference"
              ],
              "variable": [
                {
                  "key": "reference",
                  "value": "{{reference}}",
                  "description": "Référence interne de l'annonce au système illico (ex. `L2200001`) **ou** `numero_commande` fourni lors de l'appel à l'API Commande."
                }
              ]
            },
            "description": "Annule une annonce. Le tableau `documents` (facture + avoir) peut être absent si l'annonce n'avait pas été\nfacturée avant l'annulation. Route `DELETE /annonce/{reference}`."
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Statuts en lot — statuts d'un tableau d'annonces",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/annonces/statuts",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "annonces",
                "statuts"
              ]
            },
            "description": "Récupère les statuts d'un ensemble d'annonces identifiées par leur référence illico **ou** par le\n`numero_commande` fourni à la commande.\n\nRoute `/annonces/statuts`.\nL'ancienne route `/statut` reste servie pour compatibilité.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"references\": [\n    \"L2200001\",\n    \"L2200145\",\n    \"L2200084\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Statut d'une annonce",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/annonce/:reference/statut",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "annonce",
                ":reference",
                "statut"
              ],
              "variable": [
                {
                  "key": "reference",
                  "value": "{{reference}}",
                  "description": "Référence interne de l'annonce au système illico (ex. `L2200001`) **ou** `numero_commande` fourni lors de l'appel à l'API Commande."
                }
              ]
            },
            "description": ""
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Factures",
      "description": "Factures et avoirs liés aux annonces",
      "item": [
        {
          "name": "Factures en lot — factures/avoirs d'un tableau d'annonces",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/annonces/factures",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "annonces",
                "factures"
              ]
            },
            "description": "Récupère les factures et avoirs d'un ensemble d'annonces identifiées par leur référence illico **ou** par le\n`numero_commande` fourni à la commande.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"references\": [\n    \"L2200001\",\n    \"L2200345\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Factures d'une annonce",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/annonce/:reference/factures",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "annonce",
                ":reference",
                "factures"
              ],
              "variable": [
                {
                  "key": "reference",
                  "value": "{{reference}}",
                  "description": "Référence interne de l'annonce au système illico (ex. `L2200001`) **ou** `numero_commande` fourni lors de l'appel à l'API Commande."
                }
              ]
            },
            "description": ""
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Documents",
      "description": "Attestations, justificatifs, factures et avoirs (liens de téléchargement)",
      "item": [
        {
          "name": "Documents en lot — liens de téléchargement pour un tableau d'annonces",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/annonces/documents",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "annonces",
                "documents"
              ]
            },
            "description": "Récupère les liens de téléchargement des documents (attestation, justificatif, facture, avoir) liés à un\nensemble d'annonces commandées. Le champ `numero` est absent pour les justificatifs.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"references\": [\n    \"L2200001\",\n    \"L2200145\",\n    \"L2200084\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Documents d'une annonce",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/annonce/:reference/documents",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "annonce",
                ":reference",
                "documents"
              ],
              "variable": [
                {
                  "key": "reference",
                  "value": "{{reference}}",
                  "description": "Référence interne de l'annonce au système illico (ex. `L2200001`) **ou** `numero_commande` fourni lors de l'appel à l'API Commande."
                }
              ]
            },
            "description": "Récupère les documents d'une annonce. Le champ `numero` est absent pour les justificatifs."
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Publications",
      "description": "Publications habilitées et dates de parution",
      "item": [
        {
          "name": "Publications habilitées sur un département",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/publications?departement=33",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "publications"
              ],
              "query": [
                {
                  "key": "departement",
                  "value": "33",
                  "description": "Code du département souhaité (2 à 3 caractères). Corse-du-Sud `2A`, Haute-Corse `2B`.",
                  "disabled": false
                }
              ]
            },
            "description": "Liste des publications (papier ou web) habilitées sur le département demandé. La liste est mise à jour régulièrement.\nLe tableau `publications` peut être vide s'il n'y a aucune publication dans ce département.\n**Sans le paramètre `departement`, l'endpoint retourne la liste complète des publications**.\n\n**Publications autorisées** : la clé API est rattachée à un compte client illico sur lequel les publications accessibles\nsont configurées. Cet endpoint ne renvoie que ces publications, et Devis/Commande refusent toute autre publication. Pour un prescripteur, la liste renvoyée est donc la liste contractuelle : il n'y a pas à\nfiltrer côté client."
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Dates de parution à venir",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/dates-parutions?quantite=&publication=&departement=",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "dates-parutions"
              ],
              "query": [
                {
                  "key": "quantite",
                  "value": "",
                  "description": "Nombre de dates de parution souhaitées.",
                  "disabled": true
                },
                {
                  "key": "publication",
                  "value": "",
                  "description": "Filtre sur l'identifiant de la publication. Si présent, `departement` devient obligatoire.",
                  "disabled": true
                },
                {
                  "key": "departement",
                  "value": "",
                  "description": "Filtre sur le code du département (2 à 3 caractères). **Obligatoire si `publication` est présent.**",
                  "disabled": true
                }
              ]
            },
            "description": "Liste des prochaines dates de parution (et bouclage réellement configuré) de toutes les publications, ou\nfiltrée par publication/département.\n\nL'ancienne route `/dates-parution` (dépréciée en v1.19) reste servie pour compatibilité ; utiliser `/dates-parutions`."
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Compte",
      "description": "Compte client et contacts associés à la clé API",
      "item": [
        {
          "name": "Client — informations du compte associé à la clé API",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/client",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "client"
              ]
            },
            "description": ""
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Contacts associés à la clé API",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/contacts",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "contacts"
              ]
            },
            "description": ""
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Contact — création d'un nouveau contact",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/contact",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "contact"
              ]
            },
            "description": "Crée un contact associé à la clé API.\n- Si `mot_passe` est fourni, un accès au portail web est également créé.\n- Si l'email est déjà associé à un contact, ce contact est retourné.\n- S'il existe plusieurs contacts avec ce même email, une erreur `err_multiple_contact` est retournée.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"nom\": \"DURAND\",\n  \"prenom\": \"Jean\",\n  \"email\": \"jean.durand@domaine.ext\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Référentiels",
      "description": "Pays, départements, feuilles de styles, catégories, forfaits",
      "item": [
        {
          "name": "Pays (codes ISO 3166 alpha-3)",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/pays",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "pays"
              ]
            },
            "description": ""
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Départements",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/departements",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "departements"
              ]
            },
            "description": "Liste des départements. Corse-du-Sud `2A`, Haute-Corse `2B`."
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Feuilles de styles — classes HTML disponibles et propriétés CSS",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/feuilles-styles?type=",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "feuilles-styles"
              ],
              "query": [
                {
                  "key": "type",
                  "value": "",
                  "description": "Filtre sur le type de feuille de style.",
                  "disabled": true
                }
              ]
            },
            "description": "Récupère les feuilles de styles du journal permettant de mettre en forme les annonces.\n- Types `paragraphe`, `filet`, `entete` : s'appliquent sur la balise `<p>` (et `<hr>` pour `filet`).\n- Type `caractere` : s'applique via `<span class=\"...\">` à l'intérieur d'un `<p>`.\n\nLe retour est un tableau `feuilles_styles` dont chaque élément porte un champ `classe`."
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Catégories d'annonces et classes de style disponibles",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/categories",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "categories"
              ]
            },
            "description": "Liste des catégories, avec pour chacune les classes HTML de feuilles de style disponibles et la classe par défaut.\nLes catégories `SUC_VAC` et `SUC_DES` sont réservées aux confrères habilités."
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Forfaits et catégories associées",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Application",
                "value": "{{cle_publique}}",
                "description": "Clé publique — posée par le script pre-request"
              },
              {
                "key": "Timestamp",
                "value": "",
                "description": "Calculé par le script pre-request"
              },
              {
                "key": "Signature",
                "value": "",
                "description": "Calculée par le script pre-request"
              }
            ],
            "url": {
              "raw": "{{base_url}}/annonce-legale/api/externe/forfaits",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "annonce-legale",
                "api",
                "externe",
                "forfaits"
              ]
            },
            "description": "Liste des forfaits (constitutions et modifications) avec, pour chacun, le code de la catégorie à laquelle il\ns'applique. Disponible depuis la v1.29.\n\nLe retour est un tableau `forfaits`."
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// L'API répond toujours en HTTP 200 : c'est le champ resultat qui fait foi.",
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const json = pm.response.json();",
                  "pm.test('resultat = succes', () => pm.expect(json.resultat).to.eql('succes'));",
                  "if (json.resultat === 'erreur') {",
                  "    console.warn('Codes d\\'erreur illico :', (json.erreurs || []).join(', '));",
                  "}",
                  "// Mémorise la référence renvoyée par la commande pour les appels de suivi.",
                  "if (json.reference && pm.request.url.getPath().endsWith('/commande')) {",
                  "    pm.collectionVariables.set('reference', json.reference);",
                  "}"
                ]
              }
            }
          ]
        }
      ]
    }
  ],
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Signature illico : sha256(\"{cle_secrete}+{METHODE}+{chemin sans query}+{body brut}+{timestamp}\")",
          "// Voir la section Sécurisation de la documentation. Ne rien modifier ici : renseigner cle_publique et cle_secrete",
          "// dans les variables de la collection (onglet Variables), et environnement dans base_url.",
          "const secret = pm.variables.get('cle_secrete');",
          "const publique = pm.variables.get('cle_publique');",
          "if (!secret || !publique) {",
          "    throw new Error('Renseignez cle_publique et cle_secrete dans les variables de la collection.');",
          "}",
          "const timestamp = Math.floor(Date.now() / 1000);",
          "const methode = pm.request.method.toUpperCase();",
          "// getPath() résout les variables de chemin (:reference) ; la query string est exclue, comme l'exige l'API.",
          "const chemin = pm.variables.replaceIn(pm.request.url.getPath());",
          "let body = '';",
          "if (pm.request.body && pm.request.body.mode === 'raw' && pm.request.body.raw) {",
          "    body = pm.variables.replaceIn(pm.request.body.raw);",
          "}",
          "const chaine = secret + '+' + methode + '+' + chemin + '+' + body + '+' + timestamp;",
          "const signature = CryptoJS.SHA256(chaine).toString(CryptoJS.enc.Hex);",
          "pm.request.headers.upsert({ key: 'Application', value: publique });",
          "pm.request.headers.upsert({ key: 'Timestamp', value: String(timestamp) });",
          "pm.request.headers.upsert({ key: 'Signature', value: signature });",
          "pm.request.headers.upsert({ key: 'Content-Type', value: 'application/json' });"
        ]
      }
    }
  ],
  "variable": [
    {
      "key": "base_url",
      "value": "https://fr-cairn-test.illico.io",
      "description": "Instance de test CAIRN Media. Production : https://fr-cairn.illico.io."
    },
    {
      "key": "cle_publique",
      "value": "",
      "description": "Clé publique fournie par IDM Solutions (en-tête Application)"
    },
    {
      "key": "cle_secrete",
      "value": "",
      "type": "secret",
      "description": "Clé secrète fournie par IDM Solutions — ne quitte jamais le poste"
    },
    {
      "key": "reference",
      "value": "L2200001",
      "description": "Référence illico ou numero_commande — renseignée automatiquement après un POST /commande"
    }
  ]
}