Cookbook
Dissolve an entity
Self-initiated wind-down. Form 966 → final franchise tax → Certificate of Dissolution → BOI closure.
Last updated
Plan of dissolution, certificate of dissolution, creditor notice, final tax filings, and §281 distribution waterfall.
Trigger
The board has decided to wind down. The entity is solvent.
Call sequence
1. Run dissolution readiness
GET /v1/entities/{id}/dissolution_readiness2. Cancel all outstanding convertibles
POST /v1/convertibles/cancel_all { entity }3. File certificate of dissolution
POST /v1/dissolutions { entity, plan }4. Open creditor claims window
POST /v1/dissolutions/{id}/creditor_window/start5. Calculate §281 distribution
POST /v1/dissolutions/{id}/distribution/calculate6. Distribute
POST /v1/dissolutions/{id}/distributeIdempotency
Dissolution creation idempotent on `entity`. Only one open dissolution per entity.
Webhooks
| Event | Description |
|---|---|
dissolution.filed | Certificate accepted. |
creditor_claims_window.opened | Notice published. |
creditor_claim.received | Per claim. |
dissolution.completed | Final distribution done. |
Errors
| Status | Code | Description |
|---|---|---|
409 | dissolution_in_progress | There is already an active dissolution. |
Related
Pre-flight readiness
Before invoking the dissolve verb, fetch a typed
DissolutionReadiness
report. It returns an iterable blockers[] array — one entry per unmet
obligation, each with a category, severity, and remediation pointing at
the endpoint that clears it. Distinct from the ?dry_run=true path on
/dissolve, which surfaces blockers only as an error envelope.
curl https://api.mattermode.com/v1/entities/ent_Nq3KcAbc/dissolution_readiness \
-H "Authorization: Bearer $MATTER_KEY" \
-H "Matter-Version: 2026-05-01"Response shape:
{
"object": "dissolution_readiness",
"entity_id": "ent_Nq3KcAbc",
"executable": false,
"procedure_recommended": "default_281",
"blockers": [
{
"category": "outstanding_convertible",
"severity": "human_remediable",
"summary": "1 outstanding SAFE held by an angel investor",
"remediation": {
"suggested_endpoint": "POST /v1/entities/{id}/convertibles/{id}/cancel",
"suggested_payload": { "reason": "holder_written_off" }
}
},
{
"category": "foreign_qualification_pre_flight",
"severity": "human_remediable",
"state": "US-CA",
"summary": "California requires final SI-550, final Form 100, and FTB Tax Clearance Certificate before SoS accepts Form SURC.",
"remediation": {
"sub_steps": [
{ "step": 1, "summary": "File final CA Statement of Information",
"suggested_endpoint": "POST /v1/filings",
"suggested_payload": { "type": "ca_statement_of_information_final" } },
{ "step": 2, "summary": "File final CA Form 100",
"suggested_endpoint": "POST /v1/filings",
"suggested_payload": { "type": "ca_form_100_final" } },
{ "step": 3, "summary": "Request FTB Tax Clearance Certificate",
"suggested_endpoint": "POST /v1/filings",
"suggested_payload": { "type": "ca_ftb_tax_clearance_request" } },
{ "step": 4, "summary": "File Form SURC with CA SoS",
"suggested_endpoint": "POST /v1/filings",
"suggested_payload": { "type": "ca_certificate_of_surrender" },
"blocked_until": ["step_1", "step_2", "step_3"] }
]
}
},
{
"category": "accounting_attestation",
"severity": "human_remediable",
"summary": "Final AP/AR reconciliation attestation required before dissolve fires."
}
],
"estimated_cost_breakdown": {
"de_cod_fee_usd": 254,
"final_franchise_tax_usd": 400,
"per_state_withdrawal_fees_usd": [{ "state": "US-CA", "amount_usd": 0 }]
},
"expected_timeline": {
"earliest_filing_date": "2026-12-31",
"creditor_window_close_date": "2027-03-01",
"terminal_dissolution_date": "2027-03-15"
}
}Walk the list, clear each entry, then re-fetch until executable: true. The
ordering matters for per-state cascades: file each sub_steps[] entry in
sequence, observe its blocked_until references, and only proceed once each
prerequisite filing reaches accepted status.
Creditor claims window
For procedure: default_281 (the most common path) DGCL §281 requires a
60-day creditor-notice window before the Certificate of Dissolution can file.
Open the window explicitly with
POST /v1/entities/{id}/creditor_claims_window/start:
curl -X POST https://api.mattermode.com/v1/entities/ent_Nq3KcAbc/creditor_claims_window/start \
-H "Authorization: Bearer $MATTER_KEY" \
-H "Matter-Version: 2026-05-01" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"procedure": "default_281",
"publish": false,
"known_creditors": [
{
"recipient_name": "Acme Cloud Services",
"notice_channel": "certified_mail",
"address": { "line1": "1 Market St", "city": "San Francisco", "region": "CA", "postal_code": "94105", "country": "US" }
}
]
}'The response is a CreditorClaimsWindow (ccw_*). Matter dispatches the
notice_of_dissolution Document to each known_creditors[] entry on the
chosen channel and records the per-recipient notice trail.
While the window is open:
- Record incoming claims via
POST /v1/creditor_claims_windows/{id}/claims. - Settle each claim (or deny it) via
POST /v1/creditor_claims_windows/{id}/claims/{claim_id}/settle. Settling withoutcome: settledrequires asettlement_document_idpointing at an executedsettlement_agreement.
When closes_at passes, the window auto-transitions to closed and the
dissolve cascade unblocks the Certificate of Dissolution filing.
§281 distribution waterfall
Once the creditor window closes, the §281 distribution computes the post-
satisfaction residual and walks the share-class liquidation preferences in
seniority order. Run the calculation with
POST /v1/dissolutions/{id}/distribution/calculate
to surface a dry-run waterfall — every preferred class is paid its preference
plus participation (if any), then common holders share the remainder pro-rata.
The waterfall response carries the per-holder amounts, the per-class exhaustion points, and any unsatisfied claims rolled forward into the §278 tail. Re-run after each settled creditor claim — the residual changes as known liabilities resolve.
Distribute via
POST /v1/dissolutions/{id}/distribute.
The platform records a dissolution_distribution ShareLedgerEntry per
holder, dispatches a payout instruction to the entity's wind-down account,
and emits dissolution.distributed per recipient. Holders with reachable
banking detail get an ACH; the rest receive a paper check via the registered
agent's lockbox.
Error recovery
| Failure | Cause | Remediation |
|---|---|---|
409 Conflict invalid_state_transition | Entity is in dissolved, draft, submitted, or cancelled. | Cannot dissolve. Inspect Entity.status and pick the correct path. |
409 Conflict outstanding_obligations | Unfiled franchise tax or unpaid state fees. | Run file_all_due with within_days: 365, then retry. The error includes the obligations list. |
403 Forbidden tier_4_cannot_dissolve | Token is tier-4 autonomous. | Re-issue a tier-3 token; tier-4 cannot dissolve under any policy. |
423 Locked pending_corporate_transaction | Open M&A envelope (CorporateTransaction not in closed). | Cancel or close the transaction first. |
408 Request Timeout after authorization.created | Human signer didn't approve within 14 days. | Authorization auto-expires; the cascade reverts to active. Re-fire the workflow. |
Full taxonomy: errors.
Variations
Delaware short-form dissolution under §280 — faster, but requires no creditors and unanimous board approval. Skips the creditor-notice window.
{
"entity_id": "ent_Nq3KcAbc",
"reason": "no_business",
"procedure": "elective_280"
}Entities in suspended status (compliance lapse) can still dissolve. Matter
clears the suspension's underlying obligation as part of the cascade.
{
"entity_id": "ent_Nq3KcAbc",
"reason": "compliance_default_unrecoverable",
"procedure": "default_281",
"clear_suspension": true
}If the entity is foreign-qualified in additional states, dissolution cascades through every jurisdiction's certificate-of-withdrawal filing first, then the home-state Certificate of Dissolution. Foreign qualifications and state registrations (employer / sales-tax / DBA / business-license accounts) close independently because the same entity often has one without the other — a remote employee in MA triggers a state employer registration without triggering foreign qualification.
{
"entity_id": "ent_Nq3KcAbc",
"reason": "strategic_wind_down",
"procedure": "default_281",
"closures": {
"qualifications": "all",
"state_registrations": "all"
}
}To close only some qualifications or registrations, switch the corresponding
field to "specified" and supply IDs in specified_qualifications[] or
specified_state_registrations[]. Use "none" to skip a category entirely
(e.g., DE-only entity has no foreign qualifications to withdraw).
The response's filings[] array grows by one per qualified state plus one
per closed registration. Each per-state cascade walks its own pre-flight
gate (final returns marked final, agency clearance request, SoS surrender
form) ordered via Filing.depends_on[].
FAQ
Related
POST /v1/entities/{id}/dissolve— the underlying primitive- Lifecycle state machine — terminal-state guarantees
- Authorizations — the human-signature pause model
matter_dissolve_company— the MCP tool that wraps this recipe