{
  "item": [
    {
      "id": "f7f3df98-5195-4d4f-8a5f-65a932cf1ed4",
      "name": "Me",
      "description": {
        "content": "Endpoint whoami pour vérifier qu'une clé API fonctionne",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "b78cdf80-30d9-45a6-aef1-102df5d8ab96",
          "name": "Vérifier qu'une clé API fonctionne",
          "request": {
            "name": "Vérifier qu'une clé API fonctionne",
            "description": {
              "content": "Endpoint whoami minimal — retourne les infos de la clé qui authentifie la requête\n(nom, scopes, preset inféré, expiration, rate limits, client). C'est l'outil le plus\nsimple pour confirmer qu'une intégration tierce est connectée. Aucune mutation,\naucun side-effect — sécurisé à appeler depuis n'importe quel script de smoke test.\n\nAucun scope spécifique n'est requis ; toute clé authentifiée et active peut appeler\ncet endpoint. Consomme 1 unité du rate limit per-key (pour éviter qu'un script en\nboucle ne sature le tracking).\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "me"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "adc18a8d-9660-435d-9144-da0648837523",
              "name": "Clé valide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "me"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"key_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"key_name\": \"Acme production\",\n    \"key_prefix\": \"cap_live_a1b2c3\",\n    \"key_format_version\": 2,\n    \"client_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n    \"client_name\": \"Acme Corp.\",\n    \"scopes\": [\n      \"leads:capture\"\n    ],\n    \"preset\": \"lead_capture\",\n    \"lifecycle_state\": \"active\",\n    \"created_at\": \"2026-04-01T10:00:00.000Z\",\n    \"last_used_at\": \"2026-05-04T14:23:11.000Z\",\n    \"expires_at\": null,\n    \"rate_limits\": {\n      \"per_hour\": 100\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e6a9907a-083e-4fad-b902-c83518214759",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "me"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "edb25326-8684-4e2f-af62-a2f06f865a71",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "me"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e135e997-6225-4d54-a5fa-1bb16720105d",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "me"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "b0fa9852-cf2f-4543-a78f-58fbc3337048",
      "name": "Usage",
      "description": {
        "content": "Métriques de consommation programmatiques",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "021707d6-004f-4e45-bc6f-39edf3c864ec",
          "name": "Lire l'usage agrégé de la clé API authentifiée",
          "request": {
            "name": "Lire l'usage agrégé de la clé API authentifiée",
            "description": {
              "content": "Retourne les buckets d'agrégation (par heure ou par jour) de la consommation de\nla clé authentifiée sur une plage temporelle donnée, plus les totals calculés\napplication-side. Utile pour dimensionner sa consommation, monitorer les latences\net détecter les rejets rate limit.\n\nAucun scope spécifique requis (pattern GitHub `/rate_limit`) : consulter ses\npropres metrics est gratuit et toujours permis pour toute clé authentifiée.\n\nLa plage `(to - from)` doit être strictement positive et ne pas dépasser\n**90 jours**. Les buckets retournés sont triés par `bucket_start ASC` ; les\nfenêtres sans trafic sont absentes du tableau (pas de zéro-padding).\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "usage"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "from",
                  "value": "<dateTime>",
                  "description": "(Required) Borne inférieure (inclusive) de la plage temporelle, ISO 8601 UTC.\n"
                },
                {
                  "disabled": false,
                  "key": "to",
                  "value": "<dateTime>",
                  "description": "(Required) Borne supérieure (exclusive) de la plage temporelle, ISO 8601 UTC. Doit\nêtre strictement après `from` et la plage `(to - from)` ≤ 90 jours.\n"
                },
                {
                  "disabled": false,
                  "key": "granularity",
                  "value": "day",
                  "description": "Granularité des buckets retournés. `day` par défaut.\n"
                }
              ],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "902bd2aa-bd72-4776-95c0-edc83dd8ca55",
              "name": "Buckets et totals d'usage pour la plage demandée.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "usage"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "to",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "granularity",
                      "value": "day"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"api_key_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"from\": \"2026-05-01T00:00:00.000Z\",\n    \"to\": \"2026-05-04T00:00:00.000Z\",\n    \"granularity\": \"day\",\n    \"buckets\": [\n      {\n        \"bucket_start\": \"2026-05-01T00:00:00.000Z\",\n        \"request_count\": 1234,\n        \"status_2xx\": 1200,\n        \"status_4xx\": 30,\n        \"status_5xx\": 4,\n        \"rate_limited_count\": 5,\n        \"latency_p50_ms\": 42.5,\n        \"latency_p95_ms\": 180,\n        \"latency_p99_ms\": 350\n      }\n    ],\n    \"totals\": {\n      \"request_count\": 1234,\n      \"status_2xx\": 1200,\n      \"status_4xx\": 30,\n      \"status_5xx\": 4,\n      \"rate_limited_count\": 5\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "88c269da-85d4-4af1-9853-33e819a223dd",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "usage"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "to",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "granularity",
                      "value": "day"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "dfa573cd-6ac0-4bd7-986d-542dc4fd7269",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "usage"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "to",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "granularity",
                      "value": "day"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "3afc4a78-4df9-4e0b-9d2e-6f20480e9745",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "usage"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "to",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "granularity",
                      "value": "day"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "521cee8b-0ed2-44da-b90f-edad8644b1ad",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "usage"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "to",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "granularity",
                      "value": "day"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "0e1ce9c7-ad14-42f6-b163-71a1d7cd236b",
      "name": "Leads",
      "description": {
        "content": "Capture de leads depuis funnels externes (Make, Zapier, code custom)",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "b7c48aec-0d5f-43f2-a766-7ebbf50cd603",
          "name": "Capturer un lead depuis un funnel externe",
          "request": {
            "name": "Capturer un lead depuis un funnel externe",
            "description": {
              "content": "Capture un nouveau lead dans Capturia depuis un funnel, formulaire ou outil\ntiers (Make, Zapier, n8n, landing custom). Une fois capturé, le lead apparaît\nimmédiatement dans **Mes Prospects** côté dashboard et le bot SMS prend le\nrelais dans les 30 secondes si le consentement et la configuration sont en\nordre.\n\n### Contact déjà connu (courriel ou téléphone)\nLa fiche est résolue par **courriel d'abord** (insensible à la casse),\npuis par **téléphone**, en incluant les coordonnées secondaires déjà\nrattachées à une fiche. Capturer un lead dont le courriel ou le\ntéléphone existe déjà **réutilise et enrichit la fiche existante** — le\n`contact_id` retourné est celui de cette fiche, jamais un doublon et\njamais une erreur. Les coordonnées et champs cœur déjà remplis (nom,\ncourriel, téléphone, pipeline, valeur, adresse...) ne sont pas\nécrasés ; les réponses de qualification (`custom_fields`) sont en\nrevanche rafraîchies avec les dernières valeurs envoyées — une clé\ndéjà présente est remplacée, une clé nouvelle s'ajoute. Un nouveau\ntéléphone est conservé comme numéro secondaire quand la fiche en a\ndéjà un. Si le courriel et le téléphone pointent deux fiches\ndifférentes, le courriel a priorité et aucune coordonnée n'est retirée\nà l'autre fiche.\n\nLa réponse expose `contact_was_new` pour distinguer les deux issues :\nsur une fiche existante (`false`), `pipeline` et `assignment_status`\ndécrivent la demande résolue, pas forcément l'état persisté — la fiche\nconserve son pipeline, son étape et son vendeur déjà en place.\n\n### Contact déjà en pipeline ouvert\nUn lead dont le contact (résolu par courriel ou téléphone) est déjà dans\nune étape de pipeline ouverte (déjà pris en charge par un vendeur — non\narchivé, étape ni gagnée ni perdue)\nn'est pas re-soumis : la réponse renvoie `status: existing_pipeline_contact`,\naucune nouvelle soumission n'est enregistrée et le bot SMS n'est pas\nredéclenché, pour ne pas écraser une conversation en cours. Les champs\ncœur nouvellement fournis enrichissent quand même le contact existant.\n\nLa dédup de retry reste prioritaire : un re-push reçu dans la fenêtre de\n5 minutes est traité comme un retry (`status: idempotent_replay`, voir\nIdempotency) et conserve l'`activity_id` et l'`original_created_at`\nd'origine — `existing_pipeline_contact` ne s'applique qu'au-delà de cette\nfenêtre.\n\n### Idempotency\nLe header `Idempotency-Key` est **optionnel mais recommandé** pour les retries\ncôté client. Une 2e requête avec la même clé et le même payload renvoie la\nréponse d'origine sans dupliquer le lead. La clé est stockée 24h. Une 2e\nrequête avec la même clé mais un payload différent retourne 409\n`idempotency_conflict`. La RPC sous-jacente conserve par ailleurs sa propre\nfenêtre de dedup à 5 minutes. Cette fenêtre est **par contact et\nindépendante du contenu** : toute soumission d'un contact déjà capturé\ndans les 5 dernières minutes est traitée comme un retry\n(`idempotent_replay`) même si le payload diffère — la fiche est tout de\nmême enrichie (dont les `custom_fields`, rafraîchis), mais aucune\nnouvelle activité, aucun tag, et pas de relance du bot SMS. Les mises à\njour de la fiche restent réelles : une automatisation qui surveille un\nchamp personnalisé réagit au changement de valeur, comme pour toute\nmodification de la fiche. C'est aussi ce qui protège d'une double\nrelance du bot quand un lead re-soumet son formulaire coup sur coup.\nUn `Idempotency-Key` différent ne contourne pas cette fenêtre : elle\ns'applique en base après tout cache miss. Deux soumissions\nvolontairement distinctes du même contact ne produisent deux activités\nque si elles sont espacées de plus de 5 minutes.\n\n### Codes d'erreur custom\nPour des raisons historiques, certains rejets retournent des codes hors\ncatalog standard :\n\n- **422** — `invalid_phone`, `missing_consent`, `invalid_email`,\n  `invalid_payload`, `pipeline_not_found`, `stage_not_found` (au lieu de\n  `validation_error` / `business_rule_violation`). Body shape simplifiée\n  propre à cette route — voir la réponse 422 ci-dessous.\n- **429** — `rate_limited_ip` quand la limite IP (100 req/min) est atteinte\n  (au lieu de `rate_limit_exceeded`). Le header `X-RateLimit-Scope: ip`\n  identifie le scope de la limite déclenchée. Body shape simplifiée (pas de\n  `request_id` ni `details` standard) — à harmoniser dans une phase\n  ultérieure.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "leads",
                "capture"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "disabled": false,
                "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                "key": "Idempotency-Key",
                "value": "<string>"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"phone\": \"<string>\",\n  \"sms_consent\": \"<boolean>\",\n  \"first_name\": \"<string>\",\n  \"last_name\": \"<string>\",\n  \"email\": \"<email>\",\n  \"source_label\": \"<string>\",\n  \"utm\": {\n    \"source\": \"<string>\",\n    \"medium\": \"<string>\",\n    \"campaign\": \"<string>\",\n    \"content\": \"<string>\",\n    \"term\": \"<string>\"\n  },\n  \"notes\": \"<string>\",\n  \"tags\": [\n    \"<string>\",\n    \"<string>\"\n  ],\n  \"qualification_answers\": [\n    {\n      \"question\": \"<string>\",\n      \"answer\": \"<string>\"\n    },\n    {\n      \"question\": \"<string>\",\n      \"answer\": \"<string>\"\n    }\n  ],\n  \"pipeline\": {\n    \"pipeline_slug\": \"<string>\",\n    \"stage_slug\": \"<string>\",\n    \"deal_value\": \"<number>\",\n    \"expected_close_date\": \"<string>\",\n    \"assigned_sales_rep_email\": \"<email>\"\n  },\n  \"custom_fields\": {\n    \"key_0\": \"<string,number,boolean>\",\n    \"key_1\": \"<string,number,boolean>\",\n    \"key_2\": \"<string,number,boolean>\",\n    \"key_3\": \"<string,number,boolean>\",\n    \"key_4\": \"<string,number,boolean>\",\n    \"key_5\": \"<string,number,boolean>\",\n    \"key_6\": \"<string,number,boolean>\",\n    \"key_7\": \"<string,number,boolean>\",\n    \"key_8\": \"<string,number,boolean>\",\n    \"key_9\": \"<string,number,boolean>\",\n    \"key_10\": \"<string,number,boolean>\",\n    \"key_11\": \"<string,number,boolean>\",\n    \"key_12\": \"<string,number,boolean>\",\n    \"key_13\": \"<string,number,boolean>\"\n  },\n  \"address\": \"<string>\",\n  \"postal_code\": \"<string>\",\n  \"address_place_id\": \"<string>\",\n  \"meta\": {\n    \"fbc\": \"<string>\",\n    \"fbp\": \"<string>\",\n    \"fbclid\": \"<string>\",\n    \"event_source_url\": \"<string>\",\n    \"client_ip_address\": \"<string>\",\n    \"client_user_agent\": \"<string>\",\n    \"ad_id\": \"<string>\",\n    \"adset_id\": \"<string>\",\n    \"campaign_id\": \"<string>\",\n    \"ad_name\": \"<string>\",\n    \"campaign_name\": \"<string>\",\n    \"ads_consent\": \"<boolean>\"\n  },\n  \"system_id\": \"<uuid>\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "c6aed07c-3cdc-44de-829d-4f64833a0397",
              "name": "Lead capturé (`status: created`), replay idempotent d'une capture\nprécédente (`status: idempotent_replay`), ou contact déjà pris en\ncharge (`status: existing_pipeline_contact` — déjà dans une étape de\npipeline ouverte : aucune nouvelle soumission n'est enregistrée et le\nbot SMS n'est pas déclenché, `activity_id` est `null`). Dans tous les\ncas, le `contact_id` retourné est stable.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "leads",
                    "capture"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+15145551234\",\n  \"sms_consent\": true,\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"email\": \"alex@example.com\",\n  \"source_label\": \"funnel-fb-jan\",\n  \"utm\": {\n    \"source\": \"facebook\",\n    \"medium\": \"cpc\",\n    \"campaign\": \"spring-2026\"\n  },\n  \"tags\": [\n    \"lead-chaud\",\n    \"vu-webinaire\"\n  ],\n  \"pipeline\": {\n    \"pipeline_slug\": \"ventes-b2b\",\n    \"stage_slug\": \"nouveau-lead\",\n    \"deal_value\": 2500,\n    \"expected_close_date\": \"2026-06-30\",\n    \"assigned_sales_rep_email\": \"vendeur@example.com\"\n  },\n  \"custom_fields\": {\n    \"type_propriete\": \"maison_isolee\",\n    \"delai_vente\": \"0_3_mois\"\n  },\n  \"address\": \"123 rue Principale, Montréal\",\n  \"postal_code\": \"H2X 1Y4\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"created\",\n  \"contact_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n  \"activity_id\": \"1b2c3d4e-5f6a-7b8c-9d0e-1f2a3b4c5d6e\",\n  \"sms_conversation_id\": null,\n  \"pipeline\": {\n    \"pipeline_id\": \"3d4e5f6a-7b8c-9d0e-1f2a-3b4c5d6e7f80\",\n    \"pipeline_name\": \"Ventes B2B\",\n    \"stage_id\": \"4e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8091\",\n    \"stage_name\": \"Nouveau lead\"\n  },\n  \"original_created_at\": null,\n  \"assignment_status\": \"assigned\",\n  \"contact_was_new\": true,\n  \"message\": \"Lead captured. The SMS bot will take over within 30 seconds if consent and configuration are in order.\"\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "68a0bd6d-4dcf-4216-9281-eddddaae6174",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "leads",
                    "capture"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+15145551234\",\n  \"sms_consent\": true,\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"email\": \"alex@example.com\",\n  \"source_label\": \"funnel-fb-jan\",\n  \"utm\": {\n    \"source\": \"facebook\",\n    \"medium\": \"cpc\",\n    \"campaign\": \"spring-2026\"\n  },\n  \"tags\": [\n    \"lead-chaud\",\n    \"vu-webinaire\"\n  ],\n  \"pipeline\": {\n    \"pipeline_slug\": \"ventes-b2b\",\n    \"stage_slug\": \"nouveau-lead\",\n    \"deal_value\": 2500,\n    \"expected_close_date\": \"2026-06-30\",\n    \"assigned_sales_rep_email\": \"vendeur@example.com\"\n  },\n  \"custom_fields\": {\n    \"type_propriete\": \"maison_isolee\",\n    \"delai_vente\": \"0_3_mois\"\n  },\n  \"address\": \"123 rue Principale, Montréal\",\n  \"postal_code\": \"H2X 1Y4\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "d1b5538b-61fc-443c-b67e-08cd3a963bc8",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "leads",
                    "capture"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+15145551234\",\n  \"sms_consent\": true,\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"email\": \"alex@example.com\",\n  \"source_label\": \"funnel-fb-jan\",\n  \"utm\": {\n    \"source\": \"facebook\",\n    \"medium\": \"cpc\",\n    \"campaign\": \"spring-2026\"\n  },\n  \"tags\": [\n    \"lead-chaud\",\n    \"vu-webinaire\"\n  ],\n  \"pipeline\": {\n    \"pipeline_slug\": \"ventes-b2b\",\n    \"stage_slug\": \"nouveau-lead\",\n    \"deal_value\": 2500,\n    \"expected_close_date\": \"2026-06-30\",\n    \"assigned_sales_rep_email\": \"vendeur@example.com\"\n  },\n  \"custom_fields\": {\n    \"type_propriete\": \"maison_isolee\",\n    \"delai_vente\": \"0_3_mois\"\n  },\n  \"address\": \"123 rue Principale, Montréal\",\n  \"postal_code\": \"H2X 1Y4\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f3c29ccf-bf45-4f6c-bd53-3f0232ad17d5",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "leads",
                    "capture"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+15145551234\",\n  \"sms_consent\": true,\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"email\": \"alex@example.com\",\n  \"source_label\": \"funnel-fb-jan\",\n  \"utm\": {\n    \"source\": \"facebook\",\n    \"medium\": \"cpc\",\n    \"campaign\": \"spring-2026\"\n  },\n  \"tags\": [\n    \"lead-chaud\",\n    \"vu-webinaire\"\n  ],\n  \"pipeline\": {\n    \"pipeline_slug\": \"ventes-b2b\",\n    \"stage_slug\": \"nouveau-lead\",\n    \"deal_value\": 2500,\n    \"expected_close_date\": \"2026-06-30\",\n    \"assigned_sales_rep_email\": \"vendeur@example.com\"\n  },\n  \"custom_fields\": {\n    \"type_propriete\": \"maison_isolee\",\n    \"delai_vente\": \"0_3_mois\"\n  },\n  \"address\": \"123 rue Principale, Montréal\",\n  \"postal_code\": \"H2X 1Y4\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "13f2d3af-8c4a-4baa-b844-b42ae3a19de8",
              "name": "Une requête précédente avec la même `Idempotency-Key` a utilisé un payload différent,\nou est encore en cours de traitement.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "leads",
                    "capture"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+15145551234\",\n  \"sms_consent\": true,\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"email\": \"alex@example.com\",\n  \"source_label\": \"funnel-fb-jan\",\n  \"utm\": {\n    \"source\": \"facebook\",\n    \"medium\": \"cpc\",\n    \"campaign\": \"spring-2026\"\n  },\n  \"tags\": [\n    \"lead-chaud\",\n    \"vu-webinaire\"\n  ],\n  \"pipeline\": {\n    \"pipeline_slug\": \"ventes-b2b\",\n    \"stage_slug\": \"nouveau-lead\",\n    \"deal_value\": 2500,\n    \"expected_close_date\": \"2026-06-30\",\n    \"assigned_sales_rep_email\": \"vendeur@example.com\"\n  },\n  \"custom_fields\": {\n    \"type_propriete\": \"maison_isolee\",\n    \"delai_vente\": \"0_3_mois\"\n  },\n  \"address\": \"123 rue Principale, Montréal\",\n  \"postal_code\": \"H2X 1Y4\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"idempotency_error\",\n    \"code\": \"idempotency_conflict\",\n    \"message\": \"Une requête avec cette Idempotency-Key existe avec un payload différent.\",\n    \"hint\": \"Utilise une nouvelle Idempotency-Key, ou rejoue la requête originale à l'identique.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#idempotency\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"idempotency_key\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n      \"original_request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T6\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "6a03a26b-d402-43e0-bbab-99460a9c703e",
              "name": "Payload refusé par la validation (`invalid_phone`, `missing_consent`,\n`invalid_email`, `invalid_payload`) ou par la résolution du pipeline\n(`pipeline_not_found`, `stage_not_found`). Forme simplifiée propre à\ncette route : pas de `type` ni de `doc_url`, et `details` est un\ntableau `[{ field, reason }]` (`field` vide quand le body n'est pas\nun objet).\nPour un champ scalaire fautif, le `message` renvoie en écho la\nvaleur reçue (bornée à 120 caractères) — elle n'est jamais conservée\ncôté Capturia ; seuls les noms des champs reçus le sont, visibles\ndans l'onglet Erreurs récentes de la clé API. Le `request_id` est\ntoujours dans l'en-tête `X-Request-ID`.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "leads",
                    "capture"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+15145551234\",\n  \"sms_consent\": true,\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"email\": \"alex@example.com\",\n  \"source_label\": \"funnel-fb-jan\",\n  \"utm\": {\n    \"source\": \"facebook\",\n    \"medium\": \"cpc\",\n    \"campaign\": \"spring-2026\"\n  },\n  \"tags\": [\n    \"lead-chaud\",\n    \"vu-webinaire\"\n  ],\n  \"pipeline\": {\n    \"pipeline_slug\": \"ventes-b2b\",\n    \"stage_slug\": \"nouveau-lead\",\n    \"deal_value\": 2500,\n    \"expected_close_date\": \"2026-06-30\",\n    \"assigned_sales_rep_email\": \"vendeur@example.com\"\n  },\n  \"custom_fields\": {\n    \"type_propriete\": \"maison_isolee\",\n    \"delai_vente\": \"0_3_mois\"\n  },\n  \"address\": \"123 rue Principale, Montréal\",\n  \"postal_code\": \"H2X 1Y4\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unprocessable Entity (WebDAV) (RFC 4918)",
              "code": 422,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"code\": \"invalid_phone\",\n    \"message\": \"Received \\\"phone_number\\\" for field \\\"phone\\\" — Phone must be a valid number — accepted formats: E.164 (+15141234567), 10-digit NANP (5141234567), 11-digit with country code (15141234567), or formatted variants (\\\"(514) 123-4567\\\", \\\"1-514-123-4567\\\")\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": [\n      {\n        \"field\": \"phone\",\n        \"reason\": \"Phone must be a valid number — accepted formats: E.164 (+15141234567), 10-digit NANP (5141234567), 11-digit with country code (15141234567), or formatted variants (\\\"(514) 123-4567\\\", \\\"1-514-123-4567\\\")\"\n      }\n    ]\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "96bc3cc7-1991-4368-8512-aadd3f37f6f0",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "leads",
                    "capture"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+15145551234\",\n  \"sms_consent\": true,\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"email\": \"alex@example.com\",\n  \"source_label\": \"funnel-fb-jan\",\n  \"utm\": {\n    \"source\": \"facebook\",\n    \"medium\": \"cpc\",\n    \"campaign\": \"spring-2026\"\n  },\n  \"tags\": [\n    \"lead-chaud\",\n    \"vu-webinaire\"\n  ],\n  \"pipeline\": {\n    \"pipeline_slug\": \"ventes-b2b\",\n    \"stage_slug\": \"nouveau-lead\",\n    \"deal_value\": 2500,\n    \"expected_close_date\": \"2026-06-30\",\n    \"assigned_sales_rep_email\": \"vendeur@example.com\"\n  },\n  \"custom_fields\": {\n    \"type_propriete\": \"maison_isolee\",\n    \"delai_vente\": \"0_3_mois\"\n  },\n  \"address\": \"123 rue Principale, Montréal\",\n  \"postal_code\": \"H2X 1Y4\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "c77e80a5-a733-406e-9eb3-60cf409d8952",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "leads",
                    "capture"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"+15145551234\",\n  \"sms_consent\": true,\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"email\": \"alex@example.com\",\n  \"source_label\": \"funnel-fb-jan\",\n  \"utm\": {\n    \"source\": \"facebook\",\n    \"medium\": \"cpc\",\n    \"campaign\": \"spring-2026\"\n  },\n  \"tags\": [\n    \"lead-chaud\",\n    \"vu-webinaire\"\n  ],\n  \"pipeline\": {\n    \"pipeline_slug\": \"ventes-b2b\",\n    \"stage_slug\": \"nouveau-lead\",\n    \"deal_value\": 2500,\n    \"expected_close_date\": \"2026-06-30\",\n    \"assigned_sales_rep_email\": \"vendeur@example.com\"\n  },\n  \"custom_fields\": {\n    \"type_propriete\": \"maison_isolee\",\n    \"delai_vente\": \"0_3_mois\"\n  },\n  \"address\": \"123 rue Principale, Montréal\",\n  \"postal_code\": \"H2X 1Y4\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "104bc020-d278-4cac-9d49-4c34ea8c22e8",
      "name": "Contacts",
      "description": {
        "content": "CRUD complet sur les contacts (prospects + clients)",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "3d820b3a-78b8-453f-b2df-8dbf59ecb54e",
          "name": "Lister les contacts",
          "request": {
            "name": "Lister les contacts",
            "description": {
              "content": "Retourne la liste paginée des contacts du client (cursor v2).\nTri stable `created_at DESC, id DESC`. Supporte recherche\ncase-insensitive sur `email`, `first_name`, `last_name`, `company`,\nfiltre par tag, et inclusion conditionnelle des définitions de\ncustom fields dans `meta`.\n\n### Recherche\n\nLe paramètre `?search` est sanitizé côté serveur — les caractères\n`%`, `_`, `,`, `(`, `)`, `.`, `*`, `\\` sont retirés avant l'application\ndu filtre `ilike` pour empêcher l'injection PostgREST.\n\n### Inclusion custom fields\n\nPasser `?include=custom_field_definitions` ajoute le champ\n`meta.custom_field_definitions` à la réponse — utile pour rendre\nun formulaire d'édition côté intégrateur sans 2e round-trip.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "contacts"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "cursor",
                  "value": "<string,null>",
                  "description": "Cursor opaque pour pagination — passer la valeur de `pagination.next_cursor` de la page précédente."
                },
                {
                  "disabled": false,
                  "key": "limit",
                  "value": "20",
                  "description": "Nombre max de résultats par page (defaut 20, max 100). Au-delà → 400 invalid_request."
                },
                {
                  "disabled": false,
                  "key": "created_after",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées après cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "created_before",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées avant cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "search",
                  "value": "<string>",
                  "description": "Recherche dans email, first_name, last_name, company (case-insensitive, sanitizée)."
                },
                {
                  "disabled": false,
                  "key": "tag",
                  "value": "<uuid>",
                  "description": "UUID d'un tag — filtre les contacts qui ont ce tag."
                },
                {
                  "disabled": false,
                  "key": "include",
                  "value": "<string>",
                  "description": "Inclut le bloc `meta.custom_field_definitions` dans la réponse."
                }
              ],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "e2ce1a71-fd35-4892-9926-dbc991c53c85",
              "name": "Liste paginée des contacts.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "search",
                      "value": "<string>"
                    },
                    {
                      "key": "tag",
                      "value": "<uuid>"
                    },
                    {
                      "key": "include",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n      \"email\": \"alex@example.com\",\n      \"phone\": \"+15145551234\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Tremblay\",\n      \"company\": \"Acme Inc.\",\n      \"source\": \"api\",\n      \"pipeline_stage_id\": null,\n      \"deal_value\": 2500,\n      \"is_priority\": false,\n      \"custom_fields\": null,\n      \"created_at\": \"2026-04-01T10:00:00.000Z\",\n      \"updated_at\": \"2026-04-01T10:00:00.000Z\"\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 20,\n    \"cursor\": null,\n    \"total_count\": 1\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "fe1295dd-b12e-48ff-9af0-f626136c9931",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "search",
                      "value": "<string>"
                    },
                    {
                      "key": "tag",
                      "value": "<uuid>"
                    },
                    {
                      "key": "include",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "28bc5c86-60b1-425b-bed9-27d014e32fb9",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "search",
                      "value": "<string>"
                    },
                    {
                      "key": "tag",
                      "value": "<uuid>"
                    },
                    {
                      "key": "include",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "02adc430-7e6c-4bc2-9f7b-1b28700b8b8c",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "search",
                      "value": "<string>"
                    },
                    {
                      "key": "tag",
                      "value": "<uuid>"
                    },
                    {
                      "key": "include",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "7f4feb8d-32c2-4476-bb57-ee1365084217",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "search",
                      "value": "<string>"
                    },
                    {
                      "key": "tag",
                      "value": "<uuid>"
                    },
                    {
                      "key": "include",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "c8f592d0-9028-4715-ae4b-5cdd7219b736",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "search",
                      "value": "<string>"
                    },
                    {
                      "key": "tag",
                      "value": "<uuid>"
                    },
                    {
                      "key": "include",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "0d5817d0-20dd-4976-b95f-720fc1d725c9",
          "name": "Créer un contact",
          "request": {
            "name": "Créer un contact",
            "description": {
              "content": "Crée un contact sous le client de la clé. Email obligatoire et\ndédupliqué — si un contact avec ce mail existe déjà sous ce client,\nla réponse est `409 duplicate_resource` (le contact existant n'est\npas écrasé).\n\n### Idempotency\n\nLe header `Idempotency-Key` est **optionnel mais recommandé**.\nUne 2e requête avec la même clé et le même payload renvoie la\nréponse d'origine sans dupliquer l'opération. Une 2e requête avec\nla même clé et un payload différent retourne `409 idempotency_conflict`.\n\n### Custom fields\n\nLes clés de `custom_fields` sont le **nom** du champ tel que défini\ndans Capturia (ou, de façon équivalente, l'id de sa définition) —\nmême contrat que `/v1/events` et `/v1/leads/capture`. Les valeurs\nsont validées contre les définitions du client\n(`client_custom_field_definitions`). Un champ inconnu ou un type\nincompatible retourne `400 invalid_custom_fields` avec `details`\nlistant les violations.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "contacts"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "disabled": false,
                "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                "key": "Idempotency-Key",
                "value": "<string>"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"<email>\",\n  \"first_name\": \"<string>\",\n  \"last_name\": \"<string>\",\n  \"phone\": \"<string>\",\n  \"company\": \"<string>\",\n  \"deal_value\": \"<number>\",\n  \"custom_fields\": {\n    \"key_0\": true,\n    \"key_1\": 7435\n  },\n  \"system_id\": \"<uuid>\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "81831950-ad3d-4a3e-9cd6-432e1c3e07b7",
              "name": "Contact créé.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"phone\": \"+15145551234\",\n  \"company\": \"Acme Inc.\",\n  \"deal_value\": 2500\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"email\": \"alex@example.com\",\n    \"phone\": \"+15145551234\",\n    \"first_name\": \"Alex\",\n    \"last_name\": \"Tremblay\",\n    \"company\": \"Acme Inc.\",\n    \"source\": null,\n    \"pipeline_stage_id\": null,\n    \"deal_value\": 2500,\n    \"is_priority\": false,\n    \"custom_fields\": null,\n    \"created_at\": \"2026-05-04T10:00:00.000Z\",\n    \"updated_at\": \"2026-05-04T10:00:00.000Z\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "13179d59-0abc-4a2c-88ed-ac0163b2846b",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"phone\": \"+15145551234\",\n  \"company\": \"Acme Inc.\",\n  \"deal_value\": 2500\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "a7027186-cdd2-4a55-a44e-a054814d5987",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"phone\": \"+15145551234\",\n  \"company\": \"Acme Inc.\",\n  \"deal_value\": 2500\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "d2729c22-dc72-4719-b180-e305d609ba12",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"phone\": \"+15145551234\",\n  \"company\": \"Acme Inc.\",\n  \"deal_value\": 2500\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "51c235f4-e6bb-4e6c-9e1e-ed2834179d32",
              "name": "Une ressource avec un identifiant unique conflictuel existe déjà.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"phone\": \"+15145551234\",\n  \"company\": \"Acme Inc.\",\n  \"deal_value\": 2500\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"conflict_error\",\n    \"code\": \"duplicate_resource\",\n    \"message\": \"Un contact avec cet email existe déjà.\",\n    \"hint\": \"Utilise PATCH /v1/contacts/{id} pour mettre à jour le contact existant.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#duplicate_resource\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"conflicting_field\": \"email\",\n      \"conflicting_value\": \"prospect@example.com\",\n      \"existing_id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T8\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "14558b61-47d9-4c97-af79-b70fd036a500",
              "name": "Le header `Content-Type` est manquant ou non supporté pour cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"phone\": \"+15145551234\",\n  \"company\": \"Acme Inc.\",\n  \"deal_value\": 2500\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unsupported Media Type",
              "code": 415,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_content_type\",\n    \"message\": \"Content-Type `text/plain` non supporté. Utilise `application/json`.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#content-type\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"received\": \"text/plain\",\n      \"expected\": [\n        \"application/json\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "4be007d7-0376-4dd2-a6f1-932a528f3172",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"phone\": \"+15145551234\",\n  \"company\": \"Acme Inc.\",\n  \"deal_value\": 2500\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "8ae403e0-09b6-4346-8c5a-46f30fea6528",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"last_name\": \"Tremblay\",\n  \"phone\": \"+15145551234\",\n  \"company\": \"Acme Inc.\",\n  \"deal_value\": 2500\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "dd8387f7-4dd5-4eb8-a4c5-b76758e0e816",
          "name": "Récupérer un contact",
          "request": {
            "name": "Récupérer un contact",
            "description": {
              "content": "Retourne un contact par son ID. Le paramètre `?expand=tags` joint la\ntable `client_contact_tags` pour inclure les tags rattachés (id, nom,\ncouleur) sans round-trip supplémentaire.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "contacts",
                ":id"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "expand",
                  "value": "<string>",
                  "description": "Si `tags`, ajoute `client_contact_tags` au contact retourné."
                }
              ],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "464b7ee6-29d9-41fa-a4d5-710c0879e4e8",
              "name": "Contact trouvé.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "expand",
                      "value": "<string>"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"email\": \"alex@example.com\",\n    \"phone\": \"+15145551234\",\n    \"first_name\": \"Alex\",\n    \"last_name\": \"Tremblay\",\n    \"company\": \"Acme Inc.\",\n    \"source\": \"api\",\n    \"pipeline_stage_id\": null,\n    \"deal_value\": 2500,\n    \"is_priority\": false,\n    \"custom_fields\": null,\n    \"created_at\": \"2026-04-01T10:00:00.000Z\",\n    \"updated_at\": \"2026-04-01T10:00:00.000Z\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "c9d7c73b-9d23-41bc-8b93-1ba71cb3da86",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "expand",
                      "value": "<string>"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f8799afe-966b-4660-add7-af7740bfe47e",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "expand",
                      "value": "<string>"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "5eea3642-56e0-4a4c-a8e5-c2366d950baa",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "expand",
                      "value": "<string>"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "5cbefde6-80e7-41f1-9869-00a7666a382e",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "expand",
                      "value": "<string>"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "d1eda6e3-4e17-4238-8019-24853a0d2b9e",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "expand",
                      "value": "<string>"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "72fd5cc9-e3d1-429a-a6d2-b18b06e0dcf1",
          "name": "Mettre à jour un contact",
          "request": {
            "name": "Mettre à jour un contact",
            "description": {
              "content": "Met à jour les champs fournis du contact (champs absents conservés).\nAu moins un champ doit être fourni sinon `400 no_fields`.\n\nLe champ `custom_fields` est **mergé** avec les valeurs existantes\n(les clés non fournies sont conservées). Les clés sont le **nom** du\nchamp (ou l'id de sa définition) ; une clé inconnue retourne\n`400 invalid_custom_fields`. Passer `null` efface tous les champs\npersonnalisés.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "contacts",
                ":id"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "PATCH",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"<email>\",\n  \"first_name\": \"<string,null>\",\n  \"last_name\": \"<string,null>\",\n  \"phone\": \"<string,null>\",\n  \"company\": \"<string,null>\",\n  \"deal_value\": \"<number,null>\",\n  \"is_priority\": \"<boolean>\",\n  \"notes\": \"<string,null>\",\n  \"custom_fields\": {\n    \"key_0\": 3900.2791834286345\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "a8ce49ff-abe5-4a5d-a928-71ec51c1be26",
              "name": "Contact mis à jour.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"first_name\": \"Alexandre\",\n  \"deal_value\": 5000,\n  \"is_priority\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"email\": \"alex@example.com\",\n    \"is_priority\": false,\n    \"created_at\": \"2026-05-04T12:34:56.789Z\",\n    \"updated_at\": \"2026-05-04T12:34:56.789Z\",\n    \"phone\": \"+15145551234\",\n    \"first_name\": \"Alex\",\n    \"last_name\": \"Tremblay\",\n    \"company\": \"Acme Inc.\",\n    \"source\": \"api\",\n    \"pipeline_stage_id\": \"4d437dd4-d7e2-0389-6fcb-f168d34c84a5\",\n    \"deal_value\": 2500,\n    \"custom_fields\": {\n      \"key_0\": \"string\",\n      \"key_1\": 1802,\n      \"key_2\": false,\n      \"key_3\": 8322\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "81c80fc1-5be4-40a1-bf8b-74c4dcceb29d",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"first_name\": \"Alexandre\",\n  \"deal_value\": 5000,\n  \"is_priority\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "7f42c9b1-8606-4f20-9946-228bc1186f68",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"first_name\": \"Alexandre\",\n  \"deal_value\": 5000,\n  \"is_priority\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "103449ed-3933-4020-ad94-aeda5aa180e2",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"first_name\": \"Alexandre\",\n  \"deal_value\": 5000,\n  \"is_priority\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "bf1b4a3f-a858-46dc-873d-eebc459b9d33",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"first_name\": \"Alexandre\",\n  \"deal_value\": 5000,\n  \"is_priority\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "a8ac574e-cecd-47a7-a92a-20619dd2848a",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"first_name\": \"Alexandre\",\n  \"deal_value\": 5000,\n  \"is_priority\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "b89bc84c-a06c-4c79-b6a1-4ba389385d53",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"first_name\": \"Alexandre\",\n  \"deal_value\": 5000,\n  \"is_priority\": true\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "b1226cb9-0f52-4f42-89e0-f4b6563e27ec",
          "name": "Supprimer un contact",
          "request": {
            "name": "Supprimer un contact",
            "description": {
              "content": "Supprime définitivement le contact, exactement comme depuis le tableau\nde bord : sa conversation d'inbox, ses échanges (SMS, courriels,\ntranscriptions de chat), ses rendez-vous et ses fichiers partent avec\nlui. Les ventes, commandes et paiements sont conservés, simplement\ndétachés de la fiche.\n\nLe retrait hors plateforme (rendez-vous au calendrier Google connecté,\nfichiers stockés) est fait dans la foulée, en best-effort : la\nsuppression du contact en base réussit même si un service externe est\nmomentanément injoignable. L'objet `cleanup` de la réponse l'indique —\n`failed` > 0 signifie que des rendez-vous Google n'ont pas pu être\nretirés du calendrier (compte déconnecté, panne) et y restent.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "contacts",
                ":id"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "DELETE",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "25696127-3cc7-4780-96a6-cb2717d344e2",
              "name": "Contact supprimé.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"deleted\": true,\n    \"cleanup\": {\n      \"attempted\": 0,\n      \"succeeded\": 0,\n      \"failed\": 0\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "dc4455f1-c5cd-4db7-8d3c-035bb7b671c9",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "2be007ac-83fe-41ed-9fba-7b2a5d68661a",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "8cd04f11-9c52-4e7a-b038-24d54c2a2aae",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "20709b7c-6f00-4889-959c-a97e0561e3b5",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "4509b817-1eb7-429d-836d-0a911d660b8f",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "beebb484-5636-46dc-82b8-8a2a73aac689",
          "name": "Timeline d'un contact (activités chronologiques)",
          "request": {
            "name": "Timeline d'un contact (activités chronologiques)",
            "description": {
              "content": "Retourne la timeline d'activités du contact (changements de stage,\nenvois SMS/email, RDV, etc.) en ordre chronologique inverse.\n\n### Limitation actuelle\n\nL'implémentation est un stub : la table `pipeline_history` référence\nl'autre table `contacts` interne (et non `client_contacts`), donc\nla liste retournée est **toujours vide** aujourd'hui. La pagination\nest validée mais non appliquée. À implémenter dans une phase\nultérieure quand l'historique sera unifié sur `client_contacts`.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "contacts",
                ":id",
                "timeline"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "cursor",
                  "value": "<string,null>",
                  "description": "Cursor opaque pour pagination — passer la valeur de `pagination.next_cursor` de la page précédente."
                },
                {
                  "disabled": false,
                  "key": "limit",
                  "value": "20",
                  "description": "Nombre max de résultats par page (defaut 20, max 100). Au-delà → 400 invalid_request."
                },
                {
                  "disabled": false,
                  "key": "created_after",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées après cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "created_before",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées avant cette date (inclusive)."
                }
              ],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "b806b8f2-a34e-4d40-9ca0-cb50e827a63f",
              "name": "Liste vide (implémentation stub) avec pagination valide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "timeline"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 20,\n    \"cursor\": null,\n    \"total_count\": 0\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "574e4f66-981d-474f-8e44-350d20c1f143",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "timeline"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "5cb4beea-d79c-4421-a41a-8147f8b05833",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "timeline"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "93f8e822-020e-44c1-b432-2db2eb7be0dd",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "timeline"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "7c4cba4c-a7a8-46c3-8725-9a6012030941",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "timeline"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f037afba-8a76-4946-83a5-2898b139cf46",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "timeline"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "9aca42a3-f2f1-42c5-be19-9d3dccfbe3ef",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "timeline"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "52e11c23-2275-4d73-9a3c-3f0720db8254",
          "name": "Attacher un ou plusieurs tags à un contact",
          "request": {
            "name": "Attacher un ou plusieurs tags à un contact",
            "description": {
              "content": "Attache un ou plusieurs tags au contact via la table de jointure\n`client_contact_tags`. Les tags doivent appartenir au même client\nque le contact — sinon `400 validation_error` avec la liste des\ntags non trouvés.\n\nL'opération est idempotente côté DB : appeler 2 fois avec les\nmêmes `tag_ids` ne crée pas de doublons (upsert\n`ON CONFLICT (contact_id, tag_id) DO NOTHING`).\n\n### Lister les tags d'un contact\n\nIl n'existe pas de `GET` dédié — utiliser\n`GET /v1/contacts/{id}?expand=tags` pour récupérer les tags\nactuellement rattachés.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "contacts",
                ":id",
                "tags"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"tag_ids\": [\n    \"<uuid>\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "ae7cfb70-4a74-4d6e-9458-be04a498b481",
              "name": "Tags attachés. Retourne la liste à jour des tags du contact.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"tag_ids\": [\n    \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"9a4c2b3d-0e5f-5a6b-c7d8-e9f0a1b2c3d4\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"contact_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n    \"tags\": [\n      {\n        \"tag_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n        \"client_tags\": {\n          \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n          \"name\": \"Lead chaud\",\n          \"color\": \"#ef4444\"\n        }\n      }\n    ]\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "a7932172-72e2-48da-9d67-64dcb0e14373",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"tag_ids\": [\n    \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"9a4c2b3d-0e5f-5a6b-c7d8-e9f0a1b2c3d4\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e8687d16-c08c-405e-95d9-444ee35dbb77",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"tag_ids\": [\n    \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"9a4c2b3d-0e5f-5a6b-c7d8-e9f0a1b2c3d4\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "4a5a81ff-6317-46e6-9955-28a8bc441f95",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"tag_ids\": [\n    \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"9a4c2b3d-0e5f-5a6b-c7d8-e9f0a1b2c3d4\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "ad045cef-6551-4d80-8d8e-32e5afe9a91f",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"tag_ids\": [\n    \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"9a4c2b3d-0e5f-5a6b-c7d8-e9f0a1b2c3d4\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "be40fff6-39ef-4823-9fc6-3cf1c3e5696e",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"tag_ids\": [\n    \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"9a4c2b3d-0e5f-5a6b-c7d8-e9f0a1b2c3d4\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "03591d67-e01a-4362-bffa-c5a865e50bf1",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"tag_ids\": [\n    \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"9a4c2b3d-0e5f-5a6b-c7d8-e9f0a1b2c3d4\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "a34b5909-bd4d-42f9-b497-6ab9e6c09a41",
          "name": "Détacher un tag d'un contact",
          "request": {
            "name": "Détacher un tag d'un contact",
            "description": {
              "content": "Retire l'association entre un contact et un tag. Le tag lui-même\nn'est pas supprimé — il reste disponible pour d'autres contacts.\n\nSi le tag n'est pas attaché au contact (ou si le contact appartient\nà un autre client), retourne `404 resource_not_found`.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "contacts",
                ":id",
                "tags",
                ":tagId"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                },
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "tagId",
                  "description": "(Required) UUID du tag à détacher."
                }
              ]
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "DELETE",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "1dae6959-6d53-4a29-b733-2a6c863c5b13",
              "name": "Tag détaché.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags",
                    ":tagId"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    },
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "tagId",
                      "description": "(Required) UUID du tag à détacher."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"contact_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n    \"tag_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"removed\": true\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "4ad32e29-99f8-45d5-b9ae-633c94568c8b",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags",
                    ":tagId"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    },
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "tagId",
                      "description": "(Required) UUID du tag à détacher."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "88e075b9-3ba0-42a1-9554-8145622c0918",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags",
                    ":tagId"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    },
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "tagId",
                      "description": "(Required) UUID du tag à détacher."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "301b3cb9-8e4b-4beb-b73f-17561d175534",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags",
                    ":tagId"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    },
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "tagId",
                      "description": "(Required) UUID du tag à détacher."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "7a72a155-b228-46e1-94b2-a7a982905e2d",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags",
                    ":tagId"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    },
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "tagId",
                      "description": "(Required) UUID du tag à détacher."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "c7a1aed2-b4c2-4ce7-b945-d24d4b2b9d72",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    ":id",
                    "tags",
                    ":tagId"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    },
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "tagId",
                      "description": "(Required) UUID du tag à détacher."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "e7917a05-3e1a-4169-bb37-dfa299a6e9f3",
          "name": "Créer ou mettre à jour plusieurs contacts en une requête",
          "request": {
            "name": "Créer ou mettre à jour plusieurs contacts en une requête",
            "description": {
              "content": "Upsert atomique de jusqu'à 100 contacts en une seule requête. Les\ncontacts dont l'email existe déjà sous le client sont **mis à jour**\n(les autres champs fournis remplacent les valeurs existantes), les\nautres sont **insérés**.\n\n### Déduplication interne\n\nLe payload est dédupliqué en interne par `lower(email)` (last-entry\nwins) avant l'upsert. L'ordre des contacts dans le tableau et la\ncasse de l'email n'affectent pas le hash idempotency.\n\n### Idempotency\n\nLe header `Idempotency-Key` est **optionnel mais recommandé**. Le\nhash idempotency porte sur le payload **après dédup interne** —\nretry réseau idempotent même si le client renvoie les contacts dans\nun ordre différent ou avec une casse email différente.\n\n### Réponse\n\nL'endpoint retourne `200` avec `{data: {processed, contacts: []}}`\n— pas de multi-status par contact. Une erreur de validation sur un\nseul contact rejette l'ensemble du batch (`400 validation_error`\navec `details` listant chaque ligne fautive). Une erreur DB en\ncours d'upsert retourne `500` — les contacts déjà persistés\navant l'erreur restent (pas de rollback transactionnel\ncross-statements).\n\nQuand `system_id` est fourni et résolu vers un Système actif, la\nréponse inclut aussi `system_routing` : le bilan du routage des\ncontacts **créés** vers ce Système. Le routage est best-effort\n(l'upsert est déjà commité quand il tourne) — `refused + errors` =\ncontacts créés restés dans le Système principal.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "contacts",
                "batch"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "disabled": false,
                "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                "key": "Idempotency-Key",
                "value": "<string>"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"contacts\": [\n    {\n      \"email\": \"<email>\",\n      \"first_name\": \"<string>\",\n      \"last_name\": \"<string>\",\n      \"phone\": \"<string>\",\n      \"company\": \"<string>\",\n      \"deal_value\": \"<number>\",\n      \"custom_fields\": {\n        \"key_0\": 6479\n      },\n      \"system_id\": \"<uuid>\"\n    }\n  ],\n  \"system_id\": \"<uuid>\",\n  \"trigger_automations\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "011a78a7-6898-41af-95fd-366ee93b6401",
              "name": "Batch traité. `processed` = nombre de contacts insérés ou mis à jour avec succès.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    "batch"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contacts\": [\n    {\n      \"email\": \"alex@example.com\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Tremblay\",\n      \"phone\": \"+15145551234\",\n      \"company\": \"Acme Inc.\",\n      \"deal_value\": 2500\n    },\n    {\n      \"email\": \"morgan@example.com\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Bélanger\",\n      \"company\": \"Example Inc.\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"processed\": 2,\n    \"automations_enrolled\": 0,\n    \"automations_skipped_rate_limit\": 0,\n    \"sequences_enrolled\": 0,\n    \"contacts\": [\n      {\n        \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n        \"email\": \"alex@example.com\",\n        \"first_name\": \"Alex\",\n        \"last_name\": \"Tremblay\",\n        \"phone\": \"+15145551234\",\n        \"company\": \"Acme Inc.\",\n        \"deal_value\": 2500,\n        \"created_at\": \"2026-04-01T10:00:00.000Z\",\n        \"updated_at\": \"2026-05-04T10:00:00.000Z\"\n      },\n      {\n        \"id\": \"9a4c2b3d-0e5f-5a6b-c7d8-e9f0a1b2c3d4\",\n        \"email\": \"morgan@example.com\",\n        \"first_name\": \"Morgan\",\n        \"last_name\": \"Bélanger\",\n        \"phone\": null,\n        \"company\": \"Example Inc.\",\n        \"deal_value\": null,\n        \"created_at\": \"2026-05-04T10:00:00.000Z\",\n        \"updated_at\": \"2026-05-04T10:00:00.000Z\"\n      }\n    ]\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "ee3d54c8-c175-44ef-a939-f836aa9abbf5",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    "batch"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contacts\": [\n    {\n      \"email\": \"alex@example.com\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Tremblay\",\n      \"phone\": \"+15145551234\",\n      \"company\": \"Acme Inc.\",\n      \"deal_value\": 2500\n    },\n    {\n      \"email\": \"morgan@example.com\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Bélanger\",\n      \"company\": \"Example Inc.\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "fba47f3b-86ce-44bc-9b0b-87d84e932c87",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    "batch"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contacts\": [\n    {\n      \"email\": \"alex@example.com\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Tremblay\",\n      \"phone\": \"+15145551234\",\n      \"company\": \"Acme Inc.\",\n      \"deal_value\": 2500\n    },\n    {\n      \"email\": \"morgan@example.com\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Bélanger\",\n      \"company\": \"Example Inc.\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "3d41fbde-2347-4c52-a0aa-61da5c8f099a",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    "batch"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contacts\": [\n    {\n      \"email\": \"alex@example.com\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Tremblay\",\n      \"phone\": \"+15145551234\",\n      \"company\": \"Acme Inc.\",\n      \"deal_value\": 2500\n    },\n    {\n      \"email\": \"morgan@example.com\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Bélanger\",\n      \"company\": \"Example Inc.\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "a02a4baa-5dae-4f4d-90ed-0488a7c0dc38",
              "name": "Une requête précédente avec la même `Idempotency-Key` a utilisé un payload différent,\nou est encore en cours de traitement.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    "batch"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contacts\": [\n    {\n      \"email\": \"alex@example.com\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Tremblay\",\n      \"phone\": \"+15145551234\",\n      \"company\": \"Acme Inc.\",\n      \"deal_value\": 2500\n    },\n    {\n      \"email\": \"morgan@example.com\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Bélanger\",\n      \"company\": \"Example Inc.\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"idempotency_error\",\n    \"code\": \"idempotency_conflict\",\n    \"message\": \"Une requête avec cette Idempotency-Key existe avec un payload différent.\",\n    \"hint\": \"Utilise une nouvelle Idempotency-Key, ou rejoue la requête originale à l'identique.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#idempotency\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"idempotency_key\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n      \"original_request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T6\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "8d89564b-351d-4378-9695-adf69fc079a4",
              "name": "Le header `Content-Type` est manquant ou non supporté pour cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    "batch"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contacts\": [\n    {\n      \"email\": \"alex@example.com\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Tremblay\",\n      \"phone\": \"+15145551234\",\n      \"company\": \"Acme Inc.\",\n      \"deal_value\": 2500\n    },\n    {\n      \"email\": \"morgan@example.com\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Bélanger\",\n      \"company\": \"Example Inc.\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unsupported Media Type",
              "code": 415,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_content_type\",\n    \"message\": \"Content-Type `text/plain` non supporté. Utilise `application/json`.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#content-type\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"received\": \"text/plain\",\n      \"expected\": [\n        \"application/json\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "7681270e-7b29-416d-b114-5834662a4c3b",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    "batch"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contacts\": [\n    {\n      \"email\": \"alex@example.com\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Tremblay\",\n      \"phone\": \"+15145551234\",\n      \"company\": \"Acme Inc.\",\n      \"deal_value\": 2500\n    },\n    {\n      \"email\": \"morgan@example.com\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Bélanger\",\n      \"company\": \"Example Inc.\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "73eac28c-b896-4e8a-8a1b-048ab4f34be9",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "contacts",
                    "batch"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contacts\": [\n    {\n      \"email\": \"alex@example.com\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Tremblay\",\n      \"phone\": \"+15145551234\",\n      \"company\": \"Acme Inc.\",\n      \"deal_value\": 2500\n    },\n    {\n      \"email\": \"morgan@example.com\",\n      \"first_name\": \"Morgan\",\n      \"last_name\": \"Bélanger\",\n      \"company\": \"Example Inc.\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "be366359-14c0-496d-8bbb-e4d27ab6aa1a",
      "name": "Conversations",
      "description": {
        "content": "Threads de discussion (chat, SMS, appel, email) unifiés",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "fdb16934-591b-4096-83ba-3465154a19f4",
          "name": "Lister les conversations",
          "request": {
            "name": "Lister les conversations",
            "description": {
              "content": "Retourne la liste paginée des conversations (threads de chat) du\nclient (cursor v2). Tri stable `created_at DESC, id DESC`.\n\nUne conversation agrège les messages d'un visiteur avec un agent\n(IA ou humain) sous le client appelant. La création de threads et\nl'envoi de messages se font côté front-end / SDK chat — l'API\npublique expose la lecture seule.\n\n### Filtres\n\n- `?agent_slug` — filtre exact sur l'agent IA répondant dans le thread.\n- `?source` — filtre exact sur la source du thread (URL, label de\n  funnel, `widget`, etc.).\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "conversations"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "cursor",
                  "value": "<string,null>",
                  "description": "Cursor opaque pour pagination — passer la valeur de `pagination.next_cursor` de la page précédente."
                },
                {
                  "disabled": false,
                  "key": "limit",
                  "value": "20",
                  "description": "Nombre max de résultats par page (defaut 20, max 100). Au-delà → 400 invalid_request."
                },
                {
                  "disabled": false,
                  "key": "created_after",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées après cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "created_before",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées avant cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "agent_slug",
                  "value": "<string>",
                  "description": "Slug de l'agent IA — filtre exact sur les threads servis par cet agent."
                },
                {
                  "disabled": false,
                  "key": "source",
                  "value": "<string>",
                  "description": "Source du thread — filtre exact (URL, label de funnel, `widget`, etc.)."
                }
              ],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "93d566ee-9a9e-41c9-a1cc-7e32e2aafe50",
              "name": "Liste paginée des conversations.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "agent_slug",
                      "value": "<string>"
                    },
                    {
                      "key": "source",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Tremblay\",\n      \"email\": \"alex@example.com\",\n      \"phone\": \"+15145551234\",\n      \"agent_slug\": \"support-ventes\",\n      \"source\": \"widget\",\n      \"message_count\": 12,\n      \"last_message_at\": \"2026-05-04T12:34:56.789Z\",\n      \"contact_id\": null,\n      \"created_at\": \"2026-05-04T10:00:00.000Z\",\n      \"updated_at\": \"2026-05-04T12:34:56.789Z\"\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 20,\n    \"cursor\": null,\n    \"total_count\": 1\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "79033a20-bf42-4ce8-bec8-abac1f03e513",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "agent_slug",
                      "value": "<string>"
                    },
                    {
                      "key": "source",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "ab245023-77e2-4218-a714-9997c2dfe783",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "agent_slug",
                      "value": "<string>"
                    },
                    {
                      "key": "source",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "a8b84ab1-cffc-4ffa-a8d1-55f93024ece5",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "agent_slug",
                      "value": "<string>"
                    },
                    {
                      "key": "source",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "c820273f-aefa-4481-9a32-4816a0b9d35a",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "agent_slug",
                      "value": "<string>"
                    },
                    {
                      "key": "source",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "05763a92-10f7-420c-a18b-db978ee819dd",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "agent_slug",
                      "value": "<string>"
                    },
                    {
                      "key": "source",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "46293901-2dcc-44f3-86f4-09ca6e758aed",
          "name": "Récupérer une conversation",
          "request": {
            "name": "Récupérer une conversation",
            "description": {
              "content": "Retourne les méta-données d'une conversation par son ID. Pour\nrécupérer les messages individuels, utiliser\n`GET /v1/conversations/{id}/messages`.\n\nSi la conversation appartient à un autre client (ou n'existe pas),\nretourne `404 resource_not_found` — l'isolation tenant masque\nl'existence des conversations hors du client appelant.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "conversations",
                ":id"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "8a994475-a05f-4e41-b00e-d14daf194ddf",
              "name": "Conversation trouvée.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"first_name\": \"Alex\",\n    \"last_name\": \"Tremblay\",\n    \"email\": \"alex@example.com\",\n    \"phone\": \"+15145551234\",\n    \"agent_slug\": \"support-ventes\",\n    \"source\": \"widget\",\n    \"message_count\": 12,\n    \"last_message_at\": \"2026-05-04T12:34:56.789Z\",\n    \"contact_id\": null,\n    \"created_at\": \"2026-05-04T10:00:00.000Z\",\n    \"updated_at\": \"2026-05-04T12:34:56.789Z\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "3bda5297-ea5b-4381-894c-42dcaeb449d0",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "7385798b-360b-4024-9046-21be37063356",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "bf7576df-64fd-456b-ac02-68976611c8ed",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "72393b84-e29d-4496-b63c-a494a07128d9",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "672eb905-bc09-4323-8767-344b7880903e",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "40346729-9587-4042-94d2-e76c594fd818",
          "name": "Lister les messages d'une conversation",
          "request": {
            "name": "Lister les messages d'une conversation",
            "description": {
              "content": "Retourne la liste paginée des messages d'une conversation en\n**ordre chronologique de lecture** (`created_at ASC, id ASC`),\navec un tiebreaker `id` pour éviter les doublons ou skips entre\ndeux pages quand plusieurs messages partagent la même milliseconde.\n\nCette direction de tri (ASC) est inversée par rapport aux autres\nlist endpoints v2 (DESC) — la lecture naturelle d'une conversation\nsuit l'ordre chronologique des échanges.\n\nSi la conversation appartient à un autre client (ou n'existe pas),\nretourne `404 resource_not_found`.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "conversations",
                ":id",
                "messages"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "cursor",
                  "value": "<string,null>",
                  "description": "Cursor opaque pour pagination — passer la valeur de `pagination.next_cursor` de la page précédente."
                },
                {
                  "disabled": false,
                  "key": "limit",
                  "value": "20",
                  "description": "Nombre max de résultats par page (defaut 20, max 100). Au-delà → 400 invalid_request."
                }
              ],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "893232d2-fa39-413b-952e-ba8039877b03",
              "name": "Liste paginée des messages (ordre chronologique).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id",
                    "messages"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n      \"role\": \"user\",\n      \"content\": \"Bonjour, j'aimerais en savoir plus sur vos services.\",\n      \"created_at\": \"2026-05-04T10:00:00.000Z\"\n    },\n    {\n      \"id\": \"9a4c2b3d-0e5f-5a6b-c7d8-e9f0a1b2c3d4\",\n      \"role\": \"assistant\",\n      \"content\": \"Bonjour Alex ! Avec plaisir — quel besoin cherchez-vous à résoudre ?\",\n      \"created_at\": \"2026-05-04T10:00:05.000Z\"\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 20,\n    \"cursor\": null,\n    \"total_count\": 2\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e1cecf71-2fdc-4a27-a72a-3001ba0dfa20",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id",
                    "messages"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "0c54099e-c717-43a8-b5c6-c997e057c6ee",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id",
                    "messages"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "a06a4a82-8699-41c4-bd73-f3d41f54bbd8",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id",
                    "messages"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "af13fd1b-325b-423f-9efe-e8cc8a1ad7bd",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id",
                    "messages"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f560a00c-ffc1-40fa-a18e-84ea8d2adec6",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id",
                    "messages"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "0fd4a625-8ec3-4e80-95a1-8783bc0ee8d3",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "conversations",
                    ":id",
                    "messages"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "d97bb2a8-e476-4da2-ba23-c4460bd3ae3b",
      "name": "Bookings",
      "description": {
        "content": "Rendez-vous calendrier",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "b0d7b63e-f38d-4856-b6e5-2e7d37bcd15a",
          "name": "Lister les rendez-vous",
          "request": {
            "name": "Lister les rendez-vous",
            "description": {
              "content": "Retourne la liste paginée des rendez-vous (cursor v2). Tri stable\n`start_datetime DESC, id DESC` — les rendez-vous à venir apparaissent\nd'abord, puis l'historique.\n\nL'isolation tenant est appliquée via une résolution préalable des\nprojets autorisés : si le client n'a aucun projet, la liste retournée\nest vide (pas d'erreur).\n\n### Filtres\n\n- `?from` (ISO 8601) — `start_datetime >= from`\n- `?to` (ISO 8601) — `start_datetime <= to`\n- `?status` — filtre exact (`confirmed`, `cancelled`, etc.)\n- `?project_id` — filtre exact ; un `project_id` qui n'appartient pas\n  au client retourne une liste vide (pas une erreur).\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "bookings"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "cursor",
                  "value": "<string,null>",
                  "description": "Cursor opaque pour pagination — passer la valeur de `pagination.next_cursor` de la page précédente."
                },
                {
                  "disabled": false,
                  "key": "limit",
                  "value": "20",
                  "description": "Nombre max de résultats par page (defaut 20, max 100). Au-delà → 400 invalid_request."
                },
                {
                  "disabled": false,
                  "key": "from",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les rendez-vous dont `start_datetime >= from`."
                },
                {
                  "disabled": false,
                  "key": "to",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les rendez-vous dont `start_datetime <= to`."
                },
                {
                  "disabled": false,
                  "key": "status",
                  "value": "<string>",
                  "description": "Filtre exact sur le statut (`confirmed`, `cancelled`, etc.)."
                },
                {
                  "disabled": false,
                  "key": "project_id",
                  "value": "<uuid>",
                  "description": "Filtre par projet client. Un `project_id` hors du client retourne une liste vide."
                }
              ],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "abaafc56-f2ec-4388-8639-f430602f1647",
              "name": "Liste paginée des rendez-vous.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "from",
                      "value": "<dateTime>"
                    },
                    {
                      "key": "to",
                      "value": "<dateTime>"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    },
                    {
                      "key": "project_id",
                      "value": "<uuid>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n      \"event_type_id\": null,\n      \"project_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n      \"guest_name\": \"Alex Tremblay\",\n      \"guest_email\": \"alex@example.com\",\n      \"guest_phone\": \"+15145551234\",\n      \"start_datetime\": \"2026-05-10T14:00:00.000Z\",\n      \"end_datetime\": \"2026-05-10T15:00:00.000Z\",\n      \"timezone\": \"America/Montreal\",\n      \"status\": \"confirmed\",\n      \"source\": \"api\",\n      \"notes\": null,\n      \"meeting_link\": null,\n      \"video_provider\": null,\n      \"cancelled_at\": null,\n      \"cancel_reason\": null,\n      \"assigned_to_id\": null,\n      \"zoom_join_url\": null,\n      \"created_at\": \"2026-05-04T10:00:00.000Z\",\n      \"updated_at\": \"2026-05-04T10:00:00.000Z\"\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 20,\n    \"cursor\": null,\n    \"total_count\": 1\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "bb8fa232-2e29-4d79-b449-d8ca61410deb",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "from",
                      "value": "<dateTime>"
                    },
                    {
                      "key": "to",
                      "value": "<dateTime>"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    },
                    {
                      "key": "project_id",
                      "value": "<uuid>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "edacc271-e79a-4deb-bfa6-8add331bf253",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "from",
                      "value": "<dateTime>"
                    },
                    {
                      "key": "to",
                      "value": "<dateTime>"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    },
                    {
                      "key": "project_id",
                      "value": "<uuid>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "bbd07af4-b17f-4c30-a729-6ee82d9e3048",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "from",
                      "value": "<dateTime>"
                    },
                    {
                      "key": "to",
                      "value": "<dateTime>"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    },
                    {
                      "key": "project_id",
                      "value": "<uuid>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e75ffb10-b9e5-4c29-a606-3892f0294584",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "from",
                      "value": "<dateTime>"
                    },
                    {
                      "key": "to",
                      "value": "<dateTime>"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    },
                    {
                      "key": "project_id",
                      "value": "<uuid>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "1dd5dbc3-40d4-45c9-91b3-671734aeac11",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "from",
                      "value": "<dateTime>"
                    },
                    {
                      "key": "to",
                      "value": "<dateTime>"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    },
                    {
                      "key": "project_id",
                      "value": "<uuid>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "6677a9a5-cfbd-4817-b133-f73eeec8a086",
          "name": "Créer un rendez-vous",
          "request": {
            "name": "Créer un rendez-vous",
            "description": {
              "content": "Crée un rendez-vous dans le projet ciblé. Le `project_id` doit\nappartenir au client appelant — sinon `404 resource_not_found`.\nS'il est fourni, `event_type_id` doit référencer un type d'événement\nactif du catalogue Capturia — sinon `404 resource_not_found`, sans\ncréation.\n\nLes champs `status` et `source` ne sont pas acceptés du caller :\nforcés à `confirmed` / `api` côté serveur. Pour annuler un\nrendez-vous, utiliser `DELETE /v1/bookings/{id}` (soft cancel).\n\n### Format des dates\n\nAucune validation côté serveur du format ISO 8601 sur\n`start_datetime` / `end_datetime` — les valeurs sont transmises\ntelles quelles à Postgres qui rejettera un format invalide\n(`500 internal_error`). Préférer ISO 8601 UTC (`...Z`) pour éviter\nles ambiguïtés de fuseau.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "bookings"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"project_id\": \"<uuid>\",\n  \"guest_name\": \"<string>\",\n  \"guest_email\": \"<email>\",\n  \"start_datetime\": \"<dateTime>\",\n  \"end_datetime\": \"<dateTime>\",\n  \"guest_phone\": \"<string>\",\n  \"timezone\": \"<string>\",\n  \"notes\": \"<string>\",\n  \"event_type_id\": \"<uuid>\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "695a7c93-8336-4d5c-822b-68dceefd07e9",
              "name": "Rendez-vous créé.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"project_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n  \"guest_name\": \"Alex Tremblay\",\n  \"guest_email\": \"alex@example.com\",\n  \"guest_phone\": \"+15145551234\",\n  \"start_datetime\": \"2026-05-10T14:00:00.000Z\",\n  \"end_datetime\": \"2026-05-10T15:00:00.000Z\",\n  \"timezone\": \"America/Montreal\",\n  \"notes\": \"Premier rendez-vous découverte\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"event_type_id\": null,\n    \"project_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n    \"guest_name\": \"Alex Tremblay\",\n    \"guest_email\": \"alex@example.com\",\n    \"guest_phone\": \"+15145551234\",\n    \"start_datetime\": \"2026-05-10T14:00:00.000Z\",\n    \"end_datetime\": \"2026-05-10T15:00:00.000Z\",\n    \"timezone\": \"America/Montreal\",\n    \"status\": \"confirmed\",\n    \"source\": \"api\",\n    \"notes\": \"Premier rendez-vous découverte\",\n    \"meeting_link\": null,\n    \"video_provider\": null,\n    \"cancelled_at\": null,\n    \"cancel_reason\": null,\n    \"assigned_to_id\": null,\n    \"zoom_join_url\": null,\n    \"created_at\": \"2026-05-04T10:00:00.000Z\",\n    \"updated_at\": \"2026-05-04T10:00:00.000Z\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "6e6eda1f-26fa-420b-a00b-cbc4a401a00f",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"project_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n  \"guest_name\": \"Alex Tremblay\",\n  \"guest_email\": \"alex@example.com\",\n  \"guest_phone\": \"+15145551234\",\n  \"start_datetime\": \"2026-05-10T14:00:00.000Z\",\n  \"end_datetime\": \"2026-05-10T15:00:00.000Z\",\n  \"timezone\": \"America/Montreal\",\n  \"notes\": \"Premier rendez-vous découverte\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "3c16df0a-d286-476f-8bab-5b86d6f8bbb1",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"project_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n  \"guest_name\": \"Alex Tremblay\",\n  \"guest_email\": \"alex@example.com\",\n  \"guest_phone\": \"+15145551234\",\n  \"start_datetime\": \"2026-05-10T14:00:00.000Z\",\n  \"end_datetime\": \"2026-05-10T15:00:00.000Z\",\n  \"timezone\": \"America/Montreal\",\n  \"notes\": \"Premier rendez-vous découverte\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "508d24ec-8351-4c73-ab3a-bbf611ad2c33",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"project_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n  \"guest_name\": \"Alex Tremblay\",\n  \"guest_email\": \"alex@example.com\",\n  \"guest_phone\": \"+15145551234\",\n  \"start_datetime\": \"2026-05-10T14:00:00.000Z\",\n  \"end_datetime\": \"2026-05-10T15:00:00.000Z\",\n  \"timezone\": \"America/Montreal\",\n  \"notes\": \"Premier rendez-vous découverte\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e52928e1-1fff-4158-811f-b6f184b6bc9c",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"project_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n  \"guest_name\": \"Alex Tremblay\",\n  \"guest_email\": \"alex@example.com\",\n  \"guest_phone\": \"+15145551234\",\n  \"start_datetime\": \"2026-05-10T14:00:00.000Z\",\n  \"end_datetime\": \"2026-05-10T15:00:00.000Z\",\n  \"timezone\": \"America/Montreal\",\n  \"notes\": \"Premier rendez-vous découverte\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "65d84dd3-17a2-453e-bc24-8fdaaeda0a0a",
              "name": "Le header `Content-Type` est manquant ou non supporté pour cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"project_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n  \"guest_name\": \"Alex Tremblay\",\n  \"guest_email\": \"alex@example.com\",\n  \"guest_phone\": \"+15145551234\",\n  \"start_datetime\": \"2026-05-10T14:00:00.000Z\",\n  \"end_datetime\": \"2026-05-10T15:00:00.000Z\",\n  \"timezone\": \"America/Montreal\",\n  \"notes\": \"Premier rendez-vous découverte\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unsupported Media Type",
              "code": 415,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_content_type\",\n    \"message\": \"Content-Type `text/plain` non supporté. Utilise `application/json`.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#content-type\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"received\": \"text/plain\",\n      \"expected\": [\n        \"application/json\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "d8097ce2-1af8-4d50-bd40-4fae46893873",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"project_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n  \"guest_name\": \"Alex Tremblay\",\n  \"guest_email\": \"alex@example.com\",\n  \"guest_phone\": \"+15145551234\",\n  \"start_datetime\": \"2026-05-10T14:00:00.000Z\",\n  \"end_datetime\": \"2026-05-10T15:00:00.000Z\",\n  \"timezone\": \"America/Montreal\",\n  \"notes\": \"Premier rendez-vous découverte\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "01eb468c-e1ae-48fe-bec5-2c2e8adc1b9f",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"project_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n  \"guest_name\": \"Alex Tremblay\",\n  \"guest_email\": \"alex@example.com\",\n  \"guest_phone\": \"+15145551234\",\n  \"start_datetime\": \"2026-05-10T14:00:00.000Z\",\n  \"end_datetime\": \"2026-05-10T15:00:00.000Z\",\n  \"timezone\": \"America/Montreal\",\n  \"notes\": \"Premier rendez-vous découverte\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "4dcffa96-b5dd-4d4b-9e9e-0cd9f7ecf801",
          "name": "Annuler un rendez-vous (soft cancel)",
          "request": {
            "name": "Annuler un rendez-vous (soft cancel)",
            "description": {
              "content": "**Soft cancel** — le rendez-vous n'est pas supprimé physiquement :\nson `status` passe à `cancelled` et `cancelled_at` est horodaté.\nLa réponse `200` retourne ces 3 champs (et non `204 No Content`).\n\nUn second `DELETE` sur un rendez-vous déjà annulé retourne\n`409 already_cancelled` — l'opération n'est pas idempotente côté\nstatut HTTP.\n\nPour modifier un rendez-vous existant (changement d'horaire, de\nnotes), il faut l'annuler et en créer un nouveau — il n'y a pas\nde méthode `PATCH` sur cet endpoint.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "bookings",
                ":id"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "DELETE",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "72ab9278-c8f4-4f80-82cd-014daf2fc8f0",
              "name": "Rendez-vous annulé. Retourne le statut et l'horodatage de l'annulation.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"status\": \"cancelled\",\n    \"cancelled_at\": \"2026-05-04T12:00:00.000Z\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "2ca00e1e-2817-422b-83eb-09aae963be4e",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "20629c8d-fb21-43db-8987-afdb791f467f",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e736a306-1d62-4798-a43c-42acfb19660c",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "2dcd5847-5b28-449c-8b3a-ed4b7b02d328",
              "name": "La requête est syntaxiquement valide mais viole une règle métier.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Conflict",
              "code": 409,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"business_rule_error\",\n    \"code\": \"business_rule_violation\",\n    \"message\": \"Impossible d'envoyer un devis déjà accepté.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#business_rule_violation\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"rule\": \"quote_already_accepted\",\n      \"current_state\": \"accepted\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e6657825-ebac-40fb-8bdc-588a153bc7b3",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "ad2cb0a1-f66f-4acc-a34d-4dff344cccad",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "bookings",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "f5b10eb8-9e39-4daf-8000-50157df8f9fa",
      "name": "Quotes",
      "description": {
        "content": "Devis et propositions commerciales",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "2d9b3f60-26d6-47b0-9e84-15a89a9e90f9",
          "name": "Lister les devis",
          "request": {
            "name": "Lister les devis",
            "description": {
              "content": "Retourne la liste paginée des devis du client (cursor v2). Tri stable\n`created_at DESC, id DESC`.\n\nLes devis archivés (`archived_at IS NOT NULL`) sont exclus par\ndéfaut — l'API publique ne les expose pas. Pour récupérer un devis\narchivé, utiliser le dashboard.\n\n### Filtres\n\n- `?status` — filtre exact (`draft`, `sent`, `signed`, `cancelled`)\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "quotes"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "cursor",
                  "value": "<string,null>",
                  "description": "Cursor opaque pour pagination — passer la valeur de `pagination.next_cursor` de la page précédente."
                },
                {
                  "disabled": false,
                  "key": "limit",
                  "value": "20",
                  "description": "Nombre max de résultats par page (defaut 20, max 100). Au-delà → 400 invalid_request."
                },
                {
                  "disabled": false,
                  "key": "created_after",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées après cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "created_before",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées avant cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "status",
                  "value": "<string>",
                  "description": "Filtre exact sur le cycle de vie du devis."
                }
              ],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "cd3f5d12-02d4-4489-ba96-a10e015e1ad4",
              "name": "Liste paginée des devis.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n      \"client_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n      \"quote_number\": \"DEV-2026-0042\",\n      \"status\": \"draft\",\n      \"prospect_name\": \"Alex Tremblay\",\n      \"prospect_email\": \"alex@example.com\",\n      \"prospect_phone\": \"+15145551234\",\n      \"prospect_company\": \"Acme Inc.\",\n      \"prospect_address\": null,\n      \"subtotal\": null,\n      \"tps_amount\": null,\n      \"tvq_amount\": null,\n      \"total\": null,\n      \"valid_until\": \"2026-06-30\",\n      \"payment_terms\": \"Net 30\",\n      \"sent_at\": null,\n      \"first_viewed_at\": null,\n      \"signed_at\": null,\n      \"sales_rep_id\": null,\n      \"created_at\": \"2026-05-04T10:00:00.000Z\",\n      \"updated_at\": \"2026-05-04T10:00:00.000Z\"\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 20,\n    \"cursor\": null,\n    \"total_count\": 1\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "84fe5d08-c6db-4ff5-a766-62d1864d4a89",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "99204ddd-b879-455a-bcfb-1789267ed850",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "8c7566d4-de06-4564-bb03-6e4ccf9a8292",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "80b41358-28ce-4879-8a07-25959d5782e1",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "d2cf97a4-478a-4d57-b867-19fabaef7f73",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "d3127e7c-5a35-4591-9fc7-68b0cb73cf05",
          "name": "Créer un devis",
          "request": {
            "name": "Créer un devis",
            "description": {
              "content": "Crée un devis vide (`status=\"draft\"`, `blocks=[]`). Pour ajouter\ndes lignes, calculer les montants, ou envoyer le devis au prospect,\nutiliser le dashboard ou l'endpoint `POST /v1/quotes/{id}/send`.\n\nLe `quote_number` doit être unique par client (contrainte DB) — un\ndoublon retourne `500 internal_error` (pas encore mappé en\n`409 duplicate_resource`).\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "quotes"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"quote_number\": \"<string>\",\n  \"prospect_name\": \"<string>\",\n  \"prospect_email\": \"<email>\",\n  \"prospect_phone\": \"<string>\",\n  \"prospect_company\": \"<string>\",\n  \"prospect_address\": \"<string>\",\n  \"valid_until\": \"<date>\",\n  \"payment_terms\": \"<string>\",\n  \"internal_notes\": \"<string>\",\n  \"sales_rep_id\": \"<uuid>\",\n  \"tax_profile_id\": \"<uuid>\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "e2a7fa31-82ed-47c1-b073-1b992f40a784",
              "name": "Devis créé.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quote_number\": \"DEV-2026-0042\",\n  \"prospect_name\": \"Alex Tremblay\",\n  \"prospect_email\": \"alex@example.com\",\n  \"prospect_phone\": \"+15145551234\",\n  \"prospect_company\": \"Acme Inc.\",\n  \"valid_until\": \"2026-06-30\",\n  \"payment_terms\": \"Net 30\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"client_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n    \"quote_number\": \"DEV-2026-0042\",\n    \"status\": \"draft\",\n    \"prospect_name\": \"Alex Tremblay\",\n    \"prospect_email\": \"alex@example.com\",\n    \"prospect_phone\": \"+15145551234\",\n    \"prospect_company\": \"Acme Inc.\",\n    \"prospect_address\": null,\n    \"subtotal\": null,\n    \"tps_amount\": null,\n    \"tvq_amount\": null,\n    \"total\": null,\n    \"valid_until\": \"2026-06-30\",\n    \"payment_terms\": \"Net 30\",\n    \"sent_at\": null,\n    \"first_viewed_at\": null,\n    \"signed_at\": null,\n    \"sales_rep_id\": null,\n    \"created_at\": \"2026-05-04T10:00:00.000Z\",\n    \"updated_at\": \"2026-05-04T10:00:00.000Z\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f3f2f5a6-b0df-40ad-92c7-9755810ab9c0",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quote_number\": \"DEV-2026-0042\",\n  \"prospect_name\": \"Alex Tremblay\",\n  \"prospect_email\": \"alex@example.com\",\n  \"prospect_phone\": \"+15145551234\",\n  \"prospect_company\": \"Acme Inc.\",\n  \"valid_until\": \"2026-06-30\",\n  \"payment_terms\": \"Net 30\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "3f60ea05-632d-4621-8cbe-e9a73f9fc34b",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quote_number\": \"DEV-2026-0042\",\n  \"prospect_name\": \"Alex Tremblay\",\n  \"prospect_email\": \"alex@example.com\",\n  \"prospect_phone\": \"+15145551234\",\n  \"prospect_company\": \"Acme Inc.\",\n  \"valid_until\": \"2026-06-30\",\n  \"payment_terms\": \"Net 30\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f4638ad4-7484-407a-a3ec-74dbe760750b",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quote_number\": \"DEV-2026-0042\",\n  \"prospect_name\": \"Alex Tremblay\",\n  \"prospect_email\": \"alex@example.com\",\n  \"prospect_phone\": \"+15145551234\",\n  \"prospect_company\": \"Acme Inc.\",\n  \"valid_until\": \"2026-06-30\",\n  \"payment_terms\": \"Net 30\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e6bafc17-0aca-4c8e-ad80-e6500f8d00ec",
              "name": "Le header `Content-Type` est manquant ou non supporté pour cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quote_number\": \"DEV-2026-0042\",\n  \"prospect_name\": \"Alex Tremblay\",\n  \"prospect_email\": \"alex@example.com\",\n  \"prospect_phone\": \"+15145551234\",\n  \"prospect_company\": \"Acme Inc.\",\n  \"valid_until\": \"2026-06-30\",\n  \"payment_terms\": \"Net 30\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unsupported Media Type",
              "code": 415,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_content_type\",\n    \"message\": \"Content-Type `text/plain` non supporté. Utilise `application/json`.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#content-type\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"received\": \"text/plain\",\n      \"expected\": [\n        \"application/json\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "8f94a897-5e99-45df-b885-a8a61a93ede4",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quote_number\": \"DEV-2026-0042\",\n  \"prospect_name\": \"Alex Tremblay\",\n  \"prospect_email\": \"alex@example.com\",\n  \"prospect_phone\": \"+15145551234\",\n  \"prospect_company\": \"Acme Inc.\",\n  \"valid_until\": \"2026-06-30\",\n  \"payment_terms\": \"Net 30\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "73efe4a3-0b85-4beb-9340-933e1d98b718",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"quote_number\": \"DEV-2026-0042\",\n  \"prospect_name\": \"Alex Tremblay\",\n  \"prospect_email\": \"alex@example.com\",\n  \"prospect_phone\": \"+15145551234\",\n  \"prospect_company\": \"Acme Inc.\",\n  \"valid_until\": \"2026-06-30\",\n  \"payment_terms\": \"Net 30\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "ddf91dba-4037-4adb-8a39-09e845d60d67",
          "name": "Mettre à jour un devis",
          "request": {
            "name": "Mettre à jour un devis",
            "description": {
              "content": "Met à jour les champs fournis du devis (champs absents conservés).\nAu moins un champ doit être fourni sinon `400 no_fields`.\n\nLes montants (`subtotal`, `tps_amount`, `tvq_amount`, `total`) ne\nsont pas éditables via PATCH — calculés serveur-side à partir des\nblocks (gérés via le dashboard).\n\nModifier `status` directement contourne le flow standard\n`POST /v1/quotes/{id}/send` (qui horodate `sent_at` automatiquement).\nÀ utiliser avec discernement (ex passer un draft à `cancelled`).\n\nLes devis archivés (`archived_at IS NOT NULL`) ne sont pas\nmodifiables — retourne `404 resource_not_found`.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "quotes",
                ":id"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "PATCH",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"prospect_name\": \"<string,null>\",\n  \"prospect_email\": \"<string,null-email>\",\n  \"prospect_phone\": \"<string,null>\",\n  \"prospect_company\": \"<string,null>\",\n  \"prospect_address\": \"<string,null>\",\n  \"valid_until\": \"<string,null-date>\",\n  \"payment_terms\": \"<string,null>\",\n  \"internal_notes\": \"<string,null>\",\n  \"sales_rep_id\": \"<string,null-uuid>\",\n  \"tax_profile_id\": \"<string,null-uuid>\",\n  \"status\": \"<string>\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "02a08d22-3532-45d4-8ba3-2907811668f5",
              "name": "Devis mis à jour.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"prospect_name\": \"Alexandre Tremblay\",\n  \"valid_until\": \"2026-07-31\",\n  \"payment_terms\": \"Net 60\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"client_id\": \"138b6876-f3b7-e088-d11b-d1f05e02fcb0\",\n    \"quote_number\": \"DEV-2026-0042\",\n    \"status\": \"draft\",\n    \"created_at\": \"2026-05-04T12:34:56.789Z\",\n    \"updated_at\": \"2026-05-04T12:34:56.789Z\",\n    \"prospect_name\": \"Alex Tremblay\",\n    \"prospect_email\": \"alex@example.com\",\n    \"prospect_phone\": \"+15145551234\",\n    \"prospect_company\": \"Acme Inc.\",\n    \"prospect_address\": \"string\",\n    \"subtotal\": 1000,\n    \"tps_amount\": 50,\n    \"tvq_amount\": 99.75,\n    \"total\": 1149.75,\n    \"valid_until\": \"2026-06-30\",\n    \"payment_terms\": \"string\",\n    \"sent_at\": \"2021-12-27T15:56:13.345Z\",\n    \"first_viewed_at\": \"1978-12-28T20:58:41.524Z\",\n    \"signed_at\": \"2002-11-15T13:17:20.362Z\",\n    \"sales_rep_id\": \"ecefbccf-696d-e914-1331-91607f26c271\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "8a45f042-bb6e-4105-827c-1d5f6c2b1dd7",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"prospect_name\": \"Alexandre Tremblay\",\n  \"valid_until\": \"2026-07-31\",\n  \"payment_terms\": \"Net 60\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "cde077fe-8c55-4577-9d55-c3a149f62ce6",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"prospect_name\": \"Alexandre Tremblay\",\n  \"valid_until\": \"2026-07-31\",\n  \"payment_terms\": \"Net 60\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "4d9914f1-9bb9-4654-b275-78713f921899",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"prospect_name\": \"Alexandre Tremblay\",\n  \"valid_until\": \"2026-07-31\",\n  \"payment_terms\": \"Net 60\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "010db502-ea60-442f-8491-cebf9bdbb2c4",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"prospect_name\": \"Alexandre Tremblay\",\n  \"valid_until\": \"2026-07-31\",\n  \"payment_terms\": \"Net 60\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "071bda21-a785-493e-baf6-9fcd3d78f022",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"prospect_name\": \"Alexandre Tremblay\",\n  \"valid_until\": \"2026-07-31\",\n  \"payment_terms\": \"Net 60\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "25fcd203-1c5a-4b2b-bf06-1464caf4da7d",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"prospect_name\": \"Alexandre Tremblay\",\n  \"valid_until\": \"2026-07-31\",\n  \"payment_terms\": \"Net 60\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "42f9ccb5-58d4-4b13-b913-aa707e10f362",
          "name": "Marquer un devis comme envoyé",
          "request": {
            "name": "Marquer un devis comme envoyé",
            "description": {
              "content": "Met à jour `status=\"sent\"` et horodate `sent_at`. **N'envoie pas\nd'email réellement** — la délivrance email passe par le dashboard\nCapturia (Resend + templates). Cette limitation est documentée\ndans la réponse via un champ top-level `warning`.\n\n### Forme de réponse non-standard\n\nLa réponse retourne `{data, warning}` au lieu de `{data}` seul —\nle champ `warning` top-level n'est pas dans la convention v1\nstandard. Documenter dans le code intégrateur que ce champ peut\nêtre présent et indique une limitation fonctionnelle, pas une\nerreur.\n\n### États terminaux\n\n- `409 already_signed` si le devis est déjà signé (statut terminal).\n- `409 quote_cancelled` si le devis a été annulé (non renvoyable).\n\nAucun body n'est requis — l'opération est purement transitionnelle.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "quotes",
                ":id",
                "send"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "8e79f39e-2a22-45c8-be98-cf7fe602c231",
              "name": "Devis marqué comme envoyé. Réponse non-standard avec un champ\n`warning` top-level signalant que l'API ne déclenche pas\nl'envoi email réel.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"client_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n    \"quote_number\": \"DEV-2026-0042\",\n    \"status\": \"sent\",\n    \"prospect_name\": \"Alex Tremblay\",\n    \"prospect_email\": \"alex@example.com\",\n    \"sent_at\": \"2026-05-04T12:00:00.000Z\",\n    \"created_at\": \"2026-05-04T10:00:00.000Z\",\n    \"updated_at\": \"2026-05-04T12:00:00.000Z\"\n  },\n  \"warning\": \"Status updated to sent. Email delivery via API is not yet supported — use the dashboard to send quotes with email notifications.\"\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "5ba496f9-771a-4736-b97b-765643a45a33",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "168997cd-5038-42d1-a6e4-f90a687094d7",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "d4bc9474-01a6-4460-80f4-bca7d9cb28f5",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "7a623db5-4267-4483-a7ad-e69e6eaeda1e",
              "name": "La requête est syntaxiquement valide mais viole une règle métier.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"business_rule_error\",\n    \"code\": \"business_rule_violation\",\n    \"message\": \"Impossible d'envoyer un devis déjà accepté.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#business_rule_violation\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"rule\": \"quote_already_accepted\",\n      \"current_state\": \"accepted\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "1131f34d-eba3-4101-a10a-85510d2dcaa2",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "20c4be59-247f-422a-8e58-bcbcf14954e4",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "quotes",
                    ":id",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "7b69c0a1-5ed7-4c0e-8612-98bebe989423",
      "name": "Tags",
      "description": {
        "content": "Étiquettes pour catégoriser les contacts",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "1870dad8-aaeb-4a07-8ba2-d134ebd8ae2b",
          "name": "Lister les tags",
          "request": {
            "name": "Lister les tags",
            "description": {
              "content": "Retourne la liste paginée des tags du client (cursor v2). Tri stable\n`name ASC, id ASC` — l'ordre alphabétique facilite la construction\nd'une UI de sélection. Le tiebreaker `id ASC` évite qu'un doublon de\nnom (autorisé en base) ne provoque skip ou duplication entre pages.\n\n### Sanitization du curseur\n\nLe `name` étant user-controlled, le curseur encode les valeurs avec\néchappement PostgREST côté serveur — pas d'action requise côté client.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "tags"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "cursor",
                  "value": "<string,null>",
                  "description": "Cursor opaque pour pagination — passer la valeur de `pagination.next_cursor` de la page précédente."
                },
                {
                  "disabled": false,
                  "key": "limit",
                  "value": "20",
                  "description": "Nombre max de résultats par page (defaut 20, max 100). Au-delà → 400 invalid_request."
                }
              ],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "a6ae5386-284e-434b-962c-fc29dfe0a37c",
              "name": "Liste paginée des tags.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n      \"name\": \"Lead chaud\",\n      \"color\": \"#ef4444\",\n      \"description\": \"Prospect avec budget confirmé et calendrier court.\",\n      \"category\": \"priority\",\n      \"created_at\": \"2026-05-04T10:00:00.000Z\"\n    },\n    {\n      \"id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\",\n      \"name\": \"Restauration\",\n      \"color\": \"#3b82f6\",\n      \"description\": null,\n      \"category\": \"industry\",\n      \"created_at\": \"2026-05-04T09:30:00.000Z\"\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 20,\n    \"cursor\": null,\n    \"total_count\": 2\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "ab47f58b-b72d-4d28-bc80-efe643232ba0",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "200c244c-9d90-4d1b-b67b-927cfdfaba96",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e03793a8-8d27-41df-9629-506028e2c160",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "da4f7e36-9028-4d15-890a-e6dd1e7ff425",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "b8d129f4-7e31-4d9e-a0d6-ab126d7f2990",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "8fade53b-e7e3-4e14-bf08-d93ab0d2d7f7",
          "name": "Créer un tag",
          "request": {
            "name": "Créer un tag",
            "description": {
              "content": "Crée un nouveau tag dans la bibliothèque du client. Seul `name` est\nobligatoire — `color` reçoit la valeur par défaut `#6b7280` (gris\nneutre) si non fournie. Pour attacher le tag à un contact existant,\nutiliser `POST /v1/contacts/{id}/tags` avec l'identifiant retourné\npar cet endpoint.\n\nAucune contrainte d'unicité sur `name` — deux tags peuvent partager\nle même nom (différenciés par leur `id` et `color`).\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "tags"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"<string>\",\n  \"color\": \"<string>\",\n  \"description\": \"<string>\",\n  \"category\": \"<string>\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "3625a93b-5a22-445b-a94d-4696655e49ba",
              "name": "Tag créé.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Lead chaud\",\n  \"color\": \"#ef4444\",\n  \"description\": \"Prospect avec budget confirmé et calendrier court.\",\n  \"category\": \"priority\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"name\": \"Lead chaud\",\n    \"color\": \"#ef4444\",\n    \"description\": \"Prospect avec budget confirmé et calendrier court.\",\n    \"category\": \"priority\",\n    \"created_at\": \"2026-05-04T10:00:00.000Z\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "675cb220-fd54-40f8-b455-713b36f69c7b",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Lead chaud\",\n  \"color\": \"#ef4444\",\n  \"description\": \"Prospect avec budget confirmé et calendrier court.\",\n  \"category\": \"priority\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "1af75bda-6125-4574-9c4b-64e05cb4b002",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Lead chaud\",\n  \"color\": \"#ef4444\",\n  \"description\": \"Prospect avec budget confirmé et calendrier court.\",\n  \"category\": \"priority\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "7d27ffa3-44af-4cb4-9654-5e94b16375c7",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Lead chaud\",\n  \"color\": \"#ef4444\",\n  \"description\": \"Prospect avec budget confirmé et calendrier court.\",\n  \"category\": \"priority\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "0ae0eef6-74df-4d27-99b4-d19272ba7dac",
              "name": "Le header `Content-Type` est manquant ou non supporté pour cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Lead chaud\",\n  \"color\": \"#ef4444\",\n  \"description\": \"Prospect avec budget confirmé et calendrier court.\",\n  \"category\": \"priority\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unsupported Media Type",
              "code": 415,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_content_type\",\n    \"message\": \"Content-Type `text/plain` non supporté. Utilise `application/json`.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#content-type\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"received\": \"text/plain\",\n      \"expected\": [\n        \"application/json\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "097b8ce2-f3da-477a-961c-8b2474e7c7e5",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Lead chaud\",\n  \"color\": \"#ef4444\",\n  \"description\": \"Prospect avec budget confirmé et calendrier court.\",\n  \"category\": \"priority\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "cb4b798d-a208-4a05-8f5d-f5c83b28e063",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "tags"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Lead chaud\",\n  \"color\": \"#ef4444\",\n  \"description\": \"Prospect avec budget confirmé et calendrier court.\",\n  \"category\": \"priority\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "e0cfe59e-6b98-4e21-96cb-90225a451b10",
      "name": "Automations",
      "description": {
        "content": "Workflows automatisés (relances, séquences, déclencheurs)",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "3e75809f-2e45-4213-8f41-db5f9f80fa24",
          "name": "Lister les automations",
          "request": {
            "name": "Lister les automations",
            "description": {
              "content": "Retourne la liste paginée des automations actives du client (cursor v2).\nTri stable `created_at DESC, id DESC`. Les automations archivées\n(`archived_at IS NOT NULL`) sont exclues — l'API publique ne les\nexpose pas.\n\n### Filtres\n\n- `?status=active` — uniquement les automations `is_active=true`.\n- `?status=inactive` — uniquement les automations `is_active=false`.\n\n### Lecture seule\n\nL'API publique expose seulement la lecture (liste + historique) et le\ndéclenchement manuel. La création/édition/archivage d'une automation\npasse par le dashboard — aucun endpoint POST/PATCH/DELETE\n`/v1/automations` n'existe.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "automations"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "cursor",
                  "value": "<string,null>",
                  "description": "Cursor opaque pour pagination — passer la valeur de `pagination.next_cursor` de la page précédente."
                },
                {
                  "disabled": false,
                  "key": "limit",
                  "value": "20",
                  "description": "Nombre max de résultats par page (defaut 20, max 100). Au-delà → 400 invalid_request."
                },
                {
                  "disabled": false,
                  "key": "created_after",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées après cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "created_before",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées avant cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "status",
                  "value": "<string>",
                  "description": "Filtre `is_active=true` (active) ou `is_active=false` (inactive)."
                }
              ],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "9396a432-d080-49e8-98ae-72064e650617",
              "name": "Liste paginée des automations.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n      \"name\": \"Relance lead inactif 7 jours\",\n      \"category\": \"nurturing\",\n      \"trigger_type\": \"lead_captured\",\n      \"action_type\": \"send_email\",\n      \"is_active\": true,\n      \"last_executed_at\": \"2026-05-04T08:12:00.000Z\",\n      \"execution_count\": 42,\n      \"created_at\": \"2026-04-15T10:00:00.000Z\",\n      \"updated_at\": \"2026-05-04T08:12:00.000Z\"\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 20,\n    \"cursor\": null,\n    \"total_count\": 1\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "b3fe3763-bd92-4b07-abc1-6a4b46e6d213",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "eabd58fc-7529-4578-8aaa-90d35af8eab1",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "3030dd26-e806-4575-beb0-a8186d21a466",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "ebc32dcb-684f-45bc-a243-e3e2e68ea0c5",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "ed4caa54-6271-4d18-ad9f-a37808e4afc1",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "status",
                      "value": "<string>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "3291b657-96fc-4260-8008-b470b8900679",
          "name": "Déclencher manuellement une automation",
          "request": {
            "name": "Déclencher manuellement une automation",
            "description": {
              "content": "Crée une exécution `status=\"pending\"` avec `trigger_type=\"manual_api\"`,\nréclamable par le moteur d'automations (asynchrone, pas de garantie de\ncomplétion synchrone). Pour suivre la progression de l'exécution,\ninterroger `GET /v1/automations/{id}/history`.\n\n### Préconditions\n\n- L'automation doit appartenir au client appelant et ne pas être\n  archivée — sinon `404 not_found`.\n- L'automation doit avoir `is_active=true` — sinon\n  `409 automation_inactive`.\n- L'automation doit être publiée — sinon `409 automation_not_published`.\n- L'automation publiée doit posséder un noeud déclencheur — sinon\n  `409 no_trigger`.\n- Le `contact_id` doit appartenir au client appelant — sinon\n  `404 not_found`.\n\n### Gardes d'enrôlement\n\nLe déclenchement manuel passe par les mêmes gardes que les déclencheurs\nautomatiques :\n\n- Contact déjà dans un parcours actif de cette automation — sinon\n  `409 already_enrolled` (activer la multi-opportunité dans les réglages\n  d'enrôlement pour autoriser des parcours concurrents).\n- Doublon dans les 5 dernières minutes, plafond de 5 enrôlements par\n  contact par 24 h sur cette automation, ou plafond global de 200\n  exécutions par heure pour le compte — sinon `429 trigger_throttled`.\n\nLe body accepte un `event_data` optionnel (objet JSON libre) injecté dans\nl'exécution et exploitable par les variables de template du graphe.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "automations",
                ":id",
                "trigger"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"contact_id\": \"<uuid>\",\n  \"event_data\": {\n    \"key_0\": true,\n    \"key_1\": 9668,\n    \"key_2\": \"string\",\n    \"key_3\": \"string\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "548434b7-c581-4a43-ba5b-687fcd905a45",
              "name": "Exécution `pending` créée — réclamable par le moteur de manière asynchrone.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "trigger"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"event_data\": {\n    \"source\": \"crm_import\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\",\n    \"automation_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"contact_id\": \"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\",\n    \"trigger_type\": \"manual_api\",\n    \"status\": \"pending\",\n    \"created_at\": \"2026-05-04T12:00:00.000Z\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e2f7a95d-16fa-4fd1-b528-fce427d1fc82",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "trigger"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"event_data\": {\n    \"source\": \"crm_import\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f68611de-d71e-4d4e-8368-774f188eba09",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "trigger"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"event_data\": {\n    \"source\": \"crm_import\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "b7e479d5-25ba-415d-87cd-462b6c154f5f",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "trigger"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"event_data\": {\n    \"source\": \"crm_import\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "88ba8bf9-741f-4d9a-b2ae-67f38b167292",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "trigger"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"event_data\": {\n    \"source\": \"crm_import\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "9b94f2ae-19bd-4c55-a491-7fc2185d555e",
              "name": "La requête est syntaxiquement valide mais viole une règle métier.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "trigger"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"event_data\": {\n    \"source\": \"crm_import\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"business_rule_error\",\n    \"code\": \"business_rule_violation\",\n    \"message\": \"Impossible d'envoyer un devis déjà accepté.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#business_rule_violation\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"rule\": \"quote_already_accepted\",\n      \"current_state\": \"accepted\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "0cbb9a48-c94d-40c4-90c2-72b64f7278d6",
              "name": "Le header `Content-Type` est manquant ou non supporté pour cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "trigger"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"event_data\": {\n    \"source\": \"crm_import\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unsupported Media Type",
              "code": 415,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_content_type\",\n    \"message\": \"Content-Type `text/plain` non supporté. Utilise `application/json`.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#content-type\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"received\": \"text/plain\",\n      \"expected\": [\n        \"application/json\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e98997eb-9b23-477e-86b6-8f4abd78c01b",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "trigger"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"event_data\": {\n    \"source\": \"crm_import\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "a51b111a-8823-4a9b-8ded-ff7e704a39c5",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "trigger"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"event_data\": {\n    \"source\": \"crm_import\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "0984ce3f-50d0-445d-9023-668228b81331",
          "name": "Lister l'historique d'exécutions d'une automation",
          "request": {
            "name": "Lister l'historique d'exécutions d'une automation",
            "description": {
              "content": "Retourne la liste paginée des exécutions d'une automation (cursor v2).\nTri stable `created_at DESC, id DESC` — les exécutions récentes en\npremier. Une exécution représente un passage de l'automation pour un\ncontact donné ; le moteur peut la redémarrer après échec\n(`retry_count > 0`).\n\nL'automation doit appartenir au client appelant et ne pas être\narchivée — sinon `404 not_found`.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "automations",
                ":id",
                "history"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "cursor",
                  "value": "<string,null>",
                  "description": "Cursor opaque pour pagination — passer la valeur de `pagination.next_cursor` de la page précédente."
                },
                {
                  "disabled": false,
                  "key": "limit",
                  "value": "20",
                  "description": "Nombre max de résultats par page (defaut 20, max 100). Au-delà → 400 invalid_request."
                },
                {
                  "disabled": false,
                  "key": "created_after",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées après cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "created_before",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées avant cette date (inclusive)."
                }
              ],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "04350419-260b-4ac5-8e9e-5ca3943caa53",
              "name": "Liste paginée des exécutions de l'automation.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "history"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\",\n      \"automation_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n      \"contact_id\": \"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\",\n      \"trigger_type\": \"manual_api\",\n      \"status\": \"completed\",\n      \"current_node_id\": null,\n      \"scheduled_at\": null,\n      \"execution_log\": {\n        \"steps\": [\n          {\n            \"action\": \"send_email\",\n            \"status\": \"delivered\"\n          }\n        ]\n      },\n      \"retry_count\": 0,\n      \"created_at\": \"2026-05-04T12:00:00.000Z\",\n      \"updated_at\": \"2026-05-04T12:00:05.000Z\"\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 20,\n    \"cursor\": null,\n    \"total_count\": 1\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "7a3ef1ff-0153-49f0-9cee-d543bf7db8ab",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "history"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "168fb369-1d82-4f73-8f0b-a22a5cce0cf0",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "history"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "ad3e85d6-df61-4b9f-90cd-b9de71404195",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "history"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "41b3145d-7ccf-47f8-9397-fe948548a92d",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "history"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f67195ab-0df8-470c-834a-60691cd67deb",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "history"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "688030a4-55dd-4152-944e-72642fd35031",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "automations",
                    ":id",
                    "history"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "1231030f-d664-448c-a9a1-3330958a6f0e",
      "name": "Pipeline",
      "description": {
        "content": "Deals et stages du pipeline de vente",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "e696d4c5-b233-43dd-9ed8-eb4fc5385d41",
          "name": "Lister les opportunités du pipeline",
          "request": {
            "name": "Lister les opportunités du pipeline",
            "description": {
              "content": "Retourne la liste paginée des deals (opportunités) du client (cursor v2).\nTri stable `created_at DESC, id DESC`.\n\nUn deal n'est PAS une entité distincte en base : c'est un\n`client_contacts` ayant `pipeline_stage_id IS NOT NULL`. Le sous-ensemble\nde champs exposé est volontairement réduit aux infos pertinentes pour\nla vue pipeline (coordonnées + stage + valeur + score). Pour le contact\ncomplet (custom_fields, tags, notes), utiliser `GET /v1/contacts/{id}`.\n\n### Filtres\n\n- `?stage_id` (uuid) — filtre exact sur la stage du pipeline.\n\n### Pas de GET single\n\nAucun endpoint `GET /v1/pipeline/deals/{id}` n'est exposé — pour\nrécupérer un deal individuel, utiliser `GET /v1/contacts/{id}` ou\nfiltrer cette liste par `?stage_id`.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "pipeline",
                "deals"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "cursor",
                  "value": "<string,null>",
                  "description": "Cursor opaque pour pagination — passer la valeur de `pagination.next_cursor` de la page précédente."
                },
                {
                  "disabled": false,
                  "key": "limit",
                  "value": "20",
                  "description": "Nombre max de résultats par page (defaut 20, max 100). Au-delà → 400 invalid_request."
                },
                {
                  "disabled": false,
                  "key": "created_after",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées après cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "created_before",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées avant cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "stage_id",
                  "value": "<uuid>",
                  "description": "Filtre exact sur la stage du pipeline."
                }
              ],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "3ba6c381-32d0-498d-9052-e491a2c3de41",
              "name": "Liste paginée des deals.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "stage_id",
                      "value": "<uuid>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n      \"email\": \"alex@example.com\",\n      \"phone\": \"+15145551234\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Tremblay\",\n      \"company\": \"Acme Inc.\",\n      \"pipeline_stage_id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\",\n      \"deal_value\": 2500,\n      \"created_at\": \"2026-05-04T10:00:00.000Z\",\n      \"updated_at\": \"2026-05-04T11:15:00.000Z\"\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 20,\n    \"cursor\": null,\n    \"total_count\": 1\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "08891a31-7549-4209-b867-65cca6e92b0f",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "stage_id",
                      "value": "<uuid>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "5a630e34-6949-437f-b2b4-020015c21e3a",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "stage_id",
                      "value": "<uuid>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "0a85b660-c067-4c7f-91e4-849b3d749cdc",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "stage_id",
                      "value": "<uuid>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "62b63656-ea57-4947-a482-a3d29b94a2aa",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "stage_id",
                      "value": "<uuid>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e04ce059-4a28-4050-91b9-d9fbfcf2c9d3",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "stage_id",
                      "value": "<uuid>"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "a729dc05-86fc-42d5-9aac-c7ee8387d23f",
          "name": "Placer un contact dans le pipeline",
          "request": {
            "name": "Placer un contact dans le pipeline",
            "description": {
              "content": "Place un contact existant dans une stage du pipeline (set\n`pipeline_stage_id`). **Ne crée pas de contact** — `contact_id` doit\ndéjà exister et appartenir au client appelant (sinon `404 not_found`).\nDe même pour `stage_id` (`404 not_found` si la stage n'appartient pas\nau client).\n\nSi le contact est déjà dans une stage, son `pipeline_stage_id` est\nécrasé par la nouvelle valeur — pas d'historique de mouvement\nenregistré (la table `pipeline_history` référence l'autre table\ninterne `contacts`, pas `client_contacts`).\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "pipeline",
                "deals"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"contact_id\": \"<uuid>\",\n  \"stage_id\": \"<uuid>\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "2f13a66f-9898-4084-b005-fba22221102e",
              "name": "Deal placé dans le pipeline.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"stage_id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"email\": \"alex@example.com\",\n    \"phone\": \"+15145551234\",\n    \"first_name\": \"Alex\",\n    \"last_name\": \"Tremblay\",\n    \"company\": \"Acme Inc.\",\n    \"pipeline_stage_id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\",\n    \"deal_value\": 2500,\n    \"created_at\": \"2026-05-04T10:00:00.000Z\",\n    \"updated_at\": \"2026-05-04T12:00:00.000Z\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f6aeb655-ddfa-4e8b-8561-c17f1684ce88",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"stage_id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "2e882d95-c95b-484d-b21f-ac72dcfb46d7",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"stage_id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "0e4bf14d-0304-490d-90a3-921c3d6a818e",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"stage_id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "12e18977-1e61-4f25-b7c1-1de3898fe701",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"stage_id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "ad23c4ad-cfa4-4765-a32b-a4d1642dfbb4",
              "name": "Le header `Content-Type` est manquant ou non supporté pour cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"stage_id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unsupported Media Type",
              "code": 415,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_content_type\",\n    \"message\": \"Content-Type `text/plain` non supporté. Utilise `application/json`.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#content-type\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"received\": \"text/plain\",\n      \"expected\": [\n        \"application/json\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "61102842-7182-4106-b03e-598743ac67ea",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"stage_id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "aa14a73a-6afe-4a7c-883f-3c80cd871702",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"stage_id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "c594ae38-20d4-48e5-ac1a-638efbbc05bb",
          "name": "Déplacer un deal vers une autre stage",
          "request": {
            "name": "Déplacer un deal vers une autre stage",
            "description": {
              "content": "Déplace un deal (`pipeline_stage_id`) vers une nouvelle stage. Seul le\ndéplacement de stage est exposé via cet endpoint — pour modifier les\nautres champs du deal (email, deal_value, etc.) utiliser\n`PATCH /v1/contacts/{id}`.\n\n### Préconditions\n\n- Le deal cible doit exister, appartenir au client appelant, et avoir\n  `pipeline_stage_id IS NOT NULL` — sinon `404 not_found`.\n- La stage cible doit appartenir au client appelant — sinon\n  `404 not_found`.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "pipeline",
                "deals",
                ":id"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "PATCH",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"stage_id\": \"<uuid>\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "4990fa28-d697-4529-856e-3a724f3b934c",
              "name": "Deal déplacé vers la nouvelle stage.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"stage_id\": \"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"email\": \"alex@example.com\",\n    \"phone\": \"+15145551234\",\n    \"first_name\": \"Alex\",\n    \"last_name\": \"Tremblay\",\n    \"company\": \"Acme Inc.\",\n    \"pipeline_stage_id\": \"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\",\n    \"deal_value\": 2500,\n    \"created_at\": \"2026-05-04T10:00:00.000Z\",\n    \"updated_at\": \"2026-05-04T13:00:00.000Z\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "fd83a260-3372-4929-a33d-6f8d840dad52",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"stage_id\": \"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f92c129f-2131-4b0a-a2a1-6f8b98d31fab",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"stage_id\": \"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "c84ebd28-94c7-4a55-8e0d-b226847602fc",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"stage_id\": \"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "6b9d2135-fcd1-4013-9545-1feab7457907",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"stage_id\": \"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e4e869a2-ff9d-465d-8db2-2c842abe93d4",
              "name": "Le header `Content-Type` est manquant ou non supporté pour cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"stage_id\": \"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unsupported Media Type",
              "code": 415,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_content_type\",\n    \"message\": \"Content-Type `text/plain` non supporté. Utilise `application/json`.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#content-type\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"received\": \"text/plain\",\n      \"expected\": [\n        \"application/json\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "ad8a36a6-0926-4942-b2b5-8bb0fed47457",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"stage_id\": \"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "78421035-abad-4bd0-80a3-acbf42f6f228",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "PATCH",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"stage_id\": \"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "307eb40d-8fed-467d-9d18-a631d860bf1c",
          "name": "Retirer un deal du pipeline",
          "request": {
            "name": "Retirer un deal du pipeline",
            "description": {
              "content": "Retire le deal du pipeline en mettant `pipeline_stage_id = NULL`. Le\ncontact n'est PAS supprimé — il reste accessible via\n`GET /v1/contacts/{id}`. Pour supprimer définitivement le contact,\nutiliser `DELETE /v1/contacts/{id}`.\n\nLe deal cible doit exister, appartenir au client appelant, et avoir\n`pipeline_stage_id IS NOT NULL` — sinon `404 not_found`.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "pipeline",
                "deals",
                ":id"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "DELETE",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "8f2d2ec7-93a3-41a3-8857-50e87dd2a2f4",
              "name": "Deal retiré du pipeline (le contact n'est pas supprimé).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"removed_from_pipeline\": true\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "cee4fc86-4e36-45cc-a2c4-0d1a9238d4fb",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "fd148e2b-de74-411c-b41f-092f121e5436",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "2a1cb259-b84f-46c4-8066-c4f752d5588b",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "b66d4599-1469-487a-b5d9-3860811c049d",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "82ceaef7-535d-4c96-955a-6c0f52f7dade",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "deals",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "1fa26f47-d27c-4a40-b6ec-eff91b26a2eb",
          "name": "Lister les stages du pipeline",
          "request": {
            "name": "Lister les stages du pipeline",
            "description": {
              "content": "Retourne la liste complète des stages du pipeline du client, triées par\n`stage_order ASC`. Chaque stage est enrichie d'un compteur\n`contact_count` calculé en temps réel (nombre de contacts du client\nactuellement positionnés sur cette stage — utile pour les KPI de\npipeline).\n\n### Réponse non-paginée\n\nL'endpoint retourne **toutes les stages du client en un seul appel**\n(généralement < 20 par client, max 50). Le format de réponse reste\ncompatible `list V2` pour la cohérence des intégrations\n(`pagination.next_cursor=null`, `pagination.has_more=false`,\n`pagination.limit` et `pagination.total_count` égalent le nombre de\nstages retournées).\n\n### Lecture seule\n\nCréation / édition / réordonnancement des stages passe par le\ndashboard — aucun endpoint POST/PATCH/DELETE `/v1/pipeline/stages`\nn'est exposé.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "pipeline",
                "stages"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "626412c3-50d5-4563-881f-1b98faa886d4",
              "name": "Liste complète des stages du pipeline (non-paginée).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "stages"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n      \"name\": \"Nouveau lead\",\n      \"slug\": \"new-lead\",\n      \"color\": \"#94a3b8\",\n      \"stage_order\": 1,\n      \"is_default\": true,\n      \"is_won\": false,\n      \"is_lost\": false,\n      \"probability\": 10,\n      \"created_at\": \"2026-04-01T10:00:00.000Z\",\n      \"contact_count\": 32\n    },\n    {\n      \"id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\",\n      \"name\": \"Qualifié\",\n      \"slug\": \"qualified\",\n      \"color\": \"#3b82f6\",\n      \"stage_order\": 2,\n      \"is_default\": false,\n      \"is_won\": false,\n      \"is_lost\": false,\n      \"probability\": 50,\n      \"created_at\": \"2026-04-01T10:00:00.000Z\",\n      \"contact_count\": 17\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 2,\n    \"cursor\": null,\n    \"total_count\": 2\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "6dfc2e14-6c87-4437-a1f6-7575694c4bc3",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "stages"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "b2645688-cd5f-40e0-94e0-6fab5763a6fc",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "stages"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "12710126-c4e9-4baf-a153-ed6235b7f493",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "stages"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "aba9f85a-a207-45c6-987e-4af65b8d61fb",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "pipeline",
                    "stages"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "1bcebab1-e2b4-4e0d-b1ec-8e9890996564",
      "name": "Emails",
      "description": {
        "content": "Envoi et lecture d'emails transactionnels",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "d331cf62-6bee-4ac7-b2f4-5e0306e28504",
          "name": "Lister les conversations email",
          "request": {
            "name": "Lister les conversations email",
            "description": {
              "content": "Retourne la liste paginée des threads email du client (cursor v2). Tri\nstable `last_message_at DESC, id DESC` — les conversations avec un\néchange récent en premier. `last_message_at` est `NOT NULL` côté table.\n\n### Lecture seule\n\nL'API publique expose seulement la liste des threads. Le détail des\nmessages individuels d'une conversation n'est pas encore exposé via\nl'API publique — le payload se limite aux métadonnées du thread.\nPour envoyer un email, utiliser `POST /v1/emails/send`.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "emails",
                "conversations"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "cursor",
                  "value": "<string,null>",
                  "description": "Cursor opaque pour pagination — passer la valeur de `pagination.next_cursor` de la page précédente."
                },
                {
                  "disabled": false,
                  "key": "limit",
                  "value": "20",
                  "description": "Nombre max de résultats par page (defaut 20, max 100). Au-delà → 400 invalid_request."
                },
                {
                  "disabled": false,
                  "key": "created_after",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées après cette date (inclusive)."
                },
                {
                  "disabled": false,
                  "key": "created_before",
                  "value": "<dateTime>",
                  "description": "Filtre — uniquement les ressources créées avant cette date (inclusive)."
                }
              ],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "e251ad5b-37bd-40ff-932e-8b8bc077c65a",
              "name": "Liste paginée des conversations email.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "conversations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n      \"contact_id\": \"2b3c4d5e-6f7a-8b9c-0d1e-2f3a4b5c6d7e\",\n      \"sender_id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\",\n      \"subject\": \"Suivi de notre échange\",\n      \"status\": \"open\",\n      \"unread_count\": 2,\n      \"last_message_at\": \"2026-05-04T12:34:56.789Z\",\n      \"created_at\": \"2026-04-15T10:00:00.000Z\"\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 20,\n    \"cursor\": null,\n    \"total_count\": 1\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "b864a41f-88fb-4a05-964e-018ff7853024",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "conversations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e5421f5b-2a11-4535-9bcc-d98960528a97",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "conversations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "077d930f-6980-4d6e-a6e5-269b5c174dbb",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "conversations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "a1c1e401-caf3-4a13-a396-90b086662f54",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "conversations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "1a936140-3b84-4388-9d79-3f57c31962b3",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "conversations"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "cursor",
                      "value": "eyJ2IjoxLCJmIjoiY3JlYXRlZF9hdCIsInMiOiJkZXNjIiwidmFsIjoiMjAyNi0wNS0wMlQxNDozMDowMFoiLCJpZCI6ImFiYy0xMjMifQ"
                    },
                    {
                      "key": "limit",
                      "value": "20"
                    },
                    {
                      "key": "created_after",
                      "value": "2026-05-04T12:34:56.789Z"
                    },
                    {
                      "key": "created_before",
                      "value": "2026-05-04T12:34:56.789Z"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "6c6883bd-e412-4fbf-a941-94386a4627c2",
          "name": "Envoyer un email transactionnel",
          "request": {
            "name": "Envoyer un email transactionnel",
            "description": {
              "content": "Met en queue un email transactionnel pour livraison via Resend.\nL'email est créé avec `status=\"queued\"`, `priority=1`,\n`type=\"transactional\"` et délivré de manière asynchrone par le worker\nemail — la réponse 201 confirme la mise en queue, pas la délivrance\nfinale.\n\n### Expéditeur résolu serveur-side\n\nL'expéditeur (`from`) est dérivé du sender par défaut du client\n(`client_email_senders.is_default = true`). Si aucun sender par\ndéfaut n'est configuré, la requête retourne\n`400 no_sender_configured`.\n\n### Idempotency\n\nLe header `Idempotency-Key` n'est PAS supporté sur cette route — un\nretry naïf créera un second envoi. Une clé d'idempotence interne est\ngénérée serveur-side (`api-transactional/{clientId}/{ts}`) pour\nprotéger uniquement contre les doubles inserts en base.\n\n### Mode test\n\n`\"test\": true` dans le body permet de valider une intégration sans\nviser un vrai contact : les variables de personnalisation sont\ninterpolées avec des valeurs d'exemple, le sujet est préfixé\n`[TEST]`, et les vérifications de conformité destinataire sont\ncontournées. En contrepartie, le destinataire doit être un membre\nactif de l'équipe du client (sinon 400 `recipient_not_allowed`) et\nun quota de 50 tests / 24 h glissantes s'applique, partagé avec les\nboutons de test de la plateforme (sinon 429 `test_quota_exceeded`).\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "emails",
                "send"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"to\": \"<email>\",\n  \"subject\": \"<string>\",\n  \"body\": \"<string>\",\n  \"test\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "7ece3976-d5be-44b2-a80a-b0cde9d4355c",
              "name": "Email mis en queue.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"to\": \"alex@example.com\",\n  \"subject\": \"Confirmation de votre commande\",\n  \"body\": \"<p>Bonjour Alex,</p><p>Votre commande est confirmée.</p>\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"status\": \"queued\",\n    \"to_email\": \"alex@example.com\",\n    \"subject\": \"Confirmation de votre commande\",\n    \"created_at\": \"2026-05-04T12:00:00.000Z\",\n    \"is_test\": false\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "120fa60d-b01b-4387-a9c7-12830efadb27",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"to\": \"alex@example.com\",\n  \"subject\": \"Confirmation de votre commande\",\n  \"body\": \"<p>Bonjour Alex,</p><p>Votre commande est confirmée.</p>\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "e20cc98f-6ab2-403d-bc85-4a342130118a",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"to\": \"alex@example.com\",\n  \"subject\": \"Confirmation de votre commande\",\n  \"body\": \"<p>Bonjour Alex,</p><p>Votre commande est confirmée.</p>\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "eb261fad-0ef6-49f2-9a25-a4ed9b827763",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"to\": \"alex@example.com\",\n  \"subject\": \"Confirmation de votre commande\",\n  \"body\": \"<p>Bonjour Alex,</p><p>Votre commande est confirmée.</p>\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "563d6c37-07bb-499c-8fe7-1b37834096de",
              "name": "Le header `Content-Type` est manquant ou non supporté pour cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"to\": \"alex@example.com\",\n  \"subject\": \"Confirmation de votre commande\",\n  \"body\": \"<p>Bonjour Alex,</p><p>Votre commande est confirmée.</p>\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unsupported Media Type",
              "code": 415,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_content_type\",\n    \"message\": \"Content-Type `text/plain` non supporté. Utilise `application/json`.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#content-type\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"received\": \"text/plain\",\n      \"expected\": [\n        \"application/json\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "13aaf1de-0101-4139-8c2b-f5a9faccc2df",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"to\": \"alex@example.com\",\n  \"subject\": \"Confirmation de votre commande\",\n  \"body\": \"<p>Bonjour Alex,</p><p>Votre commande est confirmée.</p>\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "41c9839d-cf85-4e57-8ed9-ef39b12dd0bb",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "emails",
                    "send"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"to\": \"alex@example.com\",\n  \"subject\": \"Confirmation de votre commande\",\n  \"body\": \"<p>Bonjour Alex,</p><p>Votre commande est confirmée.</p>\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "a1b293da-85c8-43e6-9eaf-97ee4a8546eb",
      "name": "Webhooks",
      "description": {
        "content": "Endpoints sortants pour notifier des évènements à un système externe",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "1837d853-a6d4-4fd0-9937-22f0f5455835",
          "name": "Lister les souscriptions webhooks",
          "request": {
            "name": "Lister les souscriptions webhooks",
            "description": {
              "content": "Retourne la liste des souscriptions webhooks créées par la clé API\nappelante. Les souscriptions créées par une autre clé du même client\nne sont PAS visibles ici (filtre `client_id AND api_key_id`).\n\n### Pas de pagination cursor\n\nLe maximum de 10 souscriptions par client tient toujours dans une\nseule page. La réponse retourne `pagination.next_cursor=null` et\n`has_more=false`.\n\n### Secret jamais retourné\n\nLe secret HMAC utilisé pour signer les payloads sortants n'est\nretourné qu'à la création (`POST /v1/webhooks`). Il n'est pas\nrelu ici — pour le faire tourner, supprimer la souscription et\nen créer une nouvelle.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "webhooks"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "e7d9805e-68a7-4511-88e7-b3169597ac88",
              "name": "Liste des souscriptions webhooks de cette clé API.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n      \"url\": \"https://hooks.example.com/capturia\",\n      \"events\": [\n        \"lead_created\",\n        \"payment_received\"\n      ],\n      \"is_active\": true,\n      \"created_at\": \"2026-04-15T10:00:00.000Z\"\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 1,\n    \"cursor\": null,\n    \"total_count\": 1\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "00b9749f-f356-410b-9f90-99ab6f036594",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "2f0b203d-7aa8-410d-bfdb-37a6ac3ced12",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "b317def5-19ea-46b3-b775-95612e280ca6",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "47ce26d9-1a77-4c9c-835f-9e3ca6abe646",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "18322098-10e7-4e44-9ea4-d9ee3297128e",
          "name": "Créer une souscription webhook",
          "request": {
            "name": "Créer une souscription webhook",
            "description": {
              "content": "Enregistre une nouvelle souscription. Capturia émettra un `POST` JSON\nsigné HMAC à `url` chaque fois qu'un événement souscrit survient.\n\n### URL HTTPS obligatoire\n\nL'URL doit utiliser le schéma `https://` — `http://` est rejeté pour\néviter la fuite des payloads en clair.\n\n### Limite de 10 souscriptions par client\n\nAu-delà de 10 souscriptions actives sur un même client (toutes clés\nconfondues), retourne `429 subscription_limit_reached`. Supprimer\nune souscription existante avant d'en créer une nouvelle.\n\n### Secret HMAC retourné UNE seule fois\n\nLa réponse 201 inclut `secret` en clair (64 caractères hex, 256 bits\nd'entropie). Le client DOIT le stocker immédiatement — il sert à\nvérifier la signature des payloads sortants\n(`X-Capturia-Signature`) et n'est plus jamais retourné par l'API.\nLe secret est chiffré en base après cette réponse.\n\n### Scope de la clé créatrice\n\nLa souscription appartient à la fois au client ET à la clé API qui\nl'a créée. Les endpoints `GET /v1/webhooks` et\n`DELETE /v1/webhooks/{id}` ne voient que les souscriptions de la\nclé courante — une souscription créée par une autre clé du même\nclient n'est ni listée ni supprimable via l'API.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "webhooks"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"<uri>\",\n  \"events\": [\n    \"<string>\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "fbb793be-20eb-4f51-8ee5-602776238c34",
              "name": "Souscription créée. Le `secret` HMAC est inclus dans la réponse\nen clair UNE seule fois — stocker immédiatement.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://hooks.example.com/capturia\",\n  \"events\": [\n    \"lead_created\",\n    \"payment_received\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Created",
              "code": 201,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n    \"url\": \"https://hooks.example.com/capturia\",\n    \"events\": [\n      \"lead_created\",\n      \"payment_received\"\n    ],\n    \"is_active\": true,\n    \"created_at\": \"2026-05-04T12:00:00.000Z\",\n    \"secret\": \"8f3b1a2c9d4e4f5ab6c7d8e9f0a1b2c38f3b1a2c9d4e4f5ab6c7d8e9f0a1b2c3\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f6cb129a-2c7f-4a07-94a7-7ced45b1cfc4",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://hooks.example.com/capturia\",\n  \"events\": [\n    \"lead_created\",\n    \"payment_received\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "03a50849-9c92-411b-ab61-1c6d72584c20",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://hooks.example.com/capturia\",\n  \"events\": [\n    \"lead_created\",\n    \"payment_received\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "6dcf2bd0-8c5b-4c05-ad49-7dba55e1e50f",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://hooks.example.com/capturia\",\n  \"events\": [\n    \"lead_created\",\n    \"payment_received\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "9d28d35f-f9f0-4b07-bb14-07cfa58df48b",
              "name": "Le header `Content-Type` est manquant ou non supporté pour cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://hooks.example.com/capturia\",\n  \"events\": [\n    \"lead_created\",\n    \"payment_received\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unsupported Media Type",
              "code": 415,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_content_type\",\n    \"message\": \"Content-Type `text/plain` non supporté. Utilise `application/json`.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#content-type\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"received\": \"text/plain\",\n      \"expected\": [\n        \"application/json\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "9e1fae2a-f607-4d50-ba57-5d2d196410a6",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://hooks.example.com/capturia\",\n  \"events\": [\n    \"lead_created\",\n    \"payment_received\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "19953a5d-61dc-4bdc-b45c-79ac7f838e6b",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"url\": \"https://hooks.example.com/capturia\",\n  \"events\": [\n    \"lead_created\",\n    \"payment_received\"\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "26512546-46ee-4d57-88d7-ebfb8572a2c9",
          "name": "Supprimer une souscription webhook",
          "request": {
            "name": "Supprimer une souscription webhook",
            "description": {
              "content": "Supprime définitivement une souscription webhook. La souscription\ndoit appartenir à la fois au client appelant ET à la clé API\nappelante (filtre `client_id AND api_key_id`) — sinon\n`404 not_found`.\n\n### Pas de soft delete\n\nLa suppression est immédiate et irréversible — pour réactiver le\nflux d'événements, créer une nouvelle souscription via\n`POST /v1/webhooks` (un nouveau secret sera émis).\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "webhooks",
                ":id"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": [
                {
                  "disabled": false,
                  "type": "any",
                  "value": "<uuid>",
                  "key": "id",
                  "description": "(Required) UUID de la ressource."
                }
              ]
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "DELETE",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "99951830-9e55-443c-9730-86ef5603cee1",
              "name": "Souscription supprimée. Pas de body.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "No Content",
              "code": 204,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "key": "Content-Type",
                  "value": "text/plain"
                }
              ],
              "body": "",
              "cookie": [],
              "_postman_previewlanguage": "text"
            },
            {
              "id": "c557b9e6-9057-4815-90cc-83930a22aa86",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "3cd8394c-6c3d-4c61-b6cc-f1e5613df6dd",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f6bff111-6df6-4f23-a1b3-4fd8b20a4853",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "8cb6ebd0-6475-4613-b3cd-f3a2e8c413d1",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "6079c8c2-34f7-4647-9e96-0a554ebbbace",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhooks",
                    ":id"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": [
                    {
                      "disabled": false,
                      "type": "any",
                      "value": "<uuid>",
                      "key": "id",
                      "description": "(Required) UUID de la ressource."
                    }
                  ]
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "DELETE",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        },
        {
          "id": "d7a9aa09-662e-4982-ba20-695b4fda15cc",
          "name": "Lister les derniers événements métier livrables (échantillons)",
          "request": {
            "name": "Lister les derniers événements métier livrables (échantillons)",
            "description": {
              "content": "Retourne les derniers événements métier du compte, dans **exactement\nla forme du payload livré par une souscription webhook** — le même\nconstructeur de payload sert la livraison réelle et cette liste.\n\n### À quoi ça sert\n\n- **`performList` des apps Zapier/Make** : quand un utilisateur teste\n  un trigger, l'app affiche de vrais échantillons récents, garantis\n  identiques à ce qu'une livraison réelle enverra.\n- **Debug d'intégration** : inspecter ce qui serait livré sans\n  attendre un nouvel événement.\n\nLa liste fonctionne même si aucune souscription webhook n'existe :\nelle est bâtie depuis le journal d'activité du compte, filtré au\ncatalogue des événements livrables. Les types d'événements internes\n(audit) n'apparaissent jamais, et les clés sensibles du champ\n`changes` sont expurgées comme à la livraison.\n\n### Différence avec une livraison réelle\n\nLe champ `id` de chaque item est l'identifiant de l'événement dans\nle journal d'activité — lors d'une livraison réelle, `id` est\nl'identifiant unique de la livraison (`X-Capturia-Delivery`). La\nforme et tous les autres champs sont identiques.\n\n### Pas de pagination cursor\n\nC'est un flux d'échantillons récents, plafonné à 25 items\n(`limit`, défaut 10). La réponse retourne\n`pagination.next_cursor=null` et `has_more=false`.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "webhook-events"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [
                {
                  "disabled": false,
                  "key": "event",
                  "value": "<string>",
                  "description": "Restreint aux événements de ce type (une valeur du catalogue,\nex. `lead_created`, `booking_created`, `automation_completed`).\nUne valeur hors catalogue répond `400 validation_error`\n(`reason: unknown_event_type`).\n"
                },
                {
                  "disabled": false,
                  "key": "limit",
                  "value": "10",
                  "description": "Nombre maximum d'items (entier de 1 à 25, défaut 10). Une valeur non entière ou hors bornes répond `400 validation_error`."
                }
              ],
              "variable": []
            },
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "GET",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            }
          },
          "response": [
            {
              "id": "5c88e8b6-0317-4cbd-b8a4-0da14dd2e8ef",
              "name": "Derniers événements livrables, du plus récent au plus ancien.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhook-events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "event",
                      "value": "lead_created"
                    },
                    {
                      "key": "limit",
                      "value": "10"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": \"3d2a1b0c-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n      \"event\": \"lead_created\",\n      \"category\": \"crm\",\n      \"created_at\": \"2026-07-01T12:00:00.000Z\",\n      \"data\": {\n        \"resource_type\": \"contact\",\n        \"resource_id\": \"b7c8d9e0-f1a2-4b3c-8d4e-5f6a7b8c9d0e\",\n        \"resource_name\": \"Jean Bouchard\",\n        \"actor\": {\n          \"name\": \"Formulaire web\",\n          \"type\": \"client_user\",\n          \"id\": \"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d\"\n        },\n        \"changes\": null,\n        \"description\": \"Nouveau lead\",\n        \"metadata\": {\n          \"source\": \"funnel\"\n        }\n      }\n    }\n  ],\n  \"pagination\": {\n    \"next_cursor\": null,\n    \"has_more\": false,\n    \"limit\": 1,\n    \"cursor\": null,\n    \"total_count\": 1\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "090af5ad-fecf-412f-86bd-ea6f73ae13f5",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhook-events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "event",
                      "value": "lead_created"
                    },
                    {
                      "key": "limit",
                      "value": "10"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "045f2cab-f2e4-4ed9-9611-95aef4e58c5f",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhook-events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "event",
                      "value": "lead_created"
                    },
                    {
                      "key": "limit",
                      "value": "10"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "2d5b00aa-6bd3-4e88-9468-3802a220c05a",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhook-events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "event",
                      "value": "lead_created"
                    },
                    {
                      "key": "limit",
                      "value": "10"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "10a21f92-77f6-423e-8366-998cf752a8c1",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhook-events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "event",
                      "value": "lead_created"
                    },
                    {
                      "key": "limit",
                      "value": "10"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "6d3269f9-9202-4784-a185-c418bed9f1d6",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "webhook-events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [
                    {
                      "key": "event",
                      "value": "lead_created"
                    },
                    {
                      "key": "limit",
                      "value": "10"
                    }
                  ],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "GET",
                "body": {}
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "ef6298fc-0cfe-4599-9305-db256f5dda32",
      "name": "Presuasion submissions",
      "description": {
        "content": "Soumissions de formulaires d'outils pré-suasion",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "4a6b68c1-c07e-43a9-bd6d-84304466c883",
          "name": "Soumettre un formulaire d'outil pré-suasion",
          "request": {
            "name": "Soumettre un formulaire d'outil pré-suasion",
            "description": {
              "content": "**Endpoint public — convention legacy pré-CAP-440.** Cet endpoint\ns'écarte des conventions standard de l'API v1 sur plusieurs points\ndocumentés ci-dessous. Il est appelé par la gateway pré-suasion\n(`demo.capturia.io`) quand un visiteur complète un formulaire\nd'outil pré-suasion publié sur le custom domain d'un client\nCapturia.\n\n### Authentification : défense en profondeur\n\nPas de clé API Bearer (l'endpoint est appelé par une gateway publique,\npas par un client tiers). Trois couches superposées protègent\nl'endpoint :\n\n1. **Rate-limit IP** (`RATE_LIMIT_CONFIG.LEAD_CREATION_LIMIT` req par\n   `LEAD_WINDOW_SECONDS`) — coupe le bruit haute fréquence.\n2. **Signature HMAC** `X-Capturia-Signature: t=<unix>,v1=<hex>` —\n   pattern Stripe webhook, SHA-256 sur `${timestamp}.${rawBody}`,\n   fenêtre replay 5 min, rotation 2-clés (`PRESUASION_HMAC_SECRET` +\n   `PRESUASION_HMAC_SECRET_PREVIOUS`). Mode log-only par défaut, flip\n   fail-closed via `PRESUASION_HMAC_REQUIRED=true`.\n3. **Token Cloudflare Turnstile** (champ `turnstile_token` du body)\n   vérifié siteverify avec `idempotency_key` = `submission_id` du\n   body (stable entre les retries d'une même soumission — un token\n   est à usage unique, Cloudflare rejoue le verdict original sur la\n   même clé), avec repli sur le `request_id` de la requête quand la\n   soumission ne porte pas de `submission_id`. Mode log-only par\n   défaut, flip fail-closed via\n   `PRESUASION_TURNSTILE_REQUIRED=true`.\n\nEn complément, un **quota par `proposition_slug`** (100 submissions\npar jour UTC, Upstash KV) borne le blast radius d'une attaque ciblée\nmême si les autres couches sont contournées.\n\nLe client cible est résolu serveur-side via `proposition_slug` →\n`presuasion_instances.client_id` — le `client_id` n'est jamais\naccepté depuis le body.\n\n### Body et réponse au format custom\n\nLe body suit un schéma propre à cet endpoint\n(`PresuasionSubmissionPayload`). La réponse 200 retourne un objet\nplat `{success, contact_id, contact_created, activity_id}` au lieu\nde l'enveloppe v1 standard `{data: ...}`. Les erreurs retournent\n`{error: \"string\", issues?: [...]}` au lieu d'`ErrorEnvelope`.\n\n### Comportement\n\n- Resolve le client cible via `proposition_slug` actif.\n- Upsert le contact par `(lower(email), client_id)` — enrichit les\n  champs absents (`first_name`, `phone`) sans jamais écraser les\n  valeurs existantes non-null.\n- Insère une activité `presuasion_submission` dans la timeline du\n  contact avec un bloc humain `Q/R` formaté + `metadata` brute\n  (responses, result_data, tool_id/name, proposition).\n\n### Rate limit\n\nÉmet les headers legacy `X-RateLimit-*` (compteur IP) — pas les\nheaders `RateLimit-*` RFC 9331 du reste de l'API v1.\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "presuasion-submissions"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "disabled": false,
                "description": "Signature HMAC SHA-256 calculée par le gateway sur\n`${timestamp}.${rawBody}` avec `PRESUASION_HMAC_SECRET`. Fenêtre\nde replay 5 minutes. Optionnel en mode log-only ; obligatoire\nquand `PRESUASION_HMAC_REQUIRED=true` (réponse 401 sinon).\n",
                "key": "X-Capturia-Signature",
                "value": "<string>"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": null,
            "body": {
              "mode": "raw",
              "raw": "{\n  \"proposition_slug\": \"<string>\",\n  \"tool_id\": \"<string>\",\n  \"tool_name\": \"<string>\",\n  \"responses\": {\n    \"key_0\": \"string\",\n    \"key_1\": \"string\"\n  },\n  \"formatted_answers\": [\n    {\n      \"question\": \"<string>\",\n      \"answer\": \"<string>\"\n    }\n  ],\n  \"email\": \"<email>\",\n  \"first_name\": \"<string>\",\n  \"last_name\": \"<string>\",\n  \"phone\": \"<string>\",\n  \"address\": \"<string>\",\n  \"postal_code\": \"<string>\",\n  \"address_place_id\": \"<string>\",\n  \"result_data\": {\n    \"key_0\": 8155,\n    \"key_1\": 6168,\n    \"key_2\": 5470\n  },\n  \"completed_at\": \"<dateTime>\",\n  \"turnstile_token\": \"<string>\",\n  \"submission_id\": \"<uuid>\",\n  \"token\": \"<string>\",\n  \"session_key\": \"<uuid>\",\n  \"identity_confirmed\": \"<boolean>\",\n  \"identity_declined\": \"<boolean>\",\n  \"custom_domain_id\": \"<string>\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "2a24d2fa-1cb6-4e93-9143-dde7f8369b21",
              "name": "Soumission enregistrée. Contact upserté + activité\n`presuasion_submission` créée dans la timeline.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "presuasion-submissions"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Signature HMAC SHA-256 calculée par le gateway sur\n`${timestamp}.${rawBody}` avec `PRESUASION_HMAC_SECRET`. Fenêtre\nde replay 5 minutes. Optionnel en mode log-only ; obligatoire\nquand `PRESUASION_HMAC_REQUIRED=true` (réponse 401 sinon).\n",
                    "key": "X-Capturia-Signature",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"proposition_slug\": \"blueprint-ventes-2026\",\n  \"tool_id\": \"calculateur-roi\",\n  \"tool_name\": \"Calculateur de ROI\",\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"phone\": \"+15145551234\",\n  \"responses\": {\n    \"budget\": \"500-1000\",\n    \"timeline\": \"3-mois\"\n  },\n  \"formatted_answers\": [\n    {\n      \"question\": \"Quel est ton défi principal en ventes ?\",\n      \"answer\": \"Je perds des leads parce que je ne suis pas assez rapide à les rappeler.\"\n    }\n  ],\n  \"result_data\": {\n    \"score\": 87,\n    \"recommendation\": \"premium\"\n  },\n  \"completed_at\": \"2026-05-04T12:34:56.789Z\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"success\": true,\n  \"contact_id\": \"8f3b1a2c-9d4e-4f5a-b6c7-d8e9f0a1b2c3\",\n  \"contact_created\": false,\n  \"activity_id\": \"1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d\"\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "f5321108-7cae-4ce9-a786-26aaab2cc0db",
              "name": "Body JSON invalide ou payload Zod invalide. **Convention\nlegacy** — body custom `{error, issues?}` non aligné avec\n`ErrorEnvelope` du catalog v1.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "presuasion-submissions"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Signature HMAC SHA-256 calculée par le gateway sur\n`${timestamp}.${rawBody}` avec `PRESUASION_HMAC_SECRET`. Fenêtre\nde replay 5 minutes. Optionnel en mode log-only ; obligatoire\nquand `PRESUASION_HMAC_REQUIRED=true` (réponse 401 sinon).\n",
                    "key": "X-Capturia-Signature",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"proposition_slug\": \"blueprint-ventes-2026\",\n  \"tool_id\": \"calculateur-roi\",\n  \"tool_name\": \"Calculateur de ROI\",\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"phone\": \"+15145551234\",\n  \"responses\": {\n    \"budget\": \"500-1000\",\n    \"timeline\": \"3-mois\"\n  },\n  \"formatted_answers\": [\n    {\n      \"question\": \"Quel est ton défi principal en ventes ?\",\n      \"answer\": \"Je perds des leads parce que je ne suis pas assez rapide à les rappeler.\"\n    }\n  ],\n  \"result_data\": {\n    \"score\": 87,\n    \"recommendation\": \"premium\"\n  },\n  \"completed_at\": \"2026-05-04T12:34:56.789Z\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Invalid JSON body\"\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "bea32744-756e-4b7b-9202-5455b9dac49d",
              "name": "Signature HMAC `X-Capturia-Signature` manquante, mal formée,\nexpirée (fenêtre 5 min) ou invalide. Émis uniquement quand\n`PRESUASION_HMAC_REQUIRED=true` (mode fail-closed). En mode\nlog-only, les requêtes non signées passent et un warning est\némis pour observabilité.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "presuasion-submissions"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Signature HMAC SHA-256 calculée par le gateway sur\n`${timestamp}.${rawBody}` avec `PRESUASION_HMAC_SECRET`. Fenêtre\nde replay 5 minutes. Optionnel en mode log-only ; obligatoire\nquand `PRESUASION_HMAC_REQUIRED=true` (réponse 401 sinon).\n",
                    "key": "X-Capturia-Signature",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"proposition_slug\": \"blueprint-ventes-2026\",\n  \"tool_id\": \"calculateur-roi\",\n  \"tool_name\": \"Calculateur de ROI\",\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"phone\": \"+15145551234\",\n  \"responses\": {\n    \"budget\": \"500-1000\",\n    \"timeline\": \"3-mois\"\n  },\n  \"formatted_answers\": [\n    {\n      \"question\": \"Quel est ton défi principal en ventes ?\",\n      \"answer\": \"Je perds des leads parce que je ne suis pas assez rapide à les rappeler.\"\n    }\n  ],\n  \"result_data\": {\n    \"score\": 87,\n    \"recommendation\": \"premium\"\n  },\n  \"completed_at\": \"2026-05-04T12:34:56.789Z\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Invalid signature\"\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "3da018d2-de2d-44ee-8efa-d1ee09bbb7df",
              "name": "Token Cloudflare Turnstile manquant, expiré ou rejeté par\nsiteverify. Émis uniquement quand\n`PRESUASION_TURNSTILE_REQUIRED=true` (mode fail-closed).\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "presuasion-submissions"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Signature HMAC SHA-256 calculée par le gateway sur\n`${timestamp}.${rawBody}` avec `PRESUASION_HMAC_SECRET`. Fenêtre\nde replay 5 minutes. Optionnel en mode log-only ; obligatoire\nquand `PRESUASION_HMAC_REQUIRED=true` (réponse 401 sinon).\n",
                    "key": "X-Capturia-Signature",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"proposition_slug\": \"blueprint-ventes-2026\",\n  \"tool_id\": \"calculateur-roi\",\n  \"tool_name\": \"Calculateur de ROI\",\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"phone\": \"+15145551234\",\n  \"responses\": {\n    \"budget\": \"500-1000\",\n    \"timeline\": \"3-mois\"\n  },\n  \"formatted_answers\": [\n    {\n      \"question\": \"Quel est ton défi principal en ventes ?\",\n      \"answer\": \"Je perds des leads parce que je ne suis pas assez rapide à les rappeler.\"\n    }\n  ],\n  \"result_data\": {\n    \"score\": 87,\n    \"recommendation\": \"premium\"\n  },\n  \"completed_at\": \"2026-05-04T12:34:56.789Z\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Captcha verification failed\"\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "2a6350f8-bca0-43e1-889d-3d78276b5687",
              "name": "`proposition_slug` inconnu ou désactivé\n(`presuasion_instances.is_active = false`).\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "presuasion-submissions"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Signature HMAC SHA-256 calculée par le gateway sur\n`${timestamp}.${rawBody}` avec `PRESUASION_HMAC_SECRET`. Fenêtre\nde replay 5 minutes. Optionnel en mode log-only ; obligatoire\nquand `PRESUASION_HMAC_REQUIRED=true` (réponse 401 sinon).\n",
                    "key": "X-Capturia-Signature",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"proposition_slug\": \"blueprint-ventes-2026\",\n  \"tool_id\": \"calculateur-roi\",\n  \"tool_name\": \"Calculateur de ROI\",\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"phone\": \"+15145551234\",\n  \"responses\": {\n    \"budget\": \"500-1000\",\n    \"timeline\": \"3-mois\"\n  },\n  \"formatted_answers\": [\n    {\n      \"question\": \"Quel est ton défi principal en ventes ?\",\n      \"answer\": \"Je perds des leads parce que je ne suis pas assez rapide à les rappeler.\"\n    }\n  ],\n  \"result_data\": {\n    \"score\": 87,\n    \"recommendation\": \"premium\"\n  },\n  \"completed_at\": \"2026-05-04T12:34:56.789Z\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Proposition not found or inactive\"\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "13931cc8-ea4f-4815-9f9f-e7732d48d05c",
              "name": "Le `proposition_slug` existe mais n'est pas relié à un client\nCapturia (`client_id IS NULL`). Erreur de configuration côté\nadmin — la soumission est rejetée plutôt que silencieusement\ndroppée.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "presuasion-submissions"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Signature HMAC SHA-256 calculée par le gateway sur\n`${timestamp}.${rawBody}` avec `PRESUASION_HMAC_SECRET`. Fenêtre\nde replay 5 minutes. Optionnel en mode log-only ; obligatoire\nquand `PRESUASION_HMAC_REQUIRED=true` (réponse 401 sinon).\n",
                    "key": "X-Capturia-Signature",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"proposition_slug\": \"blueprint-ventes-2026\",\n  \"tool_id\": \"calculateur-roi\",\n  \"tool_name\": \"Calculateur de ROI\",\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"phone\": \"+15145551234\",\n  \"responses\": {\n    \"budget\": \"500-1000\",\n    \"timeline\": \"3-mois\"\n  },\n  \"formatted_answers\": [\n    {\n      \"question\": \"Quel est ton défi principal en ventes ?\",\n      \"answer\": \"Je perds des leads parce que je ne suis pas assez rapide à les rappeler.\"\n    }\n  ],\n  \"result_data\": {\n    \"score\": 87,\n    \"recommendation\": \"premium\"\n  },\n  \"completed_at\": \"2026-05-04T12:34:56.789Z\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Proposition not linked to a Capturia client\"\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "3e0a1773-4809-4b51-bdec-7c08fc59054b",
              "name": "Deux variantes possibles :\n\n* **Rate limit IP dépassé** — body `{error: \"Too many requests\"}`,\n  headers `X-RateLimit-*` (convention legacy).\n* **Quota par `proposition_slug` dépassé** (100/jour UTC) — body\n  `{error: \"Slug quota exceeded\"}` accompagné du header standard\n  `Retry-After` (secondes jusqu'à minuit UTC) en plus des\n  `X-RateLimit-*`.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "presuasion-submissions"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Signature HMAC SHA-256 calculée par le gateway sur\n`${timestamp}.${rawBody}` avec `PRESUASION_HMAC_SECRET`. Fenêtre\nde replay 5 minutes. Optionnel en mode log-only ; obligatoire\nquand `PRESUASION_HMAC_REQUIRED=true` (réponse 401 sinon).\n",
                    "key": "X-Capturia-Signature",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"proposition_slug\": \"blueprint-ventes-2026\",\n  \"tool_id\": \"calculateur-roi\",\n  \"tool_name\": \"Calculateur de ROI\",\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"phone\": \"+15145551234\",\n  \"responses\": {\n    \"budget\": \"500-1000\",\n    \"timeline\": \"3-mois\"\n  },\n  \"formatted_answers\": [\n    {\n      \"question\": \"Quel est ton défi principal en ventes ?\",\n      \"answer\": \"Je perds des leads parce que je ne suis pas assez rapide à les rappeler.\"\n    }\n  ],\n  \"result_data\": {\n    \"score\": 87,\n    \"recommendation\": \"premium\"\n  },\n  \"completed_at\": \"2026-05-04T12:34:56.789Z\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Too many requests\"\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "a70fddee-f073-4f27-a89f-e0b873a3b5d6",
              "name": "Erreur serveur (lookup proposition, upsert contact ou insert\nactivité). **Convention legacy** — body custom\n`{error: \"string\"}` au lieu d'`ErrorEnvelope`.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "presuasion-submissions"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Signature HMAC SHA-256 calculée par le gateway sur\n`${timestamp}.${rawBody}` avec `PRESUASION_HMAC_SECRET`. Fenêtre\nde replay 5 minutes. Optionnel en mode log-only ; obligatoire\nquand `PRESUASION_HMAC_REQUIRED=true` (réponse 401 sinon).\n",
                    "key": "X-Capturia-Signature",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"proposition_slug\": \"blueprint-ventes-2026\",\n  \"tool_id\": \"calculateur-roi\",\n  \"tool_name\": \"Calculateur de ROI\",\n  \"email\": \"alex@example.com\",\n  \"first_name\": \"Alex\",\n  \"phone\": \"+15145551234\",\n  \"responses\": {\n    \"budget\": \"500-1000\",\n    \"timeline\": \"3-mois\"\n  },\n  \"formatted_answers\": [\n    {\n      \"question\": \"Quel est ton défi principal en ventes ?\",\n      \"answer\": \"Je perds des leads parce que je ne suis pas assez rapide à les rappeler.\"\n    }\n  ],\n  \"result_data\": {\n    \"score\": 87,\n    \"recommendation\": \"premium\"\n  },\n  \"completed_at\": \"2026-05-04T12:34:56.789Z\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": \"Server error\"\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    },
    {
      "id": "e424de21-ffc9-4ebe-8cea-2d88bc65d69b",
      "name": "Events",
      "description": {
        "content": "Ingestion d'événements personnalisés qui déclenchent les automatisations",
        "type": "text/plain"
      },
      "item": [
        {
          "id": "6bde1f59-b85a-4def-8159-19b39b445dae",
          "name": "Pousser un événement personnalisé qui déclenche les automatisations",
          "request": {
            "name": "Pousser un événement personnalisé qui déclenche les automatisations",
            "description": {
              "content": "Webhook entrant générique par compte : une source externe (Zapier, Make,\nn8n, un backend client, un outil tiers) pousse un événement nommé avec\nses données. Capturia résout le contact (`external_id` → `phone` →\n`email`), enrichit sa fiche de façon non-destructive, remplit les champs\npersonnalisés mappés, enregistre l'événement sur la fiche, puis démarre\nles automatisations dont le déclencheur « Événement personnalisé »\nécoute ce nom d'événement — avec le `payload` disponible dans les\nmessages via `{{event.<clé>}}`.\n\n### Résolution du contact\nAu moins un identifiant est requis (`external_id`, `email` ou `phone`).\nSi aucun contact ne matche, une fiche minimale est créée — sauf si\n`contact.create_if_missing` est `false`, auquel cas la requête répond\n`404 contact_not_found` sans rien enregistrer. Si les identifiants ne\nmatchent qu'une fiche **archivée**, l'événement est enregistré dessus\n(traçabilité) mais la fiche n'est pas modifiée et aucune automatisation\nn'est enrôlée (`contact_archived: true`).\n\n### Consentement (Loi 25 / LCAP)\nLa réception d'un événement n'établit **aucun** consentement de\ncommunication. Un contact créé par ce chemin ne peut pas recevoir de\nSMS/courriel tant qu'un consentement n'est pas capté par un autre flux ;\nune automatisation déclenchée qui tenterait un envoi sans consentement\nest bloquée par les gardes du moteur d'exécution.\n\n### Signature HMAC optionnelle\nEn plus de la clé API, la requête peut porter une signature\n`X-Capturia-Signature: t=<unix>,v1=<hex>` — HMAC-SHA256 de\n`${t}.${corps brut}` calculée avec **la clé API brute comme secret**,\nfenêtre anti-replay de 5 minutes. Dès que le header est présent, la\nvalidation est stricte (fail-closed) : signature invalide = `401\ninvalid_signature`. Sans le header, la clé API seule authentifie.\n\n### Idempotency\nLe header `Idempotency-Key` est optionnel mais recommandé pour les\nretries : une 2e requête avec la même clé et le même payload renvoie la\nréponse d'origine sans ré-ingérer l'événement (stockage 24h ; payload\ndifférent = `409 idempotency_conflict`). Par ailleurs, l'enrôlement des\nautomatisations porte sa propre dédup de 5 minutes par contact et par\nautomatisation.\n\n### Codes d'erreur custom\n- **429** — `rate_limited_ip` quand la limite IP (120 req/min) est\n  atteinte, header `X-RateLimit-Scope: ip`. Limite par clé : 60 req/min\n  (modulable par clé).\n",
              "type": "text/plain"
            },
            "url": {
              "path": [
                "v1",
                "events"
              ],
              "host": [
                "{{baseUrl}}"
              ],
              "query": [],
              "variable": []
            },
            "header": [
              {
                "disabled": false,
                "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                "key": "Idempotency-Key",
                "value": "<string>"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "method": "POST",
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{bearerToken}}"
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event\": \"<string>\",\n  \"contact\": {\n    \"external_id\": \"<string>\",\n    \"external_source\": \"<string>\",\n    \"email\": \"<email>\",\n    \"phone\": \"<string>\",\n    \"first_name\": \"<string>\",\n    \"last_name\": \"<string>\",\n    \"create_if_missing\": true\n  },\n  \"payload\": {\n    \"key_0\": 1904.1998032524486,\n    \"key_1\": 5252.661422778081,\n    \"key_2\": 5738.256068866065\n  },\n  \"custom_fields\": {\n    \"key_0\": \"string\"\n  },\n  \"source_label\": \"<string>\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "id": "a5f7c741-3e64-4805-b5bc-4d6627d45c55",
              "name": "Événement ingéré (`status: ingested`). `enrolled_executions` indique\ncombien d'automatisations ont démarré ; `0` signifie qu'aucune\nautomatisation active n'écoute ce nom d'événement — l'événement est\nquand même enregistré sur la fiche contact.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event\": \"abandon_panier\",\n  \"contact\": {\n    \"external_id\": \"user-4821\",\n    \"external_source\": \"mon-backend\",\n    \"email\": \"alex@example.com\",\n    \"first_name\": \"Alex\"\n  },\n  \"payload\": {\n    \"montant\": 249.99,\n    \"produit\": \"Forfait Pro\",\n    \"url_panier\": \"https://boutique.example.com/panier/abc123\"\n  },\n  \"custom_fields\": {\n    \"plan_vise\": \"pro\"\n  },\n  \"source_label\": \"Boutique en ligne\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "disabled": false,
                  "description": "ULID de la requête, utilisable pour debug avec le support.",
                  "key": "X-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Alias de X-Request-ID (compat avec clients qui filtrent les headers `X-*` legacy).",
                  "key": "Capturia-Request-ID",
                  "value": "req_JKJN8WHHAYXAD9Z257CQGDAWSY"
                },
                {
                  "disabled": false,
                  "description": "Version de l'API qui a servi la response (toujours `v1` aujourd'hui).",
                  "key": "Capturia-Version",
                  "value": "v1"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"ingested\",\n  \"contact_id\": \"0a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d\",\n  \"contact_created\": false,\n  \"contact_archived\": false,\n  \"activity_id\": \"1b2c3d4e-5f6a-7b8c-9d0e-1f2a3b4c5d6e\",\n  \"enrolled_executions\": 1,\n  \"event\": \"abandon_panier\",\n  \"message\": \"Event ingested. 1 automation(s) enrolled.\"\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "18ed6a91-4105-4cba-8fb2-96e24c7b69bc",
              "name": "La requête est mal formée (header manquant, JSON invalide, paramètre invalide).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event\": \"abandon_panier\",\n  \"contact\": {\n    \"external_id\": \"user-4821\",\n    \"external_source\": \"mon-backend\",\n    \"email\": \"alex@example.com\",\n    \"first_name\": \"Alex\"\n  },\n  \"payload\": {\n    \"montant\": 249.99,\n    \"produit\": \"Forfait Pro\",\n    \"url_panier\": \"https://boutique.example.com/panier/abc123\"\n  },\n  \"custom_fields\": {\n    \"plan_vise\": \"pro\"\n  },\n  \"source_label\": \"Boutique en ligne\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Bad Request",
              "code": 400,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"invalid_request\",\n    \"message\": \"Le paramètre 'cursor' est invalide ou expiré.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#invalid_request\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"field\": \"cursor\",\n      \"reason\": \"malformed_base64\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "c080a983-b7ef-4c5d-9187-0d811b0d96b6",
              "name": "Clé API inconnue ou format invalide.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event\": \"abandon_panier\",\n  \"contact\": {\n    \"external_id\": \"user-4821\",\n    \"external_source\": \"mon-backend\",\n    \"email\": \"alex@example.com\",\n    \"first_name\": \"Alex\"\n  },\n  \"payload\": {\n    \"montant\": 249.99,\n    \"produit\": \"Forfait Pro\",\n    \"url_panier\": \"https://boutique.example.com/panier/abc123\"\n  },\n  \"custom_fields\": {\n    \"plan_vise\": \"pro\"\n  },\n  \"source_label\": \"Boutique en ligne\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authentication_error\",\n    \"code\": \"invalid_api_key\",\n    \"message\": \"La clé API fournie est invalide.\",\n    \"hint\": \"Vérifie que tu utilises la valeur complète affichée à la création de la clé.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#invalid_api_key\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "9e0290f6-232c-457b-8b24-4c2caf1c513a",
              "name": "Refus d'autorisation. Deux causes, distinguées par `code` : `insufficient_scope` (la clé ne possède pas le scope requis — `details.required_scope`) ou `feature_not_available` (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — `details.feature` nomme la fonctionnalité, ex. `public_api`, `quotes`). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event\": \"abandon_panier\",\n  \"contact\": {\n    \"external_id\": \"user-4821\",\n    \"external_source\": \"mon-backend\",\n    \"email\": \"alex@example.com\",\n    \"first_name\": \"Alex\"\n  },\n  \"payload\": {\n    \"montant\": 249.99,\n    \"produit\": \"Forfait Pro\",\n    \"url_panier\": \"https://boutique.example.com/panier/abc123\"\n  },\n  \"custom_fields\": {\n    \"plan_vise\": \"pro\"\n  },\n  \"source_label\": \"Boutique en ligne\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Forbidden",
              "code": 403,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"authorization_error\",\n    \"code\": \"insufficient_scope\",\n    \"message\": \"Cette opération requiert le scope `contacts:write`.\",\n    \"hint\": \"Édite la clé pour lui ajouter le scope manquant, ou utilise une clé avec un scope plus large.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/authentication#scopes\",\n    \"dashboard_url\": \"https://app.capturia.io/platform/dashboard/admin/integrations/api-keys/ak_01J9X8Z3F4K2M5N7P9Q1R3S5T7?tab=permissions\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"required_scope\": \"contacts:write\",\n      \"current_scopes\": [\n        \"contacts:read\",\n        \"leads:capture\"\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "9706e8b7-f103-4711-b1f8-0e9a74762f80",
              "name": "La ressource demandée n'existe pas (ou pas dans le scope du tenant).",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event\": \"abandon_panier\",\n  \"contact\": {\n    \"external_id\": \"user-4821\",\n    \"external_source\": \"mon-backend\",\n    \"email\": \"alex@example.com\",\n    \"first_name\": \"Alex\"\n  },\n  \"payload\": {\n    \"montant\": 249.99,\n    \"produit\": \"Forfait Pro\",\n    \"url_panier\": \"https://boutique.example.com/panier/abc123\"\n  },\n  \"custom_fields\": {\n    \"plan_vise\": \"pro\"\n  },\n  \"source_label\": \"Boutique en ligne\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Not Found",
              "code": 404,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"not_found_error\",\n    \"code\": \"resource_not_found\",\n    \"message\": \"Le contact demandé n'existe pas.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#resource_not_found\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"resource\": \"contact\",\n      \"id\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "5831d7aa-a2fe-4ca6-85fd-bb1fc191d499",
              "name": "Une requête précédente avec la même `Idempotency-Key` a utilisé un payload différent,\nou est encore en cours de traitement.\n",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event\": \"abandon_panier\",\n  \"contact\": {\n    \"external_id\": \"user-4821\",\n    \"external_source\": \"mon-backend\",\n    \"email\": \"alex@example.com\",\n    \"first_name\": \"Alex\"\n  },\n  \"payload\": {\n    \"montant\": 249.99,\n    \"produit\": \"Forfait Pro\",\n    \"url_panier\": \"https://boutique.example.com/panier/abc123\"\n  },\n  \"custom_fields\": {\n    \"plan_vise\": \"pro\"\n  },\n  \"source_label\": \"Boutique en ligne\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Conflict",
              "code": 409,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"idempotency_error\",\n    \"code\": \"idempotency_conflict\",\n    \"message\": \"Une requête avec cette Idempotency-Key existe avec un payload différent.\",\n    \"hint\": \"Utilise une nouvelle Idempotency-Key, ou rejoue la requête originale à l'identique.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/conventions#idempotency\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"idempotency_key\": \"01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n      \"original_request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T6\"\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "c31132cf-a312-4325-8447-9f9a3eb4c2fe",
              "name": "Validation des paramètres ou du body a échoué.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event\": \"abandon_panier\",\n  \"contact\": {\n    \"external_id\": \"user-4821\",\n    \"external_source\": \"mon-backend\",\n    \"email\": \"alex@example.com\",\n    \"first_name\": \"Alex\"\n  },\n  \"payload\": {\n    \"montant\": 249.99,\n    \"produit\": \"Forfait Pro\",\n    \"url_panier\": \"https://boutique.example.com/panier/abc123\"\n  },\n  \"custom_fields\": {\n    \"plan_vise\": \"pro\"\n  },\n  \"source_label\": \"Boutique en ligne\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Unprocessable Entity (WebDAV) (RFC 4918)",
              "code": 422,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"validation_error\",\n    \"code\": \"validation_error\",\n    \"message\": \"Le champ 'email' est requis.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#validation_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"validation_errors\": [\n        {\n          \"path\": \"/email\",\n          \"reason\": \"required\"\n        }\n      ]\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "3381f912-a2b1-4a6a-a8e3-df94dba4d9e2",
              "name": "Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event\": \"abandon_panier\",\n  \"contact\": {\n    \"external_id\": \"user-4821\",\n    \"external_source\": \"mon-backend\",\n    \"email\": \"alex@example.com\",\n    \"first_name\": \"Alex\"\n  },\n  \"payload\": {\n    \"montant\": 249.99,\n    \"produit\": \"Forfait Pro\",\n    \"url_panier\": \"https://boutique.example.com/panier/abc123\"\n  },\n  \"custom_fields\": {\n    \"plan_vise\": \"pro\"\n  },\n  \"source_label\": \"Boutique en ligne\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Too Many Requests",
              "code": 429,
              "header": [
                {
                  "disabled": false,
                  "description": "Secondes à attendre avant de retry (RFC 7231). Émis sur 429 et 503.",
                  "key": "Retry-After",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes par fenêtre (RFC 9331).",
                  "key": "RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes dans la fenêtre en cours (RFC 9331).",
                  "key": "RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Secondes avant reset de la fenêtre (RFC 9331, delta-seconds).",
                  "key": "RateLimit-Reset",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Politique de rate limit en format structuré (RFC 9331), ex `100;w=3600`.",
                  "key": "RateLimit-Policy",
                  "value": "100;w=3600"
                },
                {
                  "disabled": false,
                  "description": "Limite de requêtes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Limit",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Requêtes restantes (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Remaining",
                  "value": "3431"
                },
                {
                  "disabled": false,
                  "description": "Timestamp ISO du reset (legacy, sunset 2027-05-03).",
                  "key": "X-RateLimit-Reset",
                  "value": "1984-03-24T09:08:11.791Z"
                },
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"rate_limit_error\",\n    \"code\": \"rate_limit_exceeded\",\n    \"message\": \"Quota de requêtes dépassé. Réessaie dans 42 secondes.\",\n    \"hint\": \"Lis les headers `RateLimit-*` pour connaître la limite et le reset.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/rate-limits\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\",\n    \"details\": {\n      \"limit_type\": \"per_key\",\n      \"retry_after_seconds\": 42\n    }\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            },
            {
              "id": "04d6764a-140f-4f14-b1bf-a436482e18da",
              "name": "Erreur serveur inattendue. Toujours fournir le `request_id` au support.",
              "originalRequest": {
                "url": {
                  "path": [
                    "v1",
                    "events"
                  ],
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "query": [],
                  "variable": []
                },
                "header": [
                  {
                    "description": {
                      "content": "Added as a part of security scheme: bearer",
                      "type": "text/plain"
                    },
                    "key": "Authorization",
                    "value": "Bearer <token>"
                  },
                  {
                    "disabled": false,
                    "description": "Clé d'idempotence (UUID v4 ou ULID recommandé). Une 2e requête avec la même clé et le même payload\nrenvoie la response d'origine sans dupliquer l'opération. Stockée 24h. Optionnel mais recommandé.\n",
                    "key": "Idempotency-Key",
                    "value": "<string>"
                  },
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "method": "POST",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"event\": \"abandon_panier\",\n  \"contact\": {\n    \"external_id\": \"user-4821\",\n    \"external_source\": \"mon-backend\",\n    \"email\": \"alex@example.com\",\n    \"first_name\": \"Alex\"\n  },\n  \"payload\": {\n    \"montant\": 249.99,\n    \"produit\": \"Forfait Pro\",\n    \"url_panier\": \"https://boutique.example.com/panier/abc123\"\n  },\n  \"custom_fields\": {\n    \"plan_vise\": \"pro\"\n  },\n  \"source_label\": \"Boutique en ligne\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "Internal Server Error",
              "code": 500,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"error\": {\n    \"type\": \"server_error\",\n    \"code\": \"internal_error\",\n    \"message\": \"Une erreur interne est survenue. L'incident a été reporté.\",\n    \"hint\": \"Réessaie dans quelques secondes. Si l'erreur persiste, contacte le support avec le request_id.\",\n    \"doc_url\": \"https://capturia.io/fr/developers/api/v1/errors#internal_error\",\n    \"request_id\": \"req_01J9X8Z3F4K2M5N7P9Q1R3S5T7\"\n  }\n}",
              "cookie": [],
              "_postman_previewlanguage": "json"
            }
          ],
          "event": [],
          "protocolProfileBehavior": {
            "disableBodyPruning": true
          }
        }
      ],
      "event": []
    }
  ],
  "event": [],
  "variable": [
    {
      "type": "string",
      "value": "https://api.capturia.io",
      "key": "baseUrl"
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{bearerToken}}"
      }
    ]
  },
  "info": {
    "_postman_id": "cf6fcc49-ed22-43d4-aeb8-2adf1602d409",
    "name": "Capturia API",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "description": {
      "content": "L'API Capturia permet d'intégrer Capturia avec des outils tiers (Make, Zapier,\ncode custom, CRMs externes) via des endpoints REST authentifiés par clé API.\n\n## Démarrage rapide\n\n1. Créer une clé API dans le dashboard : `Admin → Intégrations → Clés API`\n2. Choisir le preset adapté (`Capture de leads` pour pousser des leads depuis un funnel)\n3. Tester avec `GET /v1/me` pour vérifier que la clé fonctionne\n4. Capturer un lead : `POST /v1/leads/capture`\n\nDocumentation complète : https://capturia.io/fr/developers\n\n\nContact Support:\n Name: Capturia Support\n Email: support@capturia.io",
      "type": "text/plain"
    }
  }
}
