---
title: "Check whether a lease can be sent for signature"
method: GET
path: "/leases/{lease_id}/signature/preflight"
tags: ["Signatures", "Leases"]
---

# Check whether a lease can be sent for signature

`GET /leases/{lease_id}/signature/preflight`

## Request

- Base URL: `https://api.faireplace.com/api`
- URL: `https://api.faireplace.com/api/leases/{lease_id}/signature/preflight`
- Auth: HTTP bearer

Runs, **without any side effect**, the same checks that
`POST /leases/{lease_id}/signature/initiate` performs before it writes
anything. Call it before you charge the landlord.

It exists because the charge used to happen first: a landlord paid
€4.90 and then hit a `400` four times in a row because the lease had no
document template. Pre-flight closes that class of failure: you learn
the send is impossible *before* taking the money.

## Reading the answer
- `can_send: true` → nothing blocks the send. Proceed to payment, then
  `initiate`.
- `can_send: false` → `blockers` lists what to fix. This is a **200**,
  not an error: an incomplete file is a normal state of the journey.

Two families of blockers behave differently:

- **state** (`document_completed`, `signature_in_progress`,
  `already_signed`) short-circuits: you get exactly one blocker and no
  file inspection happens;
- **file** (`no_template`, `no_lessee`, `signers_incomplete`,
  `caution_incomplete`) accumulates, so the landlord sees everything to
  correct in a single pass.

## What it does not promise
Pre-flight replays the checks that precede the first write. It cannot
guarantee the PDF will compose, nor that the network holds. It is not a
proof of success: it is a guarantee you are not selling a send that is
already known to fail.

Read-only: requires `leases:read`, and consumes no signature quota.

## Path parameters

- `lease_id` string, uuid, required

## Response `200`

Verdict computed. Check `can_send`: a blocked lease is still a
`200`.

- SignaturePreflight: Verdict of the pre-flight check. `can_send: false` is **not** an error: it is a normal state of the journey (incomplete file, signature already running).
  - `can_send` boolean, required: `true` when nothing blocks the send.
  - `blockers` SignatureBlocker[], required: Empty when `can_send` is `true`. State blockers short-circuit: if the lease is already signed or a run is in progress you get exactly one blocker. File blockers accumulate, so the user sees everything to fix in one pass.
    - `code` 'document_completed' | 'signature_in_progress' | 'already_signed' | 'no_template' | 'no_lessee' | 'signers_incomplete' | 'caution_incomplete', required: - `document_completed`: every party has already signed this lease - `signature_in_progress`: a signature run is already open - `already_signed`: the caller has already signed - `no_template`: no usable document template for this lease type - `no_lessee`: no tenant can receive the invitation to sign - `signers_incomplete`: the landlord record is missing something the signature needs (postal address, mobile number for the OTP…) - `caution_incomplete`: a guarantor cannot be committed: the surety deed needs a maximum amount and a nature of undertaking
    - `message` string, required: Human-readable explanation, in French, safe to show as-is.

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found
- `500`: Internal Server Error

---

[API](https://skmtc.dev/faireplace/apis/faireplace-property-management-api.md) · [All operations](https://skmtc.dev/faireplace/apis/faireplace-property-management-api/llms.txt) · [OpenAPI document](https://skmtc.dev/faireplace/apis/faireplace-property-management-api/revisions/69de39762919?raw)
