---
title: "Create formation"
method: POST
path: "/v1/formations"
tags: ["Formations"]
---

# Create formation

`POST /v1/formations`

## Request

- Base URL: `https://api.offshoreproz.com`
- URL: `https://api.offshoreproz.com/v1/formations`
- Auth: HTTP bearer

Start a company formation. Requires `estimate_token` from POST /v1/jurisdictions/{code}/estimate and explicit cost confirmation. Sandbox: simulates all providers. Live: triggers real Stripe/DocuSeal flows.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `jurisdiction` 'WY' | 'MI' | 'NV' | 'BVI' | 'PA' | 'UAE', required
  - `company_name` string, required
  - `company_purpose` string
  - `estimate_token` string, required: Token from POST /estimate (30min TTL)
  - `user_confirmed_cost_and_process` true, required: Must be true — consent gate
  - `obtain_ein` boolean: WY only
  - `governance_model` 'on_chain' | 'hybrid' | 'traditional': MI only
  - `smart_contract_address` string: MI only (optional)
  - `blockchain_network` string: MI only (optional)
  - `beneficial_owner` object, required
    - `full_name` string, required
    - `email` string, email, required
    - `phone` string
    - `address` string, required
    - `id_document_type` 'passport' | 'drivers_license' | 'national_id'
    - `ownership_percentage` number: MI only — percentage of governance (25%+ triggers KYC)

## Response `201`

Formation created

- object
  - `data` object
    - `id` string
    - `mode` 'test' | 'live'
    - `status` 'draft' | 'pending_owner_confirmation' | 'portal_synced' | 'kyc_pending' | 'kyc_review' | 'kyc_approved' | 'kyc_failed' | 'payment_pending' | 'payment_authorized' | 'signature_pending' | 'filing_ready' | 'filing_in_progress' | 'registration_complete' | 'ein_pending' | 'documents_ready' | 'complete' | 'action_required' | 'failed' | 'cancelled'
    - `jurisdiction` 'WY' | 'MI' | 'NV' | 'BVI' | 'PA' | 'UAE'
    - `company_name` string
    - `amount_total_usd` integer: Amount in USD cents
    - `created_at` string, date-time
    - `updated_at` string, date-time, nullable
    - `completed_at` string, date-time, nullable
    - `next_actions` object[]
      - `type` string
      - `url` string
  - `request_id` string

## Other responses

- `400`: Validation error
- `401`: Unauthorized — invalid or missing API key
- `403`: Live mode not enabled or key mode mismatch
- `409`: Idempotency key conflict
- `422`: Unprocessable — validation or state machine error

---

[API](https://skmtc.dev/offshoreproz/apis/offshoreproz-agent-api.md) · [All operations](https://skmtc.dev/offshoreproz/apis/offshoreproz-agent-api/llms.txt) · [OpenAPI document](https://skmtc.dev/offshoreproz/apis/offshoreproz-agent-api/revisions/13026c827538?raw)
