# API : abysign

11 opérations REST du groupe abysign.

Base : `/api/v1`. [Conventions](/documentation/api-conventions/) · [Toutes les ressources](/documentation/api-reference/)

- GET /abysign/envelopes : Lister les enveloppes (curseur), filtres statut, externalId, sentSince
- POST /abysign/envelopes : Créer une enveloppe : un PDF, un ou plusieurs destinataires, en brouillon ou envoyée
- GET /abysign/envelopes/{id} : Statut, champs, événements et liens d'une enveloppe
- POST /abysign/envelopes/{id}/remind : Relancer le signataire (une relance par heure et par enveloppe)
- POST /abysign/envelopes/{id}/cancel : Annuler une enveloppe en attente (le lien affiche « annulée »)
- PUT /abysign/envelopes/{id}/fields : Remplacer les champs d'un brouillon (positions en points PDF, origine bas-gauche)
- POST /abysign/envelopes/{id}/send : Envoyer un brouillon : invitations, rappels, statut en attente
- GET /abysign/envelopes/{id}/signed.pdf : PDF signé (certificat de signature en dernières pages)
- GET /abysign/envelopes/{id}/certificate.pdf : Certificat de signature seul
- GET /abysign/envelopes/{id}/proof.json : Journal de preuve scellé (Ed25519, clé publique incluse)
- GET /abysign/envelopes/{id}/timestamp.tsr : Jeton d'horodatage RFC 3161 (404 sans autorité configurée)
## GET /abysign/envelopes

```json
{
  "summary": "Lister les enveloppes (curseur), filtres statut, externalId, sentSince",
  "tags": [
    "Signature électronique (AbySign)"
  ],
  "parameters": [
    {
      "name": "cursor",
      "in": "query",
      "required": false,
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "string",
        "minLength": 1
      }
    },
    {
      "name": "limit",
      "in": "query",
      "required": false,
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "integer",
        "minimum": 1,
        "maximum": 9007199254740991
      }
    },
    {
      "name": "status",
      "in": "query",
      "required": false,
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "description": "Filtre par statut",
        "type": "string",
        "enum": [
          "draft",
          "pending",
          "signed",
          "refused",
          "cancelled",
          "expired",
          "superseded"
        ]
      }
    },
    {
      "name": "externalId",
      "in": "query",
      "required": false,
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "description": "Votre identifiant (ex. Quote.Id Salesforce)",
        "type": "string",
        "minLength": 1,
        "maxLength": 120
      }
    },
    {
      "name": "sentSince",
      "in": "query",
      "required": false,
      "schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "description": "Envoyées depuis cette date (ISO 8601)",
        "anyOf": [
          {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
          },
          {
            "type": "string",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?:Z))$"
          }
        ]
      }
    }
  ],
  "security": [
    {
      "oauth2": [
        "signatures:read"
      ]
    },
    {
      "userSession": []
    }
  ],
  "responses": {
    "200": {
      "description": "Page d'enveloppes (sans lien de signature : il se lit enveloppe par enveloppe)",
      "content": {
        "application/json": {
          "schema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "draft",
                        "pending",
                        "signed",
                        "refused",
                        "cancelled",
                        "expired",
                        "superseded"
                      ]
                    },
                    "sequential": {
                      "type": "boolean"
                    },
                    "recipients": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string",
                            "format": "uuid",
                            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                          },
                          "rank": {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          "role": {
                            "type": "string",
                            "enum": [
                              "signer",
                              "viewer",
                              "cc",
                              "in_person"
                            ]
                          },
                          "name": {
                            "type": "string"
                          },
                          "email": {
                            "type": "string"
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "pending",
                              "viewed",
                              "signed",
                              "declined"
                            ]
                          },
                          "accessCodeRequired": {
                            "type": "boolean"
                          },
                          "sentAt": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time",
                                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "openedAt": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time",
                                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "decidedAt": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "date-time",
                                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "signUrl": {
                            "type": [
                              "string",
                              "null"
                            ]
                          }
                        },
                        "required": [
                          "id",
                          "rank",
                          "role",
                          "name",
                          "email",
                          "status",
                          "accessCodeRequired",
                          "sentAt",
                          "openedAt",
                          "decidedAt",
                          "signUrl"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "source": {
                      "type": "string",
                      "enum": [
                        "quote",
                        "api"
                      ]
                    },
                    "externalId": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "title": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "quoteId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Devis Cercla rattaché - null pour une enveloppe API"
                    },
                    "accessCodeRequired": {
                      "type": "boolean",
                      "description": "Un code d'accès de l'émetteur protège le document"
                    },
                    "signer": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "email": {
                          "type": "string"
                        },
                        "signUrl": {
                          "description": "Lien de signature - publié tant que l'enveloppe est en attente, au principal porteur du scope signatures:write, hors réponses de liste ; jamais dans un webhook",
                          "type": [
                            "string",
                            "null"
                          ]
                        }
                      },
                      "required": [
                        "name",
                        "email",
                        "signUrl"
                      ],
                      "additionalProperties": false
                    },
                    "message": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "sentAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                    },
                    "expiresAt": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                    },
                    "openedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "decidedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "refusalReason": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "sha256": {
                      "type": "object",
                      "properties": {
                        "source": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "signed": {
                          "type": [
                            "string",
                            "null"
                          ]
                        }
                      },
                      "required": [
                        "source",
                        "signed"
                      ],
                      "additionalProperties": false
                    },
                    "timestamp": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "mode": {
                              "type": [
                                "string",
                                "null"
                              ]
                            },
                            "authority": {
                              "type": [
                                "string",
                                "null"
                              ]
                            }
                          },
                          "required": [
                            "mode",
                            "authority"
                          ],
                          "additionalProperties": false
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "fields": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "key": {
                            "type": "string"
                          },
                          "recipientId": {
                            "anyOf": [
                              {
                                "type": "string",
                                "format": "uuid",
                                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "type": {
                            "type": "string",
                            "enum": [
                              "signature",
                              "initials",
                              "date",
                              "text",
                              "checkbox",
                              "name",
                              "email",
                              "company",
                              "title",
                              "number",
                              "dropdown",
                              "radio"
                            ]
                          },
                          "page": {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          "x": {
                            "type": "number"
                          },
                          "y": {
                            "type": "number"
                          },
                          "width": {
                            "type": "number"
                          },
                          "height": {
                            "type": "number"
                          },
                          "required": {
                            "type": "boolean"
                          },
                          "label": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "filled": {
                            "type": "boolean"
                          },
                          "value": {
                            "description": "Valeur texte (date, texte, case) - jamais l'image",
                            "type": [
                              "string",
                              "null"
                            ]
                          }
                        },
                        "required": [
                          "key",
                          "recipientId",
                          "type",
                          "page",
                          "x",
                          "y",
                          "width",
                          "height",
                          "required",
                          "label",
                          "filled",
                          "value"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "events": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "at": {
                            "type": "string",
                            "format": "date-time",
                            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                          },
                          "type": {
                            "type": "string"
                          },
                          "detail": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "at",
                          "type"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "links": {
                      "type": "object",
                      "properties": {
                        "signed": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "certificate": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "proof": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "timestamp": {
                          "type": [
                            "string",
                            "null"
                          ]
                        }
                      },
                      "required": [
                        "signed",
                        "certificate",
                        "proof",
                        "timestamp"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "id",
                    "status",
                    "sequential",
                    "recipients",
                    "source",
                    "externalId",
                    "title",
                    "quoteId",
                    "accessCodeRequired",
                    "signer",
                    "message",
                    "sentAt",
                    "expiresAt",
                    "openedAt",
                    "decidedAt",
                    "refusalReason",
                    "sha256",
                    "timestamp",
                    "fields",
                    "events",
                    "links"
                  ],
                  "additionalProperties": false
                }
              },
              "nextCursor": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "data",
              "nextCursor"
            ],
            "additionalProperties": false
          }
        }
      }
    },
    "default": {
      "description": "Erreur - enveloppe problem+json (RFC 9457)",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    }
  }
}
```

## POST /abysign/envelopes

```json
{
  "summary": "Créer une enveloppe : un PDF, un ou plusieurs destinataires, en brouillon ou envoyée",
  "description": "Deux formes : `application/json` (document en base64, décrit ici) ou `multipart/form-data` (partie `document` = fichier PDF, champs `signer[name]`, `signer[email]`, `message`, `validityDays`, `initialsEveryPage`, `externalId`, `title`, `fields` en JSON). Le document est figé tel quel, jamais re-rendu. Un signataire via `signer`, ou plusieurs destinataires via `recipients` ; `sequential` ordonne les signatures, `draft` prépare sans envoyer. Idempotence par `Idempotency-Key`.",
  "tags": [
    "Signature électronique (AbySign)"
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$schema": "https://json-schema.org/draft/2020-12/schema",
          "type": "object",
          "properties": {
            "signer": {
              "description": "Signataire unique (forme courte) - ou `recipients`",
              "type": "object",
              "properties": {
                "name": {
                  "description": "Nom du signataire (défaut : l'email)",
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "email": {
                  "type": "string",
                  "maxLength": 254,
                  "format": "email",
                  "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                }
              },
              "required": [
                "email"
              ],
              "additionalProperties": false
            },
            "recipients": {
              "description": "Destinataires (T-939) : au moins un rôle signer ou in_person",
              "minItems": 1,
              "maxItems": 50,
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "name": {
                    "description": "Nom (défaut : l'email)",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120
                  },
                  "email": {
                    "type": "string",
                    "maxLength": 254,
                    "format": "email",
                    "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                  },
                  "role": {
                    "default": "signer",
                    "description": "signer : doit signer ; viewer : doit consulter ; cc : reçoit le document final ; in_person : signe sur l'appareil de l'émetteur (aucun email)",
                    "type": "string",
                    "enum": [
                      "signer",
                      "viewer",
                      "cc",
                      "in_person"
                    ]
                  },
                  "rank": {
                    "description": "Rang de signature (ordre séquentiel) - défaut : ordre de la liste",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 50
                  },
                  "accessCode": {
                    "type": "string",
                    "minLength": 4,
                    "maxLength": 12,
                    "pattern": "^[A-Za-z0-9-]+$"
                  },
                  "privateMessage": {
                    "description": "Note personnelle à ce destinataire",
                    "type": "string",
                    "maxLength": 1000
                  },
                  "verification": {
                    "default": "none",
                    "description": "#1054 : `sms` = code à six chiffres envoyé au mobile `phone` avant d'ouvrir le document (second canal) ; exige un adaptateur SMS configuré, sinon 422",
                    "type": "string",
                    "enum": [
                      "none",
                      "sms"
                    ]
                  },
                  "phone": {
                    "description": "Mobile du destinataire (E.164 ou format français) ; requis avec `verification: sms`",
                    "type": "string",
                    "maxLength": 32
                  }
                },
                "required": [
                  "email"
                ],
                "additionalProperties": false
              }
            },
            "sequential": {
              "description": "Ordre séquentiel : chaque rang reçoit son invitation quand le précédent a signé",
              "type": "boolean"
            },
            "draft": {
              "description": "Brouillon (T-941) : rien n'est envoyé ; placez les champs (PUT …/fields) puis envoyez (POST …/send)",
              "type": "boolean"
            },
            "message": {
              "description": "Mot de l'émetteur repris dans l'email",
              "type": "string",
              "maxLength": 500
            },
            "validityDays": {
              "description": "Défaut : réglage de l'organisation",
              "type": "integer",
              "minimum": 1,
              "maximum": 90
            },
            "initialsEveryPage": {
              "description": "Paraphe de chaque page (défaut : réglage de l'organisation)",
              "type": "boolean"
            },
            "accessCode": {
              "description": "Code d'accès à transmettre au signataire par un autre canal (téléphone) ; le document reste invisible sans lui",
              "type": "string",
              "minLength": 4,
              "maxLength": 12,
              "pattern": "^[A-Za-z0-9-]+$"
            },
            "externalId": {
              "description": "Votre identifiant (ex. Quote.Id Salesforce), repris dans les webhooks",
              "type": "string",
              "minLength": 1,
              "maxLength": 120
            },
            "title": {
              "description": "Libellé montré au signataire (défaut : nom du fichier)",
              "type": "string",
              "minLength": 1,
              "maxLength": 120
            },
            "fields": {
              "description": "Champs positionnés ; absent : tags textuels du document, sinon champ signature en bas de la dernière page",
              "minItems": 1,
              "maxItems": 100,
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "signature",
                      "initials",
                      "date",
                      "text",
                      "checkbox",
                      "name",
                      "email",
                      "company",
                      "title",
                      "number",
                      "dropdown",
                      "radio"
                    ]
                  },
                  "page": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 9007199254740991,
                    "description": "Page (1 = première)"
                  },
                  "x": {
                    "type": "number",
                    "minimum": 0,
                    "description": "Abscisse en points PDF, origine bas-gauche"
                  },
                  "y": {
                    "type": "number",
                    "minimum": 0,
                    "description": "Ordonnée en points PDF, origine bas-gauche"
                  },
                  "width": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "maximum": 2000
                  },
                  "height": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "maximum": 2000
                  },
                  "required": {
                    "default": true,
                    "type": "boolean"
                  },
                  "label": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 80
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "recipientIndex": {
                    "description": "Index du destinataire signataire dans `recipients` (défaut 0 : le premier signataire)",
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 49
                  },
                  "options": {
                    "description": "Options d'une liste (dropdown) ou d'un choix (radio)",
                    "maxItems": 20,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    }
                  }
                },
                "required": [
                  "type",
                  "page",
                  "x",
                  "y",
                  "width",
                  "height"
                ],
                "additionalProperties": false
              }
            },
            "document": {
              "type": "object",
              "properties": {
                "filename": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 200
                },
                "contentBase64": {
                  "type": "string",
                  "minLength": 1,
                  "description": "Le PDF en base64 (≤ 20 Mo décodés)"
                }
              },
              "required": [
                "filename",
                "contentBase64"
              ],
              "additionalProperties": false
            }
          },
          "required": [
            "document"
          ],
          "additionalProperties": false
        }
      }
    }
  },
  "security": [
    {
      "oauth2": [
        "signatures:write"
      ]
    },
    {
      "userSession": []
    }
  ],
  "responses": {
    "201": {
      "description": "Enveloppe en attente, avec `signer.signUrl`",
      "content": {
        "application/json": {
          "schema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "status": {
                "type": "string",
                "enum": [
                  "draft",
                  "pending",
                  "signed",
                  "refused",
                  "cancelled",
                  "expired",
                  "superseded"
                ]
              },
              "sequential": {
                "type": "boolean"
              },
              "recipients": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    "rank": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "role": {
                      "type": "string",
                      "enum": [
                        "signer",
                        "viewer",
                        "cc",
                        "in_person"
                      ]
                    },
                    "name": {
                      "type": "string"
                    },
                    "email": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pending",
                        "viewed",
                        "signed",
                        "declined"
                      ]
                    },
                    "accessCodeRequired": {
                      "type": "boolean"
                    },
                    "sentAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "openedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "decidedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "signUrl": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "rank",
                    "role",
                    "name",
                    "email",
                    "status",
                    "accessCodeRequired",
                    "sentAt",
                    "openedAt",
                    "decidedAt",
                    "signUrl"
                  ],
                  "additionalProperties": false
                }
              },
              "source": {
                "type": "string",
                "enum": [
                  "quote",
                  "api"
                ]
              },
              "externalId": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "title": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "quoteId": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Devis Cercla rattaché - null pour une enveloppe API"
              },
              "accessCodeRequired": {
                "type": "boolean",
                "description": "Un code d'accès de l'émetteur protège le document"
              },
              "signer": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "signUrl": {
                    "description": "Lien de signature - publié tant que l'enveloppe est en attente, au principal porteur du scope signatures:write, hors réponses de liste ; jamais dans un webhook",
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "name",
                  "email",
                  "signUrl"
                ],
                "additionalProperties": false
              },
              "message": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sentAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              "openedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "decidedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "refusalReason": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sha256": {
                "type": "object",
                "properties": {
                  "source": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "signed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "source",
                  "signed"
                ],
                "additionalProperties": false
              },
              "timestamp": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "mode": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "authority": {
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    },
                    "required": [
                      "mode",
                      "authority"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "fields": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "key": {
                      "type": "string"
                    },
                    "recipientId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "signature",
                        "initials",
                        "date",
                        "text",
                        "checkbox",
                        "name",
                        "email",
                        "company",
                        "title",
                        "number",
                        "dropdown",
                        "radio"
                      ]
                    },
                    "page": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    },
                    "width": {
                      "type": "number"
                    },
                    "height": {
                      "type": "number"
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "label": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "filled": {
                      "type": "boolean"
                    },
                    "value": {
                      "description": "Valeur texte (date, texte, case) - jamais l'image",
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "key",
                    "recipientId",
                    "type",
                    "page",
                    "x",
                    "y",
                    "width",
                    "height",
                    "required",
                    "label",
                    "filled",
                    "value"
                  ],
                  "additionalProperties": false
                }
              },
              "events": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "at": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                    },
                    "type": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "at",
                    "type"
                  ],
                  "additionalProperties": false
                }
              },
              "links": {
                "type": "object",
                "properties": {
                  "signed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "certificate": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "proof": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "timestamp": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "signed",
                  "certificate",
                  "proof",
                  "timestamp"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "id",
              "status",
              "sequential",
              "recipients",
              "source",
              "externalId",
              "title",
              "quoteId",
              "accessCodeRequired",
              "signer",
              "message",
              "sentAt",
              "expiresAt",
              "openedAt",
              "decidedAt",
              "refusalReason",
              "sha256",
              "timestamp",
              "fields",
              "events",
              "links"
            ],
            "additionalProperties": false
          }
        }
      }
    },
    "default": {
      "description": "Erreur - enveloppe problem+json (RFC 9457)",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    }
  }
}
```

## GET /abysign/envelopes/{id}

```json
{
  "summary": "Statut, champs, événements et liens d'une enveloppe",
  "tags": [
    "Signature électronique (AbySign)"
  ],
  "security": [
    {
      "oauth2": [
        "signatures:read"
      ]
    },
    {
      "userSession": []
    }
  ],
  "responses": {
    "200": {
      "description": "Enveloppe",
      "content": {
        "application/json": {
          "schema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "status": {
                "type": "string",
                "enum": [
                  "draft",
                  "pending",
                  "signed",
                  "refused",
                  "cancelled",
                  "expired",
                  "superseded"
                ]
              },
              "sequential": {
                "type": "boolean"
              },
              "recipients": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    "rank": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "role": {
                      "type": "string",
                      "enum": [
                        "signer",
                        "viewer",
                        "cc",
                        "in_person"
                      ]
                    },
                    "name": {
                      "type": "string"
                    },
                    "email": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pending",
                        "viewed",
                        "signed",
                        "declined"
                      ]
                    },
                    "accessCodeRequired": {
                      "type": "boolean"
                    },
                    "sentAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "openedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "decidedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "signUrl": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "rank",
                    "role",
                    "name",
                    "email",
                    "status",
                    "accessCodeRequired",
                    "sentAt",
                    "openedAt",
                    "decidedAt",
                    "signUrl"
                  ],
                  "additionalProperties": false
                }
              },
              "source": {
                "type": "string",
                "enum": [
                  "quote",
                  "api"
                ]
              },
              "externalId": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "title": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "quoteId": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Devis Cercla rattaché - null pour une enveloppe API"
              },
              "accessCodeRequired": {
                "type": "boolean",
                "description": "Un code d'accès de l'émetteur protège le document"
              },
              "signer": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "signUrl": {
                    "description": "Lien de signature - publié tant que l'enveloppe est en attente, au principal porteur du scope signatures:write, hors réponses de liste ; jamais dans un webhook",
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "name",
                  "email",
                  "signUrl"
                ],
                "additionalProperties": false
              },
              "message": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sentAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              "openedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "decidedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "refusalReason": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sha256": {
                "type": "object",
                "properties": {
                  "source": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "signed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "source",
                  "signed"
                ],
                "additionalProperties": false
              },
              "timestamp": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "mode": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "authority": {
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    },
                    "required": [
                      "mode",
                      "authority"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "fields": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "key": {
                      "type": "string"
                    },
                    "recipientId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "signature",
                        "initials",
                        "date",
                        "text",
                        "checkbox",
                        "name",
                        "email",
                        "company",
                        "title",
                        "number",
                        "dropdown",
                        "radio"
                      ]
                    },
                    "page": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    },
                    "width": {
                      "type": "number"
                    },
                    "height": {
                      "type": "number"
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "label": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "filled": {
                      "type": "boolean"
                    },
                    "value": {
                      "description": "Valeur texte (date, texte, case) - jamais l'image",
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "key",
                    "recipientId",
                    "type",
                    "page",
                    "x",
                    "y",
                    "width",
                    "height",
                    "required",
                    "label",
                    "filled",
                    "value"
                  ],
                  "additionalProperties": false
                }
              },
              "events": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "at": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                    },
                    "type": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "at",
                    "type"
                  ],
                  "additionalProperties": false
                }
              },
              "links": {
                "type": "object",
                "properties": {
                  "signed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "certificate": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "proof": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "timestamp": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "signed",
                  "certificate",
                  "proof",
                  "timestamp"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "id",
              "status",
              "sequential",
              "recipients",
              "source",
              "externalId",
              "title",
              "quoteId",
              "accessCodeRequired",
              "signer",
              "message",
              "sentAt",
              "expiresAt",
              "openedAt",
              "decidedAt",
              "refusalReason",
              "sha256",
              "timestamp",
              "fields",
              "events",
              "links"
            ],
            "additionalProperties": false
          }
        }
      }
    },
    "default": {
      "description": "Erreur - enveloppe problem+json (RFC 9457)",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    }
  }
}
```

## POST /abysign/envelopes/{id}/remind

```json
{
  "summary": "Relancer le signataire (une relance par heure et par enveloppe)",
  "description": "409 si l'enveloppe n'est plus en attente, 429 avec `Retry-After` si une relance date de moins d'une heure.",
  "tags": [
    "Signature électronique (AbySign)"
  ],
  "security": [
    {
      "oauth2": [
        "signatures:write"
      ]
    },
    {
      "userSession": []
    }
  ],
  "responses": {
    "200": {
      "description": "Enveloppe après relance",
      "content": {
        "application/json": {
          "schema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "status": {
                "type": "string",
                "enum": [
                  "draft",
                  "pending",
                  "signed",
                  "refused",
                  "cancelled",
                  "expired",
                  "superseded"
                ]
              },
              "sequential": {
                "type": "boolean"
              },
              "recipients": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    "rank": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "role": {
                      "type": "string",
                      "enum": [
                        "signer",
                        "viewer",
                        "cc",
                        "in_person"
                      ]
                    },
                    "name": {
                      "type": "string"
                    },
                    "email": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pending",
                        "viewed",
                        "signed",
                        "declined"
                      ]
                    },
                    "accessCodeRequired": {
                      "type": "boolean"
                    },
                    "sentAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "openedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "decidedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "signUrl": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "rank",
                    "role",
                    "name",
                    "email",
                    "status",
                    "accessCodeRequired",
                    "sentAt",
                    "openedAt",
                    "decidedAt",
                    "signUrl"
                  ],
                  "additionalProperties": false
                }
              },
              "source": {
                "type": "string",
                "enum": [
                  "quote",
                  "api"
                ]
              },
              "externalId": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "title": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "quoteId": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Devis Cercla rattaché - null pour une enveloppe API"
              },
              "accessCodeRequired": {
                "type": "boolean",
                "description": "Un code d'accès de l'émetteur protège le document"
              },
              "signer": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "signUrl": {
                    "description": "Lien de signature - publié tant que l'enveloppe est en attente, au principal porteur du scope signatures:write, hors réponses de liste ; jamais dans un webhook",
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "name",
                  "email",
                  "signUrl"
                ],
                "additionalProperties": false
              },
              "message": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sentAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              "openedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "decidedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "refusalReason": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sha256": {
                "type": "object",
                "properties": {
                  "source": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "signed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "source",
                  "signed"
                ],
                "additionalProperties": false
              },
              "timestamp": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "mode": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "authority": {
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    },
                    "required": [
                      "mode",
                      "authority"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "fields": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "key": {
                      "type": "string"
                    },
                    "recipientId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "signature",
                        "initials",
                        "date",
                        "text",
                        "checkbox",
                        "name",
                        "email",
                        "company",
                        "title",
                        "number",
                        "dropdown",
                        "radio"
                      ]
                    },
                    "page": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    },
                    "width": {
                      "type": "number"
                    },
                    "height": {
                      "type": "number"
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "label": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "filled": {
                      "type": "boolean"
                    },
                    "value": {
                      "description": "Valeur texte (date, texte, case) - jamais l'image",
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "key",
                    "recipientId",
                    "type",
                    "page",
                    "x",
                    "y",
                    "width",
                    "height",
                    "required",
                    "label",
                    "filled",
                    "value"
                  ],
                  "additionalProperties": false
                }
              },
              "events": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "at": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                    },
                    "type": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "at",
                    "type"
                  ],
                  "additionalProperties": false
                }
              },
              "links": {
                "type": "object",
                "properties": {
                  "signed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "certificate": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "proof": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "timestamp": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "signed",
                  "certificate",
                  "proof",
                  "timestamp"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "id",
              "status",
              "sequential",
              "recipients",
              "source",
              "externalId",
              "title",
              "quoteId",
              "accessCodeRequired",
              "signer",
              "message",
              "sentAt",
              "expiresAt",
              "openedAt",
              "decidedAt",
              "refusalReason",
              "sha256",
              "timestamp",
              "fields",
              "events",
              "links"
            ],
            "additionalProperties": false
          }
        }
      }
    },
    "default": {
      "description": "Erreur - enveloppe problem+json (RFC 9457)",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    }
  }
}
```

## POST /abysign/envelopes/{id}/cancel

```json
{
  "summary": "Annuler une enveloppe en attente (le lien affiche « annulée »)",
  "description": "Idempotent sur une enveloppe déjà annulée ; 409 si elle est signée, refusée ou expirée.",
  "tags": [
    "Signature électronique (AbySign)"
  ],
  "security": [
    {
      "oauth2": [
        "signatures:write"
      ]
    },
    {
      "userSession": []
    }
  ],
  "responses": {
    "200": {
      "description": "Enveloppe annulée",
      "content": {
        "application/json": {
          "schema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "status": {
                "type": "string",
                "enum": [
                  "draft",
                  "pending",
                  "signed",
                  "refused",
                  "cancelled",
                  "expired",
                  "superseded"
                ]
              },
              "sequential": {
                "type": "boolean"
              },
              "recipients": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    "rank": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "role": {
                      "type": "string",
                      "enum": [
                        "signer",
                        "viewer",
                        "cc",
                        "in_person"
                      ]
                    },
                    "name": {
                      "type": "string"
                    },
                    "email": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pending",
                        "viewed",
                        "signed",
                        "declined"
                      ]
                    },
                    "accessCodeRequired": {
                      "type": "boolean"
                    },
                    "sentAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "openedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "decidedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "signUrl": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "rank",
                    "role",
                    "name",
                    "email",
                    "status",
                    "accessCodeRequired",
                    "sentAt",
                    "openedAt",
                    "decidedAt",
                    "signUrl"
                  ],
                  "additionalProperties": false
                }
              },
              "source": {
                "type": "string",
                "enum": [
                  "quote",
                  "api"
                ]
              },
              "externalId": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "title": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "quoteId": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Devis Cercla rattaché - null pour une enveloppe API"
              },
              "accessCodeRequired": {
                "type": "boolean",
                "description": "Un code d'accès de l'émetteur protège le document"
              },
              "signer": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "signUrl": {
                    "description": "Lien de signature - publié tant que l'enveloppe est en attente, au principal porteur du scope signatures:write, hors réponses de liste ; jamais dans un webhook",
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "name",
                  "email",
                  "signUrl"
                ],
                "additionalProperties": false
              },
              "message": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sentAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              "openedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "decidedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "refusalReason": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sha256": {
                "type": "object",
                "properties": {
                  "source": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "signed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "source",
                  "signed"
                ],
                "additionalProperties": false
              },
              "timestamp": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "mode": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "authority": {
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    },
                    "required": [
                      "mode",
                      "authority"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "fields": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "key": {
                      "type": "string"
                    },
                    "recipientId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "signature",
                        "initials",
                        "date",
                        "text",
                        "checkbox",
                        "name",
                        "email",
                        "company",
                        "title",
                        "number",
                        "dropdown",
                        "radio"
                      ]
                    },
                    "page": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    },
                    "width": {
                      "type": "number"
                    },
                    "height": {
                      "type": "number"
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "label": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "filled": {
                      "type": "boolean"
                    },
                    "value": {
                      "description": "Valeur texte (date, texte, case) - jamais l'image",
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "key",
                    "recipientId",
                    "type",
                    "page",
                    "x",
                    "y",
                    "width",
                    "height",
                    "required",
                    "label",
                    "filled",
                    "value"
                  ],
                  "additionalProperties": false
                }
              },
              "events": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "at": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                    },
                    "type": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "at",
                    "type"
                  ],
                  "additionalProperties": false
                }
              },
              "links": {
                "type": "object",
                "properties": {
                  "signed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "certificate": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "proof": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "timestamp": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "signed",
                  "certificate",
                  "proof",
                  "timestamp"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "id",
              "status",
              "sequential",
              "recipients",
              "source",
              "externalId",
              "title",
              "quoteId",
              "accessCodeRequired",
              "signer",
              "message",
              "sentAt",
              "expiresAt",
              "openedAt",
              "decidedAt",
              "refusalReason",
              "sha256",
              "timestamp",
              "fields",
              "events",
              "links"
            ],
            "additionalProperties": false
          }
        }
      }
    },
    "default": {
      "description": "Erreur - enveloppe problem+json (RFC 9457)",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    }
  }
}
```

## PUT /abysign/envelopes/{id}/fields

```json
{
  "summary": "Remplacer les champs d'un brouillon (positions en points PDF, origine bas-gauche)",
  "description": "Brouillon seulement (409 sinon). Au moins un champ `signature`. `recipientId` désigne le signataire ; absent : le premier.",
  "tags": [
    "Signature électronique (AbySign)"
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$schema": "https://json-schema.org/draft/2020-12/schema",
          "type": "object",
          "properties": {
            "fields": {
              "minItems": 1,
              "maxItems": 200,
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "signature",
                      "initials",
                      "date",
                      "text",
                      "checkbox",
                      "name",
                      "email",
                      "company",
                      "title",
                      "number",
                      "dropdown",
                      "radio"
                    ]
                  },
                  "page": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 9007199254740991,
                    "description": "Page (1 = première)"
                  },
                  "x": {
                    "type": "number",
                    "minimum": 0,
                    "description": "Abscisse en points PDF, origine bas-gauche"
                  },
                  "y": {
                    "type": "number",
                    "minimum": 0,
                    "description": "Ordonnée en points PDF, origine bas-gauche"
                  },
                  "width": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "maximum": 2000
                  },
                  "height": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "maximum": 2000
                  },
                  "required": {
                    "default": true,
                    "type": "boolean"
                  },
                  "label": {
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 80
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "recipientIndex": {
                    "description": "Index du destinataire signataire dans `recipients` (défaut 0 : le premier signataire)",
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 49
                  },
                  "options": {
                    "description": "Options d'une liste (dropdown) ou d'un choix (radio)",
                    "maxItems": 20,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    }
                  },
                  "key": {
                    "type": "string",
                    "maxLength": 60
                  },
                  "recipientId": {
                    "description": "Signataire du champ (id de destinataire) - défaut : le premier",
                    "anyOf": [
                      {
                        "type": "string",
                        "format": "uuid",
                        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "type",
                  "page",
                  "x",
                  "y",
                  "width",
                  "height"
                ],
                "additionalProperties": false
              }
            }
          },
          "required": [
            "fields"
          ],
          "additionalProperties": false
        }
      }
    }
  },
  "security": [
    {
      "oauth2": [
        "signatures:write"
      ]
    },
    {
      "userSession": []
    }
  ],
  "responses": {
    "200": {
      "description": "Enveloppe avec ses champs",
      "content": {
        "application/json": {
          "schema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "status": {
                "type": "string",
                "enum": [
                  "draft",
                  "pending",
                  "signed",
                  "refused",
                  "cancelled",
                  "expired",
                  "superseded"
                ]
              },
              "sequential": {
                "type": "boolean"
              },
              "recipients": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    "rank": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "role": {
                      "type": "string",
                      "enum": [
                        "signer",
                        "viewer",
                        "cc",
                        "in_person"
                      ]
                    },
                    "name": {
                      "type": "string"
                    },
                    "email": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pending",
                        "viewed",
                        "signed",
                        "declined"
                      ]
                    },
                    "accessCodeRequired": {
                      "type": "boolean"
                    },
                    "sentAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "openedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "decidedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "signUrl": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "rank",
                    "role",
                    "name",
                    "email",
                    "status",
                    "accessCodeRequired",
                    "sentAt",
                    "openedAt",
                    "decidedAt",
                    "signUrl"
                  ],
                  "additionalProperties": false
                }
              },
              "source": {
                "type": "string",
                "enum": [
                  "quote",
                  "api"
                ]
              },
              "externalId": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "title": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "quoteId": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Devis Cercla rattaché - null pour une enveloppe API"
              },
              "accessCodeRequired": {
                "type": "boolean",
                "description": "Un code d'accès de l'émetteur protège le document"
              },
              "signer": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "signUrl": {
                    "description": "Lien de signature - publié tant que l'enveloppe est en attente, au principal porteur du scope signatures:write, hors réponses de liste ; jamais dans un webhook",
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "name",
                  "email",
                  "signUrl"
                ],
                "additionalProperties": false
              },
              "message": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sentAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              "openedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "decidedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "refusalReason": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sha256": {
                "type": "object",
                "properties": {
                  "source": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "signed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "source",
                  "signed"
                ],
                "additionalProperties": false
              },
              "timestamp": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "mode": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "authority": {
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    },
                    "required": [
                      "mode",
                      "authority"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "fields": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "key": {
                      "type": "string"
                    },
                    "recipientId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "signature",
                        "initials",
                        "date",
                        "text",
                        "checkbox",
                        "name",
                        "email",
                        "company",
                        "title",
                        "number",
                        "dropdown",
                        "radio"
                      ]
                    },
                    "page": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    },
                    "width": {
                      "type": "number"
                    },
                    "height": {
                      "type": "number"
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "label": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "filled": {
                      "type": "boolean"
                    },
                    "value": {
                      "description": "Valeur texte (date, texte, case) - jamais l'image",
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "key",
                    "recipientId",
                    "type",
                    "page",
                    "x",
                    "y",
                    "width",
                    "height",
                    "required",
                    "label",
                    "filled",
                    "value"
                  ],
                  "additionalProperties": false
                }
              },
              "events": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "at": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                    },
                    "type": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "at",
                    "type"
                  ],
                  "additionalProperties": false
                }
              },
              "links": {
                "type": "object",
                "properties": {
                  "signed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "certificate": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "proof": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "timestamp": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "signed",
                  "certificate",
                  "proof",
                  "timestamp"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "id",
              "status",
              "sequential",
              "recipients",
              "source",
              "externalId",
              "title",
              "quoteId",
              "accessCodeRequired",
              "signer",
              "message",
              "sentAt",
              "expiresAt",
              "openedAt",
              "decidedAt",
              "refusalReason",
              "sha256",
              "timestamp",
              "fields",
              "events",
              "links"
            ],
            "additionalProperties": false
          }
        }
      }
    },
    "default": {
      "description": "Erreur - enveloppe problem+json (RFC 9457)",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    }
  }
}
```

## POST /abysign/envelopes/{id}/send

```json
{
  "summary": "Envoyer un brouillon : invitations, rappels, statut en attente",
  "description": "409 si l'enveloppe n'est plus un brouillon ; 422 sans champ signature.",
  "tags": [
    "Signature électronique (AbySign)"
  ],
  "security": [
    {
      "oauth2": [
        "signatures:write"
      ]
    },
    {
      "userSession": []
    }
  ],
  "responses": {
    "200": {
      "description": "Enveloppe en attente",
      "content": {
        "application/json": {
          "schema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "status": {
                "type": "string",
                "enum": [
                  "draft",
                  "pending",
                  "signed",
                  "refused",
                  "cancelled",
                  "expired",
                  "superseded"
                ]
              },
              "sequential": {
                "type": "boolean"
              },
              "recipients": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    "rank": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "role": {
                      "type": "string",
                      "enum": [
                        "signer",
                        "viewer",
                        "cc",
                        "in_person"
                      ]
                    },
                    "name": {
                      "type": "string"
                    },
                    "email": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pending",
                        "viewed",
                        "signed",
                        "declined"
                      ]
                    },
                    "accessCodeRequired": {
                      "type": "boolean"
                    },
                    "sentAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "openedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "decidedAt": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "signUrl": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "rank",
                    "role",
                    "name",
                    "email",
                    "status",
                    "accessCodeRequired",
                    "sentAt",
                    "openedAt",
                    "decidedAt",
                    "signUrl"
                  ],
                  "additionalProperties": false
                }
              },
              "source": {
                "type": "string",
                "enum": [
                  "quote",
                  "api"
                ]
              },
              "externalId": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "title": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "quoteId": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uuid",
                    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Devis Cercla rattaché - null pour une enveloppe API"
              },
              "accessCodeRequired": {
                "type": "boolean",
                "description": "Un code d'accès de l'émetteur protège le document"
              },
              "signer": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  },
                  "signUrl": {
                    "description": "Lien de signature - publié tant que l'enveloppe est en attente, au principal porteur du scope signatures:write, hors réponses de liste ; jamais dans un webhook",
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "name",
                  "email",
                  "signUrl"
                ],
                "additionalProperties": false
              },
              "message": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sentAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              "expiresAt": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              "openedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "decidedAt": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "refusalReason": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sha256": {
                "type": "object",
                "properties": {
                  "source": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "signed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "source",
                  "signed"
                ],
                "additionalProperties": false
              },
              "timestamp": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "mode": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "authority": {
                        "type": [
                          "string",
                          "null"
                        ]
                      }
                    },
                    "required": [
                      "mode",
                      "authority"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "fields": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "key": {
                      "type": "string"
                    },
                    "recipientId": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "signature",
                        "initials",
                        "date",
                        "text",
                        "checkbox",
                        "name",
                        "email",
                        "company",
                        "title",
                        "number",
                        "dropdown",
                        "radio"
                      ]
                    },
                    "page": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    },
                    "width": {
                      "type": "number"
                    },
                    "height": {
                      "type": "number"
                    },
                    "required": {
                      "type": "boolean"
                    },
                    "label": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "filled": {
                      "type": "boolean"
                    },
                    "value": {
                      "description": "Valeur texte (date, texte, case) - jamais l'image",
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "key",
                    "recipientId",
                    "type",
                    "page",
                    "x",
                    "y",
                    "width",
                    "height",
                    "required",
                    "label",
                    "filled",
                    "value"
                  ],
                  "additionalProperties": false
                }
              },
              "events": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "at": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                    },
                    "type": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "at",
                    "type"
                  ],
                  "additionalProperties": false
                }
              },
              "links": {
                "type": "object",
                "properties": {
                  "signed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "certificate": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "proof": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "timestamp": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "signed",
                  "certificate",
                  "proof",
                  "timestamp"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "id",
              "status",
              "sequential",
              "recipients",
              "source",
              "externalId",
              "title",
              "quoteId",
              "accessCodeRequired",
              "signer",
              "message",
              "sentAt",
              "expiresAt",
              "openedAt",
              "decidedAt",
              "refusalReason",
              "sha256",
              "timestamp",
              "fields",
              "events",
              "links"
            ],
            "additionalProperties": false
          }
        }
      }
    },
    "default": {
      "description": "Erreur - enveloppe problem+json (RFC 9457)",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    }
  }
}
```

## GET /abysign/envelopes/{id}/signed.pdf

```json
{
  "summary": "PDF signé (certificat de signature en dernières pages)",
  "description": "Réponse `application/pdf` en pièce jointe. 404 tant que l'enveloppe n'est pas signée ou si l'artefact n'existe pas.",
  "tags": [
    "Signature électronique (AbySign)"
  ],
  "security": [
    {
      "oauth2": [
        "signatures:read"
      ]
    },
    {
      "userSession": []
    }
  ],
  "responses": {
    "200": {
      "description": "PDF signé (certificat de signature en dernières pages)"
    },
    "default": {
      "description": "Erreur - enveloppe problem+json (RFC 9457)",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    }
  }
}
```

## GET /abysign/envelopes/{id}/certificate.pdf

```json
{
  "summary": "Certificat de signature seul",
  "description": "Réponse `application/pdf` en pièce jointe. 404 tant que l'enveloppe n'est pas signée ou si l'artefact n'existe pas.",
  "tags": [
    "Signature électronique (AbySign)"
  ],
  "security": [
    {
      "oauth2": [
        "signatures:read"
      ]
    },
    {
      "userSession": []
    }
  ],
  "responses": {
    "200": {
      "description": "Certificat de signature seul"
    },
    "default": {
      "description": "Erreur - enveloppe problem+json (RFC 9457)",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    }
  }
}
```

## GET /abysign/envelopes/{id}/proof.json

```json
{
  "summary": "Journal de preuve scellé (Ed25519, clé publique incluse)",
  "description": "Réponse `application/json` en pièce jointe. 404 tant que l'enveloppe n'est pas signée ou si l'artefact n'existe pas.",
  "tags": [
    "Signature électronique (AbySign)"
  ],
  "security": [
    {
      "oauth2": [
        "signatures:read"
      ]
    },
    {
      "userSession": []
    }
  ],
  "responses": {
    "200": {
      "description": "Journal de preuve scellé (Ed25519, clé publique incluse)",
      "content": {
        "application/json": {
          "schema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {},
            "description": "Voir docs/08-API §16 et la page /verifier"
          }
        }
      }
    },
    "default": {
      "description": "Erreur - enveloppe problem+json (RFC 9457)",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    }
  }
}
```

## GET /abysign/envelopes/{id}/timestamp.tsr

```json
{
  "summary": "Jeton d'horodatage RFC 3161 (404 sans autorité configurée)",
  "description": "Réponse `application/timestamp-reply` en pièce jointe. 404 tant que l'enveloppe n'est pas signée ou si l'artefact n'existe pas.",
  "tags": [
    "Signature électronique (AbySign)"
  ],
  "security": [
    {
      "oauth2": [
        "signatures:read"
      ]
    },
    {
      "userSession": []
    }
  ],
  "responses": {
    "200": {
      "description": "Jeton d'horodatage RFC 3161 (404 sans autorité configurée)"
    },
    "default": {
      "description": "Erreur - enveloppe problem+json (RFC 9457)",
      "content": {
        "application/problem+json": {
          "schema": {
            "$ref": "#/components/schemas/Problem"
          }
        }
      }
    }
  }
}
```
