{
  "openapi": "3.1.0",
  "info": {
    "title": "API COVERAF",
    "version": "1.0.0",
    "description": "Devis, souscription, paiement et documents des assurances COVERAF. Documentation : https://docs.coveraf.com",
    "contact": {
      "name": "COVERAF (OPTIMUS AFRICA)",
      "email": "contact@optimus-ci.com"
    }
  },
  "servers": [
    {
      "url": "https://api.coveraf.com",
      "description": "Sandbox et production (l'environnement dépend de la clé)"
    }
  ],
  "security": [
    {
      "cle": []
    }
  ],
  "paths": {
    "/v1/ping": {
      "get": {
        "operationId": "ping",
        "tags": [
          "Vérification"
        ],
        "summary": "Vérifie votre clé et indique l'environnement (test ou live)",
        "description": "Vérifie votre clé et indique l'environnement (test ou live).",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "example": {
                  "ok": true,
                  "environnement": "test",
                  "partenaire": "Votre société",
                  "signature_verifiee": false,
                  "date_serveur": "2026-11-04T17:35:32.433Z"
                }
              }
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "pingSigne",
        "tags": [
          "Vérification"
        ],
        "summary": "Vérifie en plus votre signature",
        "description": "Vérifie en plus votre signature. Renvoie le corps reçu (signature_verifiee: true). Ne crée rien.",
        "parameters": [
          {
            "name": "X-Coveraf-Timestamp",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Horodatage Unix en secondes."
          },
          {
            "name": "X-Coveraf-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "v1=<HMAC-SHA256 hexadécimal de \"<timestamp>.<MÉTHODE>.<chemin>.<corps>\">."
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {}
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "/v1/produits": {
      "get": {
        "operationId": "produits",
        "tags": [
          "Catalogue"
        ],
        "summary": "Offres ouvertes à votre compte, avec leurs garanties",
        "description": "Offres ouvertes à votre compte, avec leurs garanties. disponible: false si une offre est momentanément retirée de la vente.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {}
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/v1/produits/{code}": {
      "get": {
        "operationId": "produit",
        "tags": [
          "Catalogue"
        ],
        "summary": "Une offre, avec un exemple de demande de devis prêt à l'emploi (exemple_devis)",
        "description": "Une offre, avec un exemple de demande de devis prêt à l'emploi (exemple_devis).",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Code de l'offre (GET /v1/produits)."
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "example": {
                  "code": "securvie_500k",
                  "produit": "vie",
                  "libelle": "SecurVie 500 000 FCFA",
                  "description": "Assurance temporaire décès : capital versé aux bénéficiaires en cas de décès de l'assuré.",
                  "duree": "12 mois",
                  "documents": [
                    "conditions_generales",
                    "conditions_particulieres"
                  ],
                  "disponible": true,
                  "garanties": {
                    "capital_deces": 500000,
                    "age_max": 65
                  },
                  "exemple_devis": {
                    "offre": "securvie_500k",
                    "donnees": {
                      "assure": {
                        "date_naissance": "1985-06-15"
                      }
                    }
                  }
                }
              }
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/v1/produits/{code}/conditions-generales": {
      "get": {
        "operationId": "cg",
        "tags": [
          "Catalogue"
        ],
        "summary": "Conditions Générales de l'offre (PDF), à remettre au client AVANT le paiement",
        "description": "Conditions Générales de l'offre (PDF), à remettre au client AVANT le paiement. Document de test en sandbox.",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Code de l'offre (GET /v1/produits)."
          }
        ],
        "responses": {
          "200": {
            "description": "Document PDF",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/v1/devis": {
      "post": {
        "operationId": "devis",
        "tags": [
          "Devis"
        ],
        "summary": "Calcule le prix d'une offre",
        "description": "Calcule le prix d'une offre. Le prix est garanti jusqu'à expire_le (15 jours).",
        "parameters": [
          {
            "name": "X-Coveraf-Timestamp",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Horodatage Unix en secondes."
          },
          {
            "name": "X-Coveraf-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "v1=<HMAC-SHA256 hexadécimal de \"<timestamp>.<MÉTHODE>.<chemin>.<corps>\">."
          }
        ],
        "responses": {
          "201": {
            "description": "Succès",
            "content": {
              "application/json": {
                "example": {
                  "id": "dev_68e56446d4b5c6875911f178",
                  "objet": "devis",
                  "environnement": "test",
                  "offre": "securvie_500k",
                  "produit": "vie",
                  "prime": {
                    "nette": 11000,
                    "accessoires": 0,
                    "taxes": 1980,
                    "totale": 12980,
                    "devise": "XOF"
                  },
                  "duree_mois": 12,
                  "detail": null,
                  "donnees": {
                    "assure": {
                      "date_naissance": "1985-06-15"
                    }
                  },
                  "reference_partenaire": "CMD-2026-0042",
                  "expire_le": "2026-11-19T17:35:33.439+00:00",
                  "expire": false,
                  "cree_le": "2026-11-04T17:35:33.447204+00:00"
                }
              }
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "offre": "securvie_500k",
                "donnees": {
                  "assure": {
                    "date_naissance": "1985-06-15"
                  }
                },
                "reference_partenaire": "CMD-2026-0042"
              }
            }
          }
        }
      }
    },
    "/v1/devis/{id}": {
      "get": {
        "operationId": "devisLire",
        "tags": [
          "Devis"
        ],
        "summary": "Relit un de vos devis",
        "description": "Relit un de vos devis.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Identifiant (dev_... ou sou_...)."
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "example": {
                  "id": "dev_68e56446d4b5c6875911f178",
                  "objet": "devis",
                  "environnement": "test",
                  "offre": "securvie_500k",
                  "produit": "vie",
                  "prime": {
                    "nette": 11000,
                    "accessoires": 0,
                    "taxes": 1980,
                    "totale": 12980,
                    "devise": "XOF"
                  },
                  "duree_mois": 12,
                  "detail": null,
                  "donnees": {
                    "assure": {
                      "date_naissance": "1985-06-15"
                    }
                  },
                  "reference_partenaire": "CMD-2026-0042",
                  "expire_le": "2026-11-19T17:35:33.439+00:00",
                  "expire": false,
                  "cree_le": "2026-11-04T17:35:33.447204+00:00"
                }
              }
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/v1/souscriptions": {
      "post": {
        "operationId": "souscription",
        "tags": [
          "Souscription"
        ],
        "summary": "Enregistre une demande de souscription à partir d'un devis et renvoie le montant à payer",
        "description": "Enregistre une demande de souscription à partir d'un devis et renvoie le montant à payer. Aucun contrat n'est créé à ce stade.",
        "parameters": [
          {
            "name": "X-Coveraf-Timestamp",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Horodatage Unix en secondes."
          },
          {
            "name": "X-Coveraf-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "v1=<HMAC-SHA256 hexadécimal de \"<timestamp>.<MÉTHODE>.<chemin>.<corps>\">."
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128
            },
            "description": "Identifiant unique de l'opération (UUID)."
          }
        ],
        "responses": {
          "201": {
            "description": "Succès",
            "content": {
              "application/json": {
                "example": {
                  "id": "sou_8a1ab1eb752f13c8f09bb0b6",
                  "objet": "souscription",
                  "environnement": "test",
                  "statut": "en_attente_paiement",
                  "devis_id": "dev_68e56446d4b5c6875911f178",
                  "montant_a_payer": {
                    "montant": 12980,
                    "devise": "XOF"
                  },
                  "mode_paiement": "encaissement_partenaire",
                  "date_effet_prevue": "2026-11-04",
                  "souscripteur": {
                    "nom": "KONE",
                    "prenom": "Awa",
                    "telephone": "+2250701020304"
                  },
                  "reference_partenaire": "CMD-2026-0042",
                  "paiement": null,
                  "contrat": null,
                  "expire_le": "2026-11-19T17:35:33.439+00:00",
                  "payee_le": null,
                  "cree_le": "2026-11-04T17:35:33.887733+00:00"
                }
              }
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "devis_id": "dev_68e56446d4b5c6875911f178",
                "souscripteur": {
                  "nom": "KONE",
                  "prenom": "Awa",
                  "telephone": "+2250701020304",
                  "email": "awa.kone@example.com",
                  "adresse": "Cocody, Abidjan",
                  "date_naissance": "1990-04-12"
                },
                "date_effet": "2026-11-04",
                "informations": {
                  "profession": "Commerçante",
                  "beneficiaires": [
                    {
                      "nom": "KONE Moussa",
                      "lien": "Conjoint",
                      "contact": "0707070707",
                      "part": 100
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/v1/souscriptions/{id}": {
      "get": {
        "operationId": "souscriptionLire",
        "tags": [
          "Souscription"
        ],
        "summary": "État de la demande (en_attente_paiement, payee, expiree), dernière tentative de paiement Mobile Money et numéro du contrat une fois payée",
        "description": "État de la demande (en_attente_paiement, payee, expiree), dernière tentative de paiement Mobile Money et numéro du contrat une fois payée.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Identifiant (dev_... ou sou_...)."
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "example": {
                  "id": "sou_f6ac5791c1dd467dd238607f",
                  "objet": "souscription",
                  "environnement": "test",
                  "statut": "payee",
                  "devis_id": "dev_44cfca8ed08b74ff676b9474",
                  "montant_a_payer": {
                    "montant": 12980,
                    "devise": "XOF"
                  },
                  "mode_paiement": "jeko",
                  "date_effet_prevue": "2026-11-04",
                  "souscripteur": {
                    "nom": "KONE",
                    "prenom": "Awa",
                    "telephone": "+2250701020304"
                  },
                  "reference_partenaire": "CMD-2026-0042",
                  "paiement": {
                    "id": "pay_e6bf7dd3fd60f74b08c1fef9",
                    "statut": "reussi",
                    "operateur": "orange",
                    "montant": 12980,
                    "lien_paiement": null,
                    "motif_echec": null,
                    "cree_le": "2026-11-04T17:35:45.931257+00:00"
                  },
                  "contrat": {
                    "numero": "TEST-CVR-API-MW2EE3CW-0845CBC0B0",
                    "adresse": "/v1/contrats/TEST-CVR-API-MW2EE3CW-0845CBC0B0"
                  },
                  "expire_le": "2026-11-19T17:35:42.74+00:00",
                  "payee_le": "2026-11-04T17:35:49.232+00:00",
                  "cree_le": "2026-11-04T17:35:43.359143+00:00"
                }
              }
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/v1/souscriptions/{id}/confirmer-paiement": {
      "post": {
        "operationId": "confirmer",
        "tags": [
          "Paiement"
        ],
        "summary": "Mode A (vous encaissez) : déclare votre encaissement",
        "description": "Mode A (vous encaissez) : déclare votre encaissement. Le contrat est émis dans la même réponse.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Identifiant (dev_... ou sou_...)."
          },
          {
            "name": "X-Coveraf-Timestamp",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Horodatage Unix en secondes."
          },
          {
            "name": "X-Coveraf-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "v1=<HMAC-SHA256 hexadécimal de \"<timestamp>.<MÉTHODE>.<chemin>.<corps>\">."
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128
            },
            "description": "Identifiant unique de l'opération (UUID)."
          }
        ],
        "responses": {
          "201": {
            "description": "Succès",
            "content": {
              "application/json": {
                "example": {
                  "id": "sou_8a1ab1eb752f13c8f09bb0b6",
                  "objet": "souscription",
                  "environnement": "test",
                  "statut": "payee",
                  "devis_id": "dev_68e56446d4b5c6875911f178",
                  "montant_a_payer": {
                    "montant": 12980,
                    "devise": "XOF"
                  },
                  "mode_paiement": "encaissement_partenaire",
                  "date_effet_prevue": "2026-11-04",
                  "souscripteur": {
                    "nom": "KONE",
                    "prenom": "Awa",
                    "telephone": "+2250701020304"
                  },
                  "reference_partenaire": "CMD-2026-0042",
                  "paiement": null,
                  "contrat": {
                    "numero": "TEST-CVR-API-MW2EDTG6-F92441FC41",
                    "adresse": "/v1/contrats/TEST-CVR-API-MW2EDTG6-F92441FC41"
                  },
                  "expire_le": "2026-11-19T17:35:33.439+00:00",
                  "payee_le": "2026-11-04T17:35:36.2+00:00",
                  "cree_le": "2026-11-04T17:35:33.887733+00:00"
                }
              }
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "reference_transaction": "OM-13733933",
                "operateur": "orange",
                "montant": 12980
              }
            }
          }
        }
      }
    },
    "/v1/souscriptions/{id}/paiement": {
      "post": {
        "operationId": "payer",
        "tags": [
          "Paiement"
        ],
        "summary": "Mode B (COVERAF encaisse) : lance un paiement Mobile Money",
        "description": "Mode B (COVERAF encaisse) : lance un paiement Mobile Money. Résultat par notification ou GET /v1/souscriptions/{id}.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Identifiant (dev_... ou sou_...)."
          },
          {
            "name": "X-Coveraf-Timestamp",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Horodatage Unix en secondes."
          },
          {
            "name": "X-Coveraf-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "v1=<HMAC-SHA256 hexadécimal de \"<timestamp>.<MÉTHODE>.<chemin>.<corps>\">."
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128
            },
            "description": "Identifiant unique de l'opération (UUID)."
          }
        ],
        "responses": {
          "201": {
            "description": "Succès",
            "content": {
              "application/json": {
                "example": {
                  "id": "sou_f6ac5791c1dd467dd238607f",
                  "objet": "souscription",
                  "environnement": "test",
                  "statut": "en_attente_paiement",
                  "devis_id": "dev_44cfca8ed08b74ff676b9474",
                  "montant_a_payer": {
                    "montant": 12980,
                    "devise": "XOF"
                  },
                  "mode_paiement": "jeko",
                  "date_effet_prevue": "2026-11-04",
                  "souscripteur": {
                    "nom": "KONE",
                    "prenom": "Awa",
                    "telephone": "+2250701020304"
                  },
                  "reference_partenaire": "CMD-2026-0042",
                  "paiement": {
                    "id": "pay_e6bf7dd3fd60f74b08c1fef9",
                    "statut": "en_attente",
                    "operateur": "orange",
                    "montant": 12980,
                    "lien_paiement": "http://localhost:3005/sandbox/paiement/pay_e6bf7dd3fd60f74b08c1fef9",
                    "motif_echec": null,
                    "cree_le": "2026-11-04T17:35:45.931257+00:00"
                  },
                  "contrat": null,
                  "expire_le": "2026-11-19T17:35:42.74+00:00",
                  "payee_le": null,
                  "cree_le": "2026-11-04T17:35:43.359143+00:00"
                }
              }
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              },
              "example": {
                "operateur": "orange",
                "telephone_payeur": "0700000001",
                "url_retour": "https://app.votre-societe.ci/paiement/retour"
              }
            }
          }
        }
      }
    },
    "/v1/contrats": {
      "get": {
        "operationId": "contrats",
        "tags": [
          "Contrats"
        ],
        "summary": "Vos contrats, du plus récent au plus ancien, page par page",
        "description": "Vos contrats, du plus récent au plus ancien, page par page.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "example": {
                  "objet": "liste",
                  "donnees": [
                    {
                      "numero": "TEST-CVR-API-MW2EDTG6-F92441FC41",
                      "objet": "contrat",
                      "environnement": "test",
                      "statut": "actif",
                      "offre": "securvie_500k",
                      "produit": "vie",
                      "devis_id": "dev_68e56446d4b5c6875911f178",
                      "souscription_id": "sou_8a1ab1eb752f13c8f09bb0b6",
                      "reference_partenaire": "CMD-2026-0042",
                      "prime": {
                        "nette": 11000,
                        "accessoires": 0,
                        "taxes": 1980,
                        "totale": 12980,
                        "devise": "XOF"
                      },
                      "date_effet": "2026-11-04",
                      "date_echeance": "2027-11-03",
                      "duree_mois": 12,
                      "souscripteur": {
                        "nom": "KONE",
                        "prenom": "Awa",
                        "telephone": "+2250701020304",
                        "email": "awa.kone@example.com"
                      },
                      "paiement": null,
                      "documents": [
                        {
                          "type": "conditions_generales",
                          "disponible": true,
                          "adresse": "/v1/contrats/TEST-CVR-API-MW2EDTG6-F92441FC41/documents/conditions_generales"
                        },
                        {
                          "type": "conditions_particulieres",
                          "disponible": true,
                          "adresse": "/v1/contrats/TEST-CVR-API-MW2EDTG6-F92441FC41/documents/conditions_particulieres"
                        }
                      ],
                      "cree_le": "2026-11-04T17:35:36.575052+00:00"
                    }
                  ],
                  "suite": "2026-11-04T16:44:34.688451+00:00"
                }
              }
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/v1/contrats/{numero}": {
      "get": {
        "operationId": "contrat",
        "tags": [
          "Contrats"
        ],
        "summary": "Un contrat : prime, dates, souscripteur, assurés, paiement, documents disponibles",
        "description": "Un contrat : prime, dates, souscripteur, assurés, paiement, documents disponibles.",
        "parameters": [
          {
            "name": "numero",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Numéro du contrat."
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {
                "example": {
                  "numero": "TEST-CVR-API-MW2EDTG6-F92441FC41",
                  "objet": "contrat",
                  "environnement": "test",
                  "statut": "actif",
                  "offre": "securvie_500k",
                  "produit": "vie",
                  "devis_id": "dev_68e56446d4b5c6875911f178",
                  "souscription_id": "sou_8a1ab1eb752f13c8f09bb0b6",
                  "reference_partenaire": "CMD-2026-0042",
                  "prime": {
                    "nette": 11000,
                    "accessoires": 0,
                    "taxes": 1980,
                    "totale": 12980,
                    "devise": "XOF"
                  },
                  "date_effet": "2026-11-04",
                  "date_echeance": "2027-11-03",
                  "duree_mois": 12,
                  "souscripteur": {
                    "nom": "KONE",
                    "prenom": "Awa",
                    "telephone": "+2250701020304",
                    "email": "awa.kone@example.com"
                  },
                  "assures": [],
                  "paiement": {
                    "montant": 12980,
                    "moyen": "Orange Money (encaissé par le partenaire)",
                    "paye_le": "2026-11-04T17:35:36.2+00:00"
                  },
                  "documents": [
                    {
                      "type": "conditions_generales",
                      "disponible": true,
                      "adresse": "/v1/contrats/TEST-CVR-API-MW2EDTG6-F92441FC41/documents/conditions_generales"
                    },
                    {
                      "type": "conditions_particulieres",
                      "disponible": true,
                      "adresse": "/v1/contrats/TEST-CVR-API-MW2EDTG6-F92441FC41/documents/conditions_particulieres"
                    }
                  ],
                  "cree_le": "2026-11-04T17:35:36.575052+00:00"
                }
              }
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/v1/contrats/{numero}/documents/{type}": {
      "get": {
        "operationId": "document",
        "tags": [
          "Contrats"
        ],
        "summary": "Un document du contrat en PDF",
        "description": "Un document du contrat en PDF. Documents officiels en production, documents de test en sandbox.",
        "parameters": [
          {
            "name": "numero",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Numéro du contrat."
          },
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "conditions_generales | conditions_particulieres | attestation"
          }
        ],
        "responses": {
          "200": {
            "description": "Document PDF",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/v1/webhooks/test": {
      "post": {
        "operationId": "webhookTest",
        "tags": [
          "Notifications"
        ],
        "summary": "Envoie tout de suite un événement test",
        "description": "Envoie tout de suite un événement test.ping à votre adresse de notification et indique ce qu'elle a répondu (recu, statut_http, erreur).",
        "parameters": [
          {
            "name": "X-Coveraf-Timestamp",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Horodatage Unix en secondes."
          },
          {
            "name": "X-Coveraf-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "v1=<HMAC-SHA256 hexadécimal de \"<timestamp>.<MÉTHODE>.<chemin>.<corps>\">."
          }
        ],
        "responses": {
          "200": {
            "description": "Succès",
            "content": {
              "application/json": {}
            }
          },
          "4XX": {
            "description": "Erreur de la requête (voir erreur.code)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "5XX": {
            "description": "Erreur du service, à réessayer",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "cle": {
        "type": "http",
        "scheme": "bearer",
        "description": "Clé API cvr_test_... ou cvr_live_..."
      }
    },
    "schemas": {
      "Erreur": {
        "type": "object",
        "required": [
          "erreur",
          "requete_id"
        ],
        "properties": {
          "erreur": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "authentification_manquante",
                  "cle_invalide",
                  "compte_suspendu",
                  "production_non_autorisee",
                  "ip_non_autorisee",
                  "signature_manquante",
                  "signature_invalide",
                  "signature_expiree",
                  "trop_de_requetes",
                  "idempotence_requise",
                  "idempotence_conflit",
                  "idempotence_en_cours",
                  "requete_invalide",
                  "json_invalide",
                  "validation",
                  "non_eligible",
                  "etude_particuliere",
                  "offre_inconnue",
                  "offre_non_autorisee",
                  "offre_indisponible",
                  "souscription_expiree",
                  "emission_en_cours",
                  "souscription_deja_payee",
                  "devis_deja_souscrit",
                  "mode_paiement_incompatible",
                  "montant_incorrect",
                  "plafond_encours_atteint",
                  "reference_deja_utilisee",
                  "paiement_deja_en_cours",
                  "webhook_non_configure",
                  "document_indisponible",
                  "devis_expire",
                  "introuvable",
                  "methode_non_autorisee",
                  "service_indisponible",
                  "erreur_interne"
                ]
              },
              "message": {
                "type": "string"
              },
              "documentation": {
                "type": "string"
              },
              "details": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "champ": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "requete_id": {
            "type": "string"
          }
        }
      }
    }
  }
}