> ## Documentation Index
> Fetch the complete documentation index at: https://docs.invopop.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Upload signed agreement

> Stores the customer's signed PDF on the silo entry together with
the chosen signature method. This call only persists the document
— it does not record an approval decision. Call `POST /confirm`
afterwards to mark the submission as complete.

Two signature methods are accepted:

- `esignature` — the PDF was signed electronically (PAdES). The
  signature is validated cryptographically against the EU Trusted
  List.
- `identity` — the PDF was signed by hand. The customer must also
  upload identity images via `POST /identity` before confirming;
  verification is delegated to Invopop's approval service.

Stores the customer's signed PDF on the silo entry together with the chosen signature method. Two methods are accepted: `esignature` (PAdES — validated cryptographically against the EU Trusted List) and `identity` (hand-signed — verification deferred to Invopop's approval service, requires identity images uploaded via `POST /identity` first).

This call only persists the document. Call `POST /confirm` afterwards to mark the submission complete and let the onboarding workflow proceed.


## OpenAPI

````yaml POST /apps/gov-fr/v1/entry/{silo_entry_id}/agreement
openapi: 3.1.0
info:
  contact:
    email: dev@invopop.com
    name: Invopop Developers
  description: >-
    Set of end-points for the France app, including lookups against the PPF
    Annuaire (French e-invoicing directory).
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  title: France Service API
  version: 0.1.0
servers:
  - description: production
    url: https://api.invopop.com
security:
  - InvopopAuth: []
paths:
  /apps/gov-fr/v1/entry/{silo_entry_id}/agreement:
    post:
      summary: Upload the signed agreement
      description: |-
        Stores the customer's signed PDF on the silo entry together with
        the chosen signature method. This call only persists the document
        — it does not record an approval decision. Call `POST /confirm`
        afterwards to mark the submission as complete.

        Two signature methods are accepted:

        - `esignature` — the PDF was signed electronically (PAdES). The
          signature is validated cryptographically against the EU Trusted
          List.
        - `identity` — the PDF was signed by hand. The customer must also
          upload identity images via `POST /identity` before confirming;
          verification is delegated to Invopop's approval service.
      operationId: uploadEntryAgreement
      parameters:
        - $ref: '#/components/parameters/SiloEntryID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AgreementSubmit'
      responses:
        '204':
          description: Signed agreement stored.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  parameters:
    SiloEntryID:
      name: silo_entry_id
      in: path
      required: true
      description: ID of the `org.Party` silo entry being onboarded.
      schema:
        type: string
        example: 5b45453c-cdd0-11ed-afa1-0242ac120002
  schemas:
    AgreementSubmit:
      type: object
      required:
        - signature
        - data
      properties:
        signature:
          type: string
          description: |-
            How the customer signed the agreement.

              - `esignature` - Signed electronically (PAdES). The PDF
                signature is validated against the EU Trusted List.
              - `identity` - Signed by hand and accompanied by uploaded
                identity images. Verification is delegated to Invopop's
                approval service.
          enum:
            - esignature
            - identity
        data:
          type: string
          format: byte
          description: >-
            Base64-encoded binary of the signed PDF agreement. Must be
            `application/pdf`.
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Human-readable description of the error.
          example: missing siren parameter
  responses:
    BadRequest:
      description: The request is malformed or missing required parameters.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: missing siren parameter
    Unauthorized:
      description: Missing or invalid authentication token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: missing enrollment
    Forbidden:
      description: |-
        The directory API is only available to live workspaces. Calls made
        with a sandbox enrollment are rejected.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: directory API is only available for live workspaces
    NotFound:
      description: The referenced silo entry or party could not be found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: silo entry not found
    UnprocessableEntity:
      description: |-
        The request is well-formed but cannot be processed — for example
        the agreement PDF cannot be generated because the draft party is
        incomplete, or the uploaded signature failed validation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: draft party is missing signer details
    InternalServerError:
      description: An unexpected server-side error occurred.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: internal server error
  securitySchemes:
    InvopopAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: |-
        Authenticate using a valid Invopop enrollment token in the `Bearer`
        scheme.

        Example: `Authorization: Bearer <token>`

````