---
title: "Add Estimate Signature"
method: POST
path: "/estimate/{estimate_uid}/signature"
---

# Add Estimate Signature

`POST /estimate/{estimate_uid}/signature`

## Request

- Base URL: `https://dc-region.zuperpro.com/api`
- URL: `https://dc-region.zuperpro.com/api/estimate/{estimate_uid}/signature`
- Auth: API key in header `x-api-key`

Adds a signer to a proposal's multi-signer flow (up to 5 signers: max 1 CUSTOMER, 1 INTERNAL, 3 COSIGNER — a CUSTOMER signer is auto-created if none exists). Requires the `multi_signer` company policy to be enabled, the estimate to be a proposal (`is_proposal: true`) with a layout association, and estimate_status to be DRAFT/AWAIT_RESPONSE/AWAIT_SIGNATURE. `type` defaults to COSIGNER; CUSTOMER cannot be added here. COSIGNER requires email+name; INTERNAL requires user_uid (email/name are overwritten from the resolved user). If the immediately-preceding signer has already signed, the new signer starts in AWAIT_SIGNATURE (gets notified immediately) instead of PENDING.

## Path parameters

- `estimate_uid` string, required

## Request body

- object
  - `signature` object, required
    - `type` 'COSIGNER' | 'INTERNAL': CUSTOMER is rejected here — a customer signer is auto-created.
    - `email` string: Required for COSIGNER.
    - `name` string: Required for COSIGNER.
    - `user_uid` string: Required for INTERNAL. Must be an active company user.
    - `internal_user_type` 'CREATED_USER' | 'SELECTED_USER' | 'SOLD_BY': Required for INTERNAL. SOLD_BY resolves user_uid from the estimate's sold_by_user (falls back to created_by).

## Response `200`

200

- object
  - `type` string
  - `title` string
  - `message` string
  - `data` object[]: Full sorted signatures array (CUSTOMER, then COSIGNER, then INTERNAL).
    - `signature_uid` string
    - `type` 'CUSTOMER' | 'COSIGNER' | 'INTERNAL'
    - `name` string
    - `email` string
    - `user_uid` string
    - `internal_user_type` string, nullable
    - `sign_url` string
    - `status` 'PENDING' | 'AWAIT_SIGNATURE' | 'SIGNED'
    - `public_url` string
    - `meta_data` object
      - `sent_at` string, nullable
      - `viewed_at` string, nullable
      - `signed_at` string, nullable
      - `ip_address` string, nullable
      - `user_agent` string, nullable

## Other responses

- `400`: 400
- `403`: 403
- `404`: 404

## Changes

- **2026-11-03** `3c21bc232e16`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zuper/apis/zuper-pro-api/changes/estimate/:estimate_uid/signature/post.md)

---

[API](https://skmtc.dev/zuper/apis/zuper-pro-api.md) - [All operations](https://skmtc.dev/zuper/apis/zuper-pro-api/llms.txt) - [OpenAPI document](https://skmtc.dev/zuper/apis/zuper-pro-api/revisions/3c21bc232e16?raw)
