API · Create · Entities
Initiate bank account opening.
Initiates a bank-account-opening flow on a partner site that requires web-based onboarding (Mercury, Brex, Chase, Ramp). The sub-agent navigates the partner's onboarding, fills the application from entity state, completes KYC, and returns the opened account number on completion.
For most novice founders, you don't need this endpoint. The default createFormationPacket.include_bank_account_application with processor: column provisions the account synchronously via Column's BaaS API — no sub-agent, no founder click-through. Use initiateBankAccountOpening only when the founder has explicitly chosen a non-Column provider that requires web-flow onboarding.
Returns 202 Accepted immediately with a SubAgentSession. The sub-agent runs asynchronously; subscribe to the sub_agent_session.completed and bank_account.opened webhook events for terminal state.
Last updated
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
processorstringRequired"mercury""brex""chase""ramp"responsible_party_stakeholder_idstringOptionalResponse 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}/bank_accounts/initiate_opening" \ -H "Content-Type: application/json" \ -d '{ "processor": "mercury" }'const body = JSON.stringify({ "processor": "mercury"})fetch("https://api.mattermode.com/v1/entities/{id}/bank_accounts/initiate_opening", { 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}/bank_accounts/initiate_opening" body := strings.NewReader(`{ "processor": "mercury" }`) 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 = { "processor": "mercury"}resp = requests.post( "https://api.mattermode.com/v1/entities/ent_Nq3KcAbc/bank_accounts/initiate_opening", 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("""{ "processor": "mercury"}""");HttpClient client = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build();HttpRequest.Builder requestBuilder = HttpRequest.newBuilder() .uri(URI.create("https://api.mattermode.com/v1/entities/{id}/bank_accounts/initiate_opening")) .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("""{ "processor": "mercury"}""", Encoding.UTF8, "application/json");var client = new HttpClient();var response = await client.PostAsync("https://api.mattermode.com/v1/entities/{id}/bank_accounts/initiate_opening", body);var responseBody = await response.Content.ReadAsStringAsync();curl --request POST 'https://api.mattermode.com/v1/entities/ent_Nq3KcAbc/bank_accounts/initiate_opening' \ --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 '{ "processor": "mercury"}'const response = await fetch("https://api.mattermode.com/v1/entities/ent_Nq3KcAbc/bank_accounts/initiate_opening", { 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({ "processor": "mercury" }),});if (!response.ok) { throw new Error(`Matter API ${response.status}: ${await response.text()}`);}const data = await response.json();console.log(data);Response
application/json{
"sub_agent_session": {
"id": "string",
"object": "sub_agent_session",
"status": "pending",
"target_resource": {
"kind": "filing",
"id": "string"
},
"agent_kind": "de_sos_filer",
"target_url": "http://example.com",
"created_at": "2019-08-24T14:15:22Z",
"started_at": "2019-08-24T14:15:22Z",
"completed_at": "2019-08-24T14:15:22Z",
"outcome": {
"confirmation_number": "string",
"receipt_document_id": "string",
"error_kind": "string",
"error_detail": "string"
},
"actions_taken": [
{
"at": "2019-08-24T14:15:22Z",
"step": "string",
"detail": "string"
}
],
"livemode": true
},
"bank_account_id": "string"
}{
"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/invalid_state_transition",
"title": "Invalid state transition",
"status": 409,
"code": "invalid_state_transition",
"detail": "Entity ent_Nq3KcAbc is in state `dissolved`; `dissolve` is not a valid transition.",
"doc_url": "https://mattermode.com/docs/guides/errors#invalid_state_transition",
"request_id": "req_Qw9xYz8A",
"current_state": "dissolved",
"attempted_transition": "dissolve",
"allowed_transitions": []
}{
"type": "https://mattermode.com/docs/errors/dissolution_prerequisites_missing",
"title": "Dissolution prerequisites missing",
"status": 409,
"code": "dissolution_prerequisites_missing",
"detail": "Voluntary dissolution requires `board_resolution_id` and `stockholder_consent_id`, or `auto_generate_resolutions: true`.",
"doc_url": "https://mattermode.com/docs/guides/errors#dissolution_prerequisites_missing",
"request_id": "req_Qw9xYz8A"
}{
"type": "https://mattermode.com/docs/errors/valuation_stale",
"title": "409A valuation stale",
"status": 409,
"code": "valuation_stale",
"detail": "Active 409A val_AbCd1234 is older than 12 months or superseded by a material event. Issuing ISOs at the prior strike risks IRC §409A violation. Refresh via POST /entities/{id}/valuations/{id}/refresh_request.",
"doc_url": "https://mattermode.com/docs/guides/errors#valuation_stale",
"request_id": "req_Qw9xYz8A"
}{
"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
}