---
title: "Start or resume signing an agreement (business)"
method: POST
path: "/compliance/esign/envelopes"
tags: ["compliance", "esign", "business", "customer-session"]
---

# Start or resume signing an agreement (business)

`POST /compliance/esign/envelopes`

## Request

- Base URL: `https://api.stablesea.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.stablesea.com/compliance/esign/envelopes`
- Auth: none declared

Composes (or resumes) the calling member's e-signature envelope and returns it, plus a one-time embedded signing session when one can be issued. With `purpose` `msa` it signs the business's live MSA document named by `document_id`. With `purpose` `custody_contract` it signs the custody contract named by `contract_type`; the platform resolves the contract's document itself, so `document_id` must be absent. A request whose fields do not match its purpose, including an `msa` request without `document_id`, answers 400 `esign_purpose_invalid` with `param` naming the field. Requires e-sign enrollment (400 `esign_not_enrolled`, which is also the answer for `custody_contract` wherever custody contracts are not signed by e-signature), and the signer's authority attestation and title (400 `esign_authority_attestation_required`). An envelope another member started answers 409 `esign_signer_conflict` without a session; resuming the caller's own envelope with a title other than the one already placed on its document answers 409 `esign_title_conflict`; a document the caller cannot address answers 404 `document_not_found`; an agreement that changed while signing was starting, or a custody contract the business already signed, answers 409 `esign_source_changed`; a new envelope while this month's envelope count is at or above the platform's hard cap answers 409 `esign_envelope_cap_reached` (nothing is created or sent; resuming an envelope already started is not refused); a paused deployment answers 503, and an enrolled business on a deployment where e-signature is unavailable answers 503.

## Request body

- EsignCreateEnvelopeInput
  - `authority_attestation` boolean, required
  - `contract_type` 'custody_sa' | 'trade_sa': A custody contract: custody_sa (the custodial services agreement) or trade_sa (the electronic trading agreement). On an envelope it names the contract a custody_contract envelope signs, and is absent when purpose is msa. On a create it is required when purpose is custody_contract and must be absent when purpose is msa.
  - `document_id` string
  - `purpose` 'msa' | 'custody_contract', required
  - `title` string, required

## Response `200`

OK

- EsignCreateEnvelopeOutput
  - `artifacts` EsignEnvelopeArtifactsView, required
    - `executed_document` boolean, required
    - `provider_certificate` boolean, required
  - `contract_type` 'custody_sa' | 'trade_sa': A custody contract: custody_sa (the custodial services agreement) or trade_sa (the electronic trading agreement). On an envelope it names the contract a custody_contract envelope signs, and is absent when purpose is msa. On a create it is required when purpose is custody_contract and must be absent when purpose is msa.
  - `created_ts` string, date-time, required
  - `document` EsignEnvelopeDocumentView, required
    - `associated_entity` string, required
    - `customer_legal_name` string
    - `document_id` string, required
    - `file_name` string, required
    - `version` string, required
  - `executed_ts` string, date-time, nullable
  - `id` string, required
  - `provider` string, required
  - `purpose` 'msa' | 'custody_contract', required
  - `signer` EsignEnvelopeSignerView, required
    - `display_name` string, required
    - `individual_id` string, nullable
    - `signed_ts` string, date-time, nullable
    - `status` 'pending' | 'viewed' | 'signed' | 'declined' | 'reassigned', required
    - `title` string, required
    - `viewed_ts` string, date-time, nullable
  - `signing_session` EsignSigningSessionView
    - `allowed_origin` string, required
    - `expires_ts` string, date-time, required
    - `protocol` 'postmessage_v1' | 'redirect', required
    - `provider` string, required
    - `url` string, required
  - `status` 'preparing' | 'awaiting_signatures' | 'partially_signed' | 'archiving' | 'needs_repair' | 'executed' | 'declined' | 'expired' | 'voided' | 'failed', required: Lifecycle of the envelope. preparing: being sent to the provider. awaiting_signatures: out for signature. archiving: signed; the executed copy and evidence are being stored. needs_repair: signed or sent, waiting on an operator; the signature stands. executed: signed and durably stored; the agreement it signs is accepted. declined/expired/voided/failed: ended without a signature; start a new envelope.
  - `verification` EsignEnvelopeVerificationView
    - `certificate_sha256` string, nullable
    - `executed_sha256` string, required
    - `source_sha256` string, required

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found
- `409`: Conflict
- `503`: Service Unavailable
- `default`: Error response.

## Changes

- **2026-10-29** `e003c8a67b62`: 7 info
  - added the optional property `error/authorization` to the response with the `400` status
  - added the optional property `error/authorization` to the response with the `401` status
  - added the optional property `error/authorization` to the response with the `403` status
  - added the optional property `error/authorization` to the response with the `404` status
  - …3 more
- **2026-10-22** `9c05d53541bb`: 1 warning, 4 info
  - added the new `custody_contract` enum value to the `purpose` response property for the response status `200`
  - added the new optional request property `contract_type`
  - the request property `document_id` became optional
  - added the new `custody_contract` enum value to the request property `purpose`
  - …1 more
- **2026-10-16** `d8ab48e744d6`: 1 info
  - api tag `customer-session` added
- **2026-10-14** `e8862dc94b6d`: 1 info
  - added the optional property `document/customer_legal_name` to the response with the `200` status
- **2026-10-07** `fe94c97bbbe7`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/stablesea/apis/stable-sea-backend/changes/compliance/esign/envelopes/post.md)

---

[API](https://skmtc.dev/stablesea/apis/stable-sea-backend.md) - [All operations](https://skmtc.dev/stablesea/apis/stable-sea-backend/llms.txt) - [OpenAPI document](https://skmtc.dev/stablesea/apis/stable-sea-backend/revisions/772c80d83658?raw)
