API · Exit · Equity
Cancel the all outstanding convertibles.
Composite SAFE-cancellation cascade used in Phase 3 of the acquihire close. Iterates every outstanding convertible (led_* of kind: convertible) on the entity and, for each, records a convertible_cancellation ShareLedgerEntry, flips the original SAFE Document's execution_status to terminated, and removes the SAFE rows from the cap table.
Outstanding SAFEs do not convert in an asset sale and there is no priced round to fold them into. The standard path is holder-agreed cancellation; each holder counter-signs a safe_release (or convertible_release) Document referenced in release_document_ids[].
The continue_on_partial_failure flag controls cascade semantics. The default (false) treats any holder refusal as a terminal failure and rolls the cascade back — no SAFEs are cancelled. Setting true succeeds-where-it-can: the agreeing SAFEs are cancelled and the refusing entries appear in the response failed[] list. Pivot the dissolution procedure to default_281 for the refusing holders so they receive a creditor notice in the 60-day window.
Returns 202 Accepted. Idempotent via Idempotency-Key. See the acquihire cookbook Phase 3 for the full walkthrough.
Last updated
Query Parameters
dry_runbooleanOptionalIf true, simulate the mutation and return the would-be resource, any cascaded
resources, and a fee estimate — without side effects. Available on every mutation.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
reasonstringRequired"dissolution_pre_clearance""acquihire_pre_close""merger_pre_close""bankruptcy_pre_close"release_document_idsarray<string>RequiredExecuted safe_release (or convertible_release)
Document ids — one per outstanding convertible.
authorizing_resolution_idstringRequiredRequired. The board (or stockholder) Resolution that
authorises the cancellation cascade.
continue_on_partial_failurebooleanOptionalDefault false — any holder refusal fails the whole
cascade and rolls back. Set true to succeed-where-it-can;
the response surfaces refusing entries in failed[].
metadataobjectOptionalFlat string-to-string map. Up to 50 keys. Keys: max 40 chars, charset
[A-Za-z0-9_\\-.]. Values: max 500 chars. Keys prefixed matter_ are reserved
for platform use. Metadata is retrievable but not filterable via query params.
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
Request
curl -X POST "https://api.mattermode.com/v1/entities/{id}/convertibles/cancel_all_outstanding" \ -H "Content-Type: application/json" \ -d '{ "reason": "dissolution_pre_clearance", "release_document_ids": [ "doc_SafeRelease001", "doc_SafeRelease002" ], "authorizing_resolution_id": "res_AcqAuthorize", "continue_on_partial_failure": false }'const body = JSON.stringify({ "reason": "dissolution_pre_clearance", "release_document_ids": [ "doc_SafeRelease001", "doc_SafeRelease002" ], "authorizing_resolution_id": "res_AcqAuthorize", "continue_on_partial_failure": false})fetch("https://api.mattermode.com/v1/entities/{id}/convertibles/cancel_all_outstanding", { method: "POST", headers: { "Content-Type": "application/json" }, body})package mainimport ( "fmt" "net/http" "io/ioutil" "strings")func main() { url := "https://api.mattermode.com/v1/entities/{id}/convertibles/cancel_all_outstanding" body := strings.NewReader(`{ "reason": "dissolution_pre_clearance", "release_document_ids": [ "doc_SafeRelease001", "doc_SafeRelease002" ], "authorizing_resolution_id": "res_AcqAuthorize", "continue_on_partial_failure": false }`) req, _ := http.NewRequest("POST", url, body) req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := ioutil.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body))}import requestsheaders = { "Authorization": "Bearer sk_test_4eC39HqLyjWDarjtT1zdp7dc", "Matter-Version": "2026-06-10", "Idempotency-Key": "ee7c3a9b-3f1a-4d8e-9b2a-7c5e1f0a2d4b",}payload = { "reason": "dissolution_pre_clearance", "release_document_ids": [ "doc_SafeRelease001", "doc_SafeRelease002" ], "authorizing_resolution_id": "res_AcqAuthorize", "continue_on_partial_failure": false}resp = requests.post( "https://api.mattermode.com/v1/entities/ent_Nq3KcAbc/convertibles/cancel_all_outstanding", headers=headers, json=payload,)resp.raise_for_status()print(resp.json())import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.net.http.HttpResponse.BodyHandlers;import java.time.Duration;import java.net.http.HttpRequest.BodyPublishers;var body = BodyPublishers.ofString("""{ "reason": "dissolution_pre_clearance", "release_document_ids": [ "doc_SafeRelease001", "doc_SafeRelease002" ], "authorizing_resolution_id": "res_AcqAuthorize", "continue_on_partial_failure": false}""");HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build();HttpRequest.Builder requestBuilder = HttpRequest.newBuilder() .uri(URI.create("https://api.mattermode.com/v1/entities/{id}/convertibles/cancel_all_outstanding")) .header("Content-Type", "application/json") .POST(body) .build();try { HttpResponse<String> response = client.send(requestBuilder.build(), BodyHandlers.ofString()); System.out.println("Status code: " + response.statusCode()); System.out.println("Response body: " + response.body());} catch (Exception e) { e.printStackTrace();}using System;using System.Net.Http;using System.Text;var body = new StringContent("""{ "reason": "dissolution_pre_clearance", "release_document_ids": [ "doc_SafeRelease001", "doc_SafeRelease002" ], "authorizing_resolution_id": "res_AcqAuthorize", "continue_on_partial_failure": false}""", Encoding.UTF8, "application/json");var client = new HttpClient();var response = await client.PostAsync("https://api.mattermode.com/v1/entities/{id}/convertibles/cancel_all_outstanding", body);var responseBody = await response.Content.ReadAsStringAsync();curl --request POST 'https://api.mattermode.com/v1/entities/ent_Nq3KcAbc/convertibles/cancel_all_outstanding' \ --header 'Authorization: Bearer sk_test_4eC39HqLyjWDarjtT1zdp7dc' \ --header 'Matter-Version: 2026-06-10' \ --header 'Idempotency-Key: ee7c3a9b-3f1a-4d8e-9b2a-7c5e1f0a2d4b' \ --header 'Content-Type: application/json' \ --data '{ "reason": "dissolution_pre_clearance", "release_document_ids": [ "doc_SafeRelease001", "doc_SafeRelease002" ], "authorizing_resolution_id": "res_AcqAuthorize", "continue_on_partial_failure": false}'const response = await fetch("https://api.mattermode.com/v1/entities/ent_Nq3KcAbc/convertibles/cancel_all_outstanding", { method: "POST", headers: { "Authorization": "Bearer sk_test_4eC39HqLyjWDarjtT1zdp7dc", "Matter-Version": "2026-06-10", "Idempotency-Key": "ee7c3a9b-3f1a-4d8e-9b2a-7c5e1f0a2d4b", "Content-Type": "application/json", }, body: JSON.stringify({ "reason": "dissolution_pre_clearance", "release_document_ids": [ "doc_SafeRelease001", "doc_SafeRelease002" ], "authorizing_resolution_id": "res_AcqAuthorize", "continue_on_partial_failure": false }),});if (!response.ok) { throw new Error(`Matter API ${response.status}: ${await response.text()}`);}const data = await response.json();console.log(data);Response
application/json{
"object": "convertibles_cancellation_dispatch",
"cancelled": [
"led_safe001",
"led_safe002"
],
"failed": [],
"partial_failure_continued": false,
"events_emitted": [
"evt_convertible_cancelled",
"evt_convertible_cancelled"
]
}{
"type": "https://mattermode.com/docs/errors/invalid_request",
"title": "Invalid request",
"status": 400,
"code": "invalid_request",
"detail": "Request body could not be parsed as JSON.",
"doc_url": "https://mattermode.com/docs/guides/errors#invalid_request",
"request_id": "req_Qw9xYz8A"
}{
"type": "https://mattermode.com/docs/errors/authentication_required",
"title": "Authentication required",
"status": 401,
"code": "authentication_required",
"detail": "No bearer token was supplied. Pass `Authorization: Bearer sk_live_...` on every request.",
"doc_url": "https://mattermode.com/docs/guides/errors#authentication_required",
"request_id": "req_Qw9xYz8A"
}{
"type": "https://mattermode.com/docs/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "No entity with id `ent_Nq3KcAbc` is visible to this token.",
"doc_url": "https://mattermode.com/docs/guides/errors#not_found",
"request_id": "req_Qw9xYz8A"
}{
"type": "https://mattermode.com/docs/errors/invalid_state_transition",
"title": "Invalid state transition",
"status": 409,
"detail": "Entity ent_Nq3KcAbc is in state `dissolved` and cannot be dissolved again.",
"instance": "/requests/req_Qw9xYz8A",
"code": "invalid_state_transition",
"param": "founders[0].equity",
"doc_url": "https://mattermode.com/docs/guides/errors#invalid_state_transition",
"request_id": "req_Qw9xYz8A",
"retry_after": 30,
"authorized_by": {
"human_principal_id": "usr_4Kj2m8pQ",
"agent_id": "agt_Nq3KcAbc"
}
}{
"type": "https://mattermode.com/docs/errors/rate_limit_exceeded",
"title": "Rate limit exceeded",
"status": 429,
"code": "rate_limit_exceeded",
"detail": "Request rate exceeded for this key. Retry after `retry_after` seconds or honor the `Retry-After` header.",
"doc_url": "https://mattermode.com/docs/guides/errors#rate_limit_exceeded",
"request_id": "req_Qw9xYz8A",
"retry_after": 30
}