API · Manage · Resolutions
Create a resolution.
Author a board, stockholder, or written-consent resolution that authorizes a corporate action and feeds the entity's minute book. Resolutions back nearly every governance mutation Matter performs — equity plan authorization, valuation adoption, share class designation, dividend declarations, M&A approvals, and dissolution — so most callers will already have a resolution_id in hand before they invoke another endpoint.
The endpoint generates the resolution document from the supplied subject and structured payload, routes it to the listed signatories for signature, and on completion appends a signed minute book entry. Omitting a backing resolution where one is statutorily required produces 409 resolution_required on the dependent call.
Resolution kinds (kind) - board_meeting — adopted in a meeting of directors. Requires a quorum (default majority unless overridden in bylaws); each director listed in signatories is sent the document for counter-signature on the meeting minutes. - written_consent — unanimous written consent in lieu of a meeting. All directors (for board consents) or all required stockholders (for stockholder consents) must sign. DGCL §141(f) and §228 govern Delaware entities; the resolver applies the equivalent statute for other jurisdictions.
Prerequisites - Entity must be in registered, active, or suspended state. - Every signatories[] entry must reference a stakeholder_id already on the entity's cap table holding the relevant role (director for board resolutions, voting stockholder for stockholder consents). - Quorum and approval thresholds are checked against the entity's bylaws or operating agreement; non-conforming compositions fail with 422 quorum_not_met.
Template selection. The platform picks a template from the v1 governance catalog using kind + subject + (when present) the higher-level cascade context. Composite flows (formation_packet, closeRound, dissolveEntity, changeOfficer, changeDirector, changeEntityName, increaseAuthorizedShares, executeShareRepurchase, M&A CorporateTransaction) auto-select the substance-specialized template. Direct createResolution calls that don't match a specialized template fall through to matter:board_consent:general:2026-04-26 (board variants) or matter:written_consent:general:2026-04-26 (stockholder variants); pass the consent's substance in the linked Document's cover_page_fields.recitals[] and resolved_clauses[]. See conventions: templates for the picker rules and governance: consent-template catalog for the cascade-to-template_id mapping.
Returns 202 Accepted. On completion, emits one of: resolution.adopted, resolution.signed. Subscribe via `POST /v1/webhook_endpoints` to consume. Idempotent via Idempotency-Key. See idempotency.
See also: Cookbook: run a board consent, Resolutions API overview.
Last updated
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
kindstringRequired"board_meeting""written_consent"subjectstringRequiredsignatory_stakeholder_idsarray<string>OptionalResponse Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
Request
curl -X POST "https://api.mattermode.com/v1/entities/{id}/resolutions" \ -H "Content-Type: application/json" \ -d '{ "kind": "board_meeting", "subject": "string", "signatory_stakeholder_ids": [ "string" ] }'const body = JSON.stringify({ "kind": "board_meeting", "subject": "string", "signatory_stakeholder_ids": [ "string" ]})fetch("https://api.mattermode.com/v1/entities/{id}/resolutions", { 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}/resolutions" body := strings.NewReader(`{ "kind": "board_meeting", "subject": "string", "signatory_stakeholder_ids": [ "string" ] }`) 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 = { "kind": "board_meeting", "subject": "string", "signatory_stakeholder_ids": [ "string" ]}resp = requests.post( "https://api.mattermode.com/v1/entities/ent_Nq3KcAbc/resolutions", 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("""{ "kind": "board_meeting", "subject": "string", "signatory_stakeholder_ids": [ "string" ]}""");HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build();HttpRequest.Builder requestBuilder = HttpRequest.newBuilder() .uri(URI.create("https://api.mattermode.com/v1/entities/{id}/resolutions")) .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("""{ "kind": "board_meeting", "subject": "string", "signatory_stakeholder_ids": [ "string" ]}""", Encoding.UTF8, "application/json");var client = new HttpClient();var response = await client.PostAsync("https://api.mattermode.com/v1/entities/{id}/resolutions", body);var responseBody = await response.Content.ReadAsStringAsync();curl --request POST 'https://api.mattermode.com/v1/entities/ent_Nq3KcAbc/resolutions' \ --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 '{ "kind": "board_meeting", "subject": "string", "signatory_stakeholder_ids": [ "string" ]}'const response = await fetch("https://api.mattermode.com/v1/entities/ent_Nq3KcAbc/resolutions", { 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({ "kind": "board_meeting", "subject": "string", "signatory_stakeholder_ids": [ "string" ] }),});if (!response.ok) { throw new Error(`Matter API ${response.status}: ${await response.text()}`);}const data = await response.json();console.log(data);Response
application/json{
"id": "string",
"object": "resolution",
"entity_id": "ent_Nq3KcAbc",
"kind": "board_meeting",
"subject": "Approval of 2026 Equity Plan and initial pool of 2,000,000 shares",
"resolved_at": 0,
"signatories": [
{}
],
"document_id": "doc_PwQ7MmLk",
"metadata": {},
"created": 1745539200,
"updated": 1745539200,
"livemode": false
}{
"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"
}{
"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://errors.mattermode.com/terms_acceptance_required",
"terms_version": "string",
"terms_summary": "string",
"terms_url": "http://example.com"
}{
"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
}