---
title: "Sign the presented engagement letter and start payment"
method: POST
path: "/client-onboarding/public/enrollments/{token}/engagement-letter/sign"
tags: ["Client Onboarding"]
---

# Sign the presented engagement letter and start payment

`POST /client-onboarding/public/enrollments/{token}/engagement-letter/sign`

## Request

- Base URL: `https://ledgerhq.pro/api/v1`
- URL: `https://ledgerhq.pro/api/v1/client-onboarding/public/enrollments/{token}/engagement-letter/sign`
- Auth: none required

Records append-only typed-signature evidence for the exact presented content hash, then starts the connected-account subscription. Identical retries converge; different later signature evidence is rejected. This legal-signing operation is prospect-only and is never exposed through MCP.

## Path parameters

- `token` string, required

## Request body

- SignPublicClientOnboardingEngagementLetter
  - `signatureName` string, required
  - `acceptedElectronicSignature` true, required
  - `signatureAppearance` 'allura-v1': Required when the presented agreement advertises this appearance. The signer must adopt the displayed cursive signature. Omitted for legacy presentations.
  - `presentedContentHash` string, required

## Response `200`

Signed enrollment and optional Stripe-hosted payment action URL

- PublicClientOnboardingActivation
  - `enrollment` PublicClientOnboardingEnrollment, required
    - `id` string, uuid, required
    - `firmSlug` string, required
    - `status` 'details_submitted' | 'payment_method_pending' | 'payment_method_ready' | 'agreement_presented' | 'signed' | 'payment_pending' | 'payment_failed' | 'paid' | 'provisioning' | 'completed' | 'abandoned', required
    - `package` ClientOnboardingPublicPackage, required
      - `slug` string, required
      - `name` string, required
      - `description` string, required
      - `features` string[], required
      - `monthlyPriceCents` integer, required
      - `setupFeeCents` integer, required
      - `recommended` boolean, required
    - `prospect` ClientOnboardingProspect, required
      - `name` string, required
      - `title` string, required
      - `email` string, email, required
      - `mobilePhone` string, required
    - `questions` ClientOnboardingPublicQuestionSnapshot, required
      - `standard` ClientOnboardingPublicStandardQuestion[], required
        - `key` string, required
        - `prompt` string, required
        - `type` 'short_text' | 'long_text' | 'yes_no' | 'date' | 'single_select' | 'address' | 'contact', required
        - `enabled` boolean, required
        - `required` boolean, required
        - `order` integer, required
        - `options` string[]
      - `custom` ClientOnboardingCustomQuestion[], required
        - `id` string, uuid, required
        - `prompt` string, required
        - `type` 'short_text' | 'long_text' | 'yes_no' | 'single_select', required
        - `required` boolean, required
        - `options` string[], required
        - `order` integer, required
    - `answers` object, required
    - `paymentMethodReady` boolean, required
    - `engagementLetter` object, nullable, required
      - `version` integer, required
      - `renderedHtml` string, required
      - `contentHash` string, required
      - `presentedAt` string, date-time, required
      - `signedAt` string, date-time, nullable, required
      - `signatureName` string, nullable, required
      - `appearance` 'allura-v1'
      - `disclosure` string
      - `copy` object, nullable: Immutable portal-copy status. New copies have delivery=portal, email=not_requested, sealed=false and timestamped=false. Historical seal/email evidence remains available. Signing stays accepted during preparation.
        - `state` 'unsigned' | 'legacy' | 'preparing' | 'ready'
        - `delivery` 'portal'
        - `sealed` boolean
        - `timestamped` boolean
        - `email` 'not_requested' | 'pending' | 'accepted' | 'delivered' | 'bounced' | 'complained' | 'suppressed' | 'delivery_unknown'
        - `sha256` string, nullable
        - `archivedAt` string, date-time, nullable
    - `payment` object, required
      - `status` 'not_started' | 'pending' | 'requires_action' | 'failed' | 'paid', required
      - `amountDueCents` integer, required
    - `companyOrganizationId` string, uuid, nullable, required
    - `completedAt` string, date-time, nullable, required
  - `paymentActionUrl` string, uri, nullable, required

## Other responses

- `409`: The letter, signature, payment method, or enrollment state conflicts
- `410`: The resume token is invalid or expired
- `429`: Rate limit exceeded
- `default`: Error response

---

[API](https://skmtc.dev/ledgerhq-pro/apis/ledgerhq-bookkeeping-api.md) · [All operations](https://skmtc.dev/ledgerhq-pro/apis/ledgerhq-bookkeeping-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ledgerhq-pro/apis/ledgerhq-bookkeeping-api/revisions/9a8269f0a586?raw)
