API · Create · Intents
Create an intent.
Declarative entry point for any founder action. The caller declares a desire-level goal — start_company, hire_worker, take_investment, make_decision, raise_capital, wind_down, etc. — plus the goal-specific parameters. The resolver expands the request into an ExecutionPlan of jurisdiction-specific filings, documents, resolutions, and Authorizations, with a one-line rationale on every defaulted field. The plan is fully introspectable before any side effect lands. Two calls, every action. This endpoint resolves only — it never commits. Side effects land via POST /intents/{id}/execute. The split lets agents propose, humans review, and execution land deterministically against the exact plan that was reviewed — no drift between preview and run, every action audit-logged with the rationale that backed it. For most goals the resolver returns synchronously with status: resolved and a fully-populated execution_plan. Slow-resolving goals (start_company waiting on name-availability lookups, sell_company waiting on diligence assembly) return status: draft and resolve via the intent.resolved webhook. Prerequisites - The acting principal must hold the scopes required by every step in the resolved plan; missing scopes surface as a single 422 scope_insufficient with the offending step listed. - Goals that target an existing entity (hire_worker, make_decision, take_investment, wind_down, expand_to_state) require the entity in parameters.entity_id to be in a state the goal accepts. Resolution rejections (422). A request the resolver cannot turn into a lawful plan returns a structured reason: invalid_jurisdiction (not one of the 56 US jurisdictions), unsupported_in_jurisdiction (the entity kind, variant, or profession-state pairing has no statute there — the detail names the corrective path, e.g. California professionals use a professional corporation), unsupported_sector (sector cannot be planned), unsupported_intent_kind (declared but unimplemented intent kinds), invalid_field (field-identifying detail — NaN or out-of-range equity, nonprofit founders carrying equity, governance below a jurisdiction floor without expand_governance, S-election with non-US-person shareholders), equity_does_not_sum_to_100, no_founders, missing_required_field, primary_equals_target, unsupported_entity_kind. Returns 202 Accepted with the Intent resource. On resolution, emits intent.resolved; subscribe via `POST /v1/webhook_endpoints`. Resolution is side-effect-free, so Idempotency-Key is not required on this call (a duplicate POST produces a fresh int_… ID with the same plan, harmless). It is required on POST /intents/{id}/execute. See also: Execute an intent, Cookbook: form a company.
Last updated
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
goalstringRequiredDesire-level goal. The 15-value enum is documented on
Intent.goal. Pick the verb that matches what you'd say
out loud — "start a company" → start_company,
"hire someone" → hire_worker, "take an angel cheque"
→ take_investment, "run a board consent" →
make_decision. The resolver picks the underlying
instrument, structure, jurisdiction, or vendor.
parametersobject | object | object | object | objectOptionalGoal-specific parameters. The shape is discriminated by
goal — see StartCompanyParameters,
HireWorkerParameters, TakeInvestmentParameters,
MakeDecisionParameters, etc. Optional when
discovery_input or natural_language_description is
provided — the resolver fills any missing parameters
from those inputs and surfaces every defaulted field
in execution_plan.steps[].defaulted_fields[].
discovery_inputobjectOptionalStructured shape-of-business inputs. The resolver maps these to
sensible jurisdiction + entity_kind defaults so the founder does
not need to know "Delaware" or "C-Corp" up front. Every field
the resolver fills from this input is surfaced in
execution_plan.steps[].defaulted_fields[] with a one-line
rationale, so the founder can read back why each default was
picked.
business_kindstringOptionalShape of the business. Drives default contract template (subscription_agreement vs marketplace_tos vs msa_plus_sow) and any business-kind-specific compliance hints.
"saas""marketplace""consumer""agency""hardware""fintech_adjacent""devtools""content_subscription""other"team_shapestringOptionalNumber and roles of stakeholders at formation. Drives default share structure, vesting (none for solo, 4y/1c for cofounders), and equity-plan provisioning.
"solo""two_cofounders""three_plus_cofounders""founder_with_team"funding_intentstringOptionalHow the founder expects to fund. Drives jurisdiction default (Delaware for vc_track / series_a_track / seed_round; Wyoming or home-state acceptable for bootstrap / angel_safe_only) and share-structure choices.
"bootstrap""angel_safe_only""seed_round""series_a_track""vc_track"home_statestringOptionalTwo-letter US state where the founder operates. Used to default the registered-agent state, the primary-place-of- business address, and any foreign-qualification requirements.
natural_language_descriptionstringOptionalFree-form one-to-three sentence description of the company or
action in the founder's own words. The resolver uses this when
goal and parameters are underspecified — it tags the
entity's default_contract_kind from this text, surfaces a
layperson explainer on every read-back, and writes the text
into execution_plan.steps[].defaulted_fields[].rationale_source.
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/intents" \ -H "Content-Type: application/json" \ -d '{ "goal": "start_company", "parameters": { "proposed_name": "Waypoint Systems", "founder": { "name": "Alex Chen", "email": "alex@example.com", "home_state": "NC" }, "description": "A weekly interview podcast monetised through paid subscribers and one annual sponsor." }, "discovery_input": { "business_kind": "content_subscription", "team_shape": "solo", "funding_intent": "bootstrap", "home_state": "NC" }, "metadata": {} }'const body = JSON.stringify({ "goal": "start_company", "parameters": { "proposed_name": "Waypoint Systems", "founder": { "name": "Alex Chen", "email": "alex@example.com", "home_state": "NC" }, "description": "A weekly interview podcast monetised through paid subscribers and one annual sponsor." }, "discovery_input": { "business_kind": "content_subscription", "team_shape": "solo", "funding_intent": "bootstrap", "home_state": "NC" }, "metadata": {}})fetch("https://api.mattermode.com/v1/intents", { method: "POST", headers: { "Content-Type": "application/json" }, body})package mainimport ( "fmt" "net/http" "io/ioutil" "strings")func main() { url := "https://api.mattermode.com/v1/intents" body := strings.NewReader(`{ "goal": "start_company", "parameters": { "proposed_name": "Waypoint Systems", "founder": { "name": "Alex Chen", "email": "alex@example.com", "home_state": "NC" }, "description": "A weekly interview podcast monetised through paid subscribers and one annual sponsor." }, "discovery_input": { "business_kind": "content_subscription", "team_shape": "solo", "funding_intent": "bootstrap", "home_state": "NC" }, "metadata": {} }`) 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 = { "goal": "start_company", "parameters": { "proposed_name": "Waypoint Systems", "founder": { "name": "Alex Chen", "email": "alex@example.com", "home_state": "NC" }, "description": "A weekly interview podcast monetised through paid subscribers and one annual sponsor." }, "discovery_input": { "business_kind": "content_subscription", "team_shape": "solo", "funding_intent": "bootstrap", "home_state": "NC" }, "metadata": {}}resp = requests.post( "https://api.mattermode.com/v1/intents", 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("""{ "goal": "start_company", "parameters": { "proposed_name": "Waypoint Systems", "founder": { "name": "Alex Chen", "email": "alex@example.com", "home_state": "NC" }, "description": "A weekly interview podcast monetised through paid subscribers and one annual sponsor." }, "discovery_input": { "business_kind": "content_subscription", "team_shape": "solo", "funding_intent": "bootstrap", "home_state": "NC" }, "metadata": {}}""");HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build();HttpRequest.Builder requestBuilder = HttpRequest.newBuilder() .uri(URI.create("https://api.mattermode.com/v1/intents")) .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("""{ "goal": "start_company", "parameters": { "proposed_name": "Waypoint Systems", "founder": { "name": "Alex Chen", "email": "alex@example.com", "home_state": "NC" }, "description": "A weekly interview podcast monetised through paid subscribers and one annual sponsor." }, "discovery_input": { "business_kind": "content_subscription", "team_shape": "solo", "funding_intent": "bootstrap", "home_state": "NC" }, "metadata": {}}""", Encoding.UTF8, "application/json");var client = new HttpClient();var response = await client.PostAsync("https://api.mattermode.com/v1/intents", body);var responseBody = await response.Content.ReadAsStringAsync();curl --request POST 'https://api.mattermode.com/v1/intents' \ --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 '{ "goal": "start_company", "parameters": { "proposed_name": "Waypoint Systems", "founder": { "name": "Alex Chen", "email": "alex@example.com", "home_state": "NC" }, "description": "A weekly interview podcast monetised through paid subscribers and one annual sponsor." }, "discovery_input": { "business_kind": "content_subscription", "team_shape": "solo", "funding_intent": "bootstrap", "home_state": "NC" }, "metadata": {}}'const response = await fetch("https://api.mattermode.com/v1/intents", { 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({ "goal": "start_company", "parameters": { "proposed_name": "Waypoint Systems", "founder": { "name": "Alex Chen", "email": "alex@example.com", "home_state": "NC" }, "description": "A weekly interview podcast monetised through paid subscribers and one annual sponsor." }, "discovery_input": { "business_kind": "content_subscription", "team_shape": "solo", "funding_intent": "bootstrap", "home_state": "NC" }, "metadata": {} }),});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": "int_8yKp7mQrT",
"object": "intent",
"goal": "start_company",
"parameters": {
"proposed_name": "Waypoint Systems",
"founder": {
"name": "Alex Chen",
"email": "alex@example.com",
"home_state": "NC"
},
"description": "A weekly interview podcast monetised through paid subscribers and one annual sponsor."
},
"status": "resolved",
"execution_plan": {
"steps": []
},
"entity_id": null,
"cost_estimate": {
"amount": 50000,
"currency": "usd"
},
"completed_at": 0,
"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/validation_failed",
"title": "Validation failed",
"status": 422,
"code": "validation_failed",
"detail": "One or more fields failed validation. See `errors[]`.",
"doc_url": "https://mattermode.com/docs/guides/errors#validation_failed",
"request_id": "req_Qw9xYz8A",
"errors": [
{
"field": "founders[0].equity",
"code": "out_of_range",
"message": "Equity must sum to 100% across all founders."
}
]
}{
"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
}