# Send a PDF for signature

Upload a PDF, invite recipients, track their signatures and download the completed document.

Start with the PDF you already have. Brigg keeps a fixed copy for this signing request, sends each recipient a private invitation, and records their consent. Your integration never signs on a person's behalf.

## Before you start

Create a workspace API key with `documents.CreateUpload`, `documents.GetUpload`, `documents.GetUploadPart`, `documents.CompleteUpload`, `signing.RequestFileSignatures`, `signing.GetSigningRequest` and `signing.GetSigningDocument`. Add event-history, cancellation, deadline or reminder permissions only if your integration needs them.

Follow [Upload and use files](https://developer.brigg.app/files) to upload your PDF and complete its scan. Save the returned `file_id`. The PDF must be readable without a password.

## Invite the recipients

Use the same `Idempotency-Key` when retrying the same request. A fresh key starts a separate signing request and sends another invitation.

```bash
curl 'https://api.brigg.app/v1/operations/signing.RequestFileSignatures' \
  -H "Authorization: Bearer $BRIGG_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: agreement-2026-001' \
  --data '{
    "file_id": "f_agreement",
    "title": "Consulting agreement",
    "signers": [{"email": "alex@example.com", "name": "Alex Morgan"}],
    "signature_method": "standard",
    "message": "Please review and sign our agreement."
  }'
```

```json
{
  "signing_request_id": "sig_agreement",
  "status": "pending",
  "invitation_failures": []
}
```

`standard` collects a typed-name e-signature with its time and evidence. `bankid` uses Norwegian BankID when configured and charges the workspace's credit. The recipient completes either method themselves.

If `invitation_failures` contains addresses, the request still exists. Use `signing.RemindSigners` for the affected pending recipients instead of creating a second request.

## Check progress

Call [Get signing request](https://developer.brigg.app/reference/signing/GetSigningRequest) with the returned `signing_request_id`. The response contains each recipient's status and the request's `pending`, `completed`, `cancelled` or `expired` state.

`completed` means everyone has signed. The signed archive may still be generating; wait until `file_id` is non-null before downloading it. Poll with a delay and follow [rate limits and safe retries](https://developer.brigg.app/reliability).

A workspace key reads the requests it created. A personal connection uses that person's signing access. A private source stays visible only to its owner and the invited recipients.

## Download the signed PDF

```bash
curl 'https://api.brigg.app/v1/operations/signing.GetSigningDocument' \
  -H "Authorization: Bearer $BRIGG_API_KEY" \
  -H 'Content-Type: application/json' \
  --data '{"signing_request_id":"sig_agreement","version":"signed"}'
```

The response contains `url`, `filename` and `expires_at`. Download the file before the link expires, or request a fresh link. Use `version: "original"` to download the fixed source shown to recipients.

For typed-name signatures, the archive contains the original PDF pages followed by the signature evidence. BankID returns a cryptographically signed PDF, which Brigg preserves without rewriting.

## Manage a pending request

- [Remind signers](https://developer.brigg.app/reference/signing/RemindSigners): resend invitations to pending recipients.
- [Change the deadline](https://developer.brigg.app/reference/signing/SetSigningDeadline): keep the same document and signatures while extending or shortening the deadline.
- [Cancel signing](https://developer.brigg.app/reference/signing/CancelSigning): stop further signatures. Completed requests cannot be cancelled.

The sender controls these actions. A request's document cannot be replaced after invitations go out. To sign a different PDF, cancel the pending request and create a new one.

## Read the event history

Use `signing.ListSigningEvents` to read the request’s history. Events are ordered oldest first and have stable `event_id` values for deduplication. Follow `next_cursor` while `has_more` is true. A new poll starts from the first page; retain processed event IDs. This is a history read, not a webhook subscription. Every page checks your current access to the request.

Events cover requests, opening, signing, reminders, deadline changes, cancellation and archive completion. They omit recipient IP addresses, access links, document contents and internal audit details.

