---
title: "Check signing progress without a webhook"
method: GET
path: "/api/v1/firme/{id}/status"
tags: ["Signatures (app routes)"]
---

# Check signing progress without a webhook

`GET /api/v1/firme/{id}/status`

## Request

- Base URL: `https://api.custodo.ai`
- URL: `https://api.custodo.ai/api/v1/firme/{id}/status`
- Auth: HTTP bearer

Poll with an API key holding firme:read, or a signed-in session. Returns the envelope status and each recipient’s status, signing time, decline reason and processing state. completed means every signer has signed; declined, voided and expired are the other terminal states. Stop polling when terminal, unless waiting for hasCertificate. A signed artifact can exist while other signatures are pending. For the entire record use GET /firme/{id}; download via /firme/{id}/download?which=signed.

## Path parameters

- `id` string, uuid, required

## Headers

- `X-Tenant-Id` string, uuid

## Response `200`

Current signing progress.

- object
  - `ok` true, required
  - `data` FirmeEnvelopeStatus, required
    - `envelopeId` string, required: The same envelopeId carried by signing webhooks.
    - `status` 'draft' | 'sent' | 'partially_signed' | 'completed' | 'declined' | 'expired' | 'voided', required
    - `updatedAt` string, required: ISO 8601, UTC.
    - `completedAt` string, nullable, required: ISO 8601, UTC.
    - `expiresAt` string, nullable, required: ISO 8601, UTC.
    - `preparation` 'queued' | 'ready' | 'failed', required
    - `hasSignedArtifact` boolean, required: A signed artifact is available; it may contain only some signatures.
    - `hasCertificate` boolean, required: The completion certificate has finished generating.
    - `signers` object[], required
      - `id` string, required: A UUID.
      - `seq` number, required: Signing order, from 1.
      - `name` string, required
      - `role` 'signer' | 'cc', required: `signer` signs; `cc` receives a read-only link when the envelope is sent and the signed copy when it is complete, and never signs.
      - `status` 'pending' | 'sent' | 'viewed' | 'signed' | 'declined', required
      - `signedAt` string, nullable, required: ISO 8601, UTC.
      - `declineReason` string, nullable, required
      - `signingPending` boolean, required
      - `signingError` string, nullable, required

## Other responses

- `400`: The request did not validate: `error.details` names the fields.
- `401`: No API key, or one that is malformed, unknown, revoked or expired.
- `403`: The module is off for this organisation, the credential lacks the permission, or the tier does not cover it.
- `404`: Nothing with that id in this organisation.
- `429`: The API key has spent its minute, or its day. See `Retry-After`.

---

[API](https://skmtc.dev/custodo/apis/custodo-integrazioni.md) · [All operations](https://skmtc.dev/custodo/apis/custodo-integrazioni/llms.txt) · [OpenAPI document](https://skmtc.dev/custodo/apis/custodo-integrazioni/revisions/16d336d3ec2a?raw)
