curl --request POST \
--url https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit \
--header 'x-api-key: <api-key>'import requests
url = "https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit"
headers = {"x-api-key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"incorporation": {
"id": "0f9a8f5e-7f7c-4c1b-a60a-b1022f9d8c91",
"customerId": 77,
"country": "SG",
"countryOptions": {
"corporationType": "PRIVATE_LIMITED_COMPANY"
},
"createdAt": "2026-04-21T17:10:00.000Z",
"updatedAt": "2026-04-21T17:10:00.000Z",
"businessEntityId": 44
},
"incorporationValidation": {
"isComplete": false,
"missingRequirements": [
{
"code": "PARTICIPANT_DOCUMENT_REQUIRED",
"path": "participants.participant_123.documents.PASSPORT_SCAN",
"message": "Participant participant_123 requires a PASSPORT_SCAN document",
"participantId": "participant_123",
"displayName": "Jane Founder"
}
],
"invalidRequirements": [
{
"code": "PARTICIPANT_DOCUMENT_REQUIRED",
"path": "participants.participant_123.documents.PASSPORT_SCAN",
"message": "Participant participant_123 requires a PASSPORT_SCAN document",
"participantId": "participant_123",
"displayName": "Jane Founder"
}
]
},
"intakeState": {
"id": "state_123",
"incorporationId": "0f9a8f5e-7f7c-4c1b-a60a-b1022f9d8c91",
"currentState": {
"companyNameOptions": [
{
"name": "Acme SG Pte Ltd"
},
{
"name": "Acme Asia Pte Ltd"
},
{
"name": "Acme Global Pte Ltd"
}
],
"registeredOfficeAddressSource": "commendaService"
},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
},
"participants": [
{
"id": "participant_123",
"participantType": "INDIVIDUAL",
"resource": {
"resourceType": "KEY_PERSON",
"resourceId": 12
},
"roles": [
{
"role": "DIRECTOR"
},
{
"role": "SHAREHOLDER",
"ownershipPercentage": 100
}
],
"documents": [
{
"documentId": "document_123",
"participantId": "participant_123",
"documentKind": "PASSPORT_SCAN",
"fileId": 456,
"status": "SUBMITTED"
},
{
"documentId": "document_124",
"participantId": "participant_123",
"documentKind": "UTILITY_BILL",
"fileId": 789,
"status": "SUBMITTED"
}
]
}
],
"requirements": {
"schemaVersion": "2026-04-22",
"dslVersion": "mvp-2026-04-22",
"key": "sg.private_limited_company",
"country": "SG",
"countryOptions": {
"corporationType": "PRIVATE_LIMITED_COMPANY"
},
"name": "Singapore Private Limited Company Incorporation Requirements",
"blocks": [
{
"key": "companyNames",
"name": "Company name options"
}
],
"participantRequirements": [
{
"key": "directors",
"name": "Directors",
"role": "DIRECTOR",
"allowedParticipantTypes": [
"INDIVIDUAL"
],
"allowedResourceTypes": [
"KEY_PERSON"
],
"resourceFieldsByParticipantType": {
"INDIVIDUAL": [
{
"kind": "resource",
"key": "residentialAddress",
"name": "Residential address",
"description": "The key person's current residential address. Store this on the Commenda OS person as residentialAddress.",
"required": true,
"resourceKind": "address",
"commendaOs": {
"entity": "keyPerson",
"field": "residentialAddress"
},
"fields": [
{
"kind": "scalar",
"key": "addressLine1",
"name": "Address line 1",
"required": true,
"commendaOs": {
"entity": "keyPerson",
"field": "residentialAddress.addressLine1"
}
},
{
"kind": "scalar",
"key": "city",
"name": "City",
"required": true,
"commendaOs": {
"entity": "keyPerson",
"field": "residentialAddress.city"
}
},
{
"kind": "scalar",
"key": "country",
"name": "Country",
"required": true,
"commendaOs": {
"entity": "keyPerson",
"field": "residentialAddress.country"
}
}
]
}
]
},
"documentRequirements": [
{
"documentKind": "PASSPORT_SCAN",
"name": "Passport scan"
},
{
"documentKind": "UTILITY_BILL",
"name": "Utility bill"
}
]
}
]
}
}{
"statusCode": 400,
"message": "Incorporation intake is incomplete and cannot be submitted for review",
"error": "Bad Request",
"incorporationValidation": {
"isComplete": false,
"missingRequirements": [
{
"code": "PARTICIPANT_DOCUMENT_REQUIRED",
"path": "participants.participant_123.documents.PASSPORT_SCAN",
"message": "Participant participant_123 requires a PASSPORT_SCAN document",
"participantId": "participant_123",
"displayName": "Jane Founder"
}
],
"invalidRequirements": [
{
"code": "PARTICIPANT_DOCUMENT_REQUIRED",
"path": "participants.participant_123.documents.PASSPORT_SCAN",
"message": "Participant participant_123 requires a PASSPORT_SCAN document",
"participantId": "participant_123",
"displayName": "Jane Founder"
}
]
}
}{
"statusCode": 403,
"message": "Company does not belong to this affiliate firm",
"error": "Forbidden"
}{
"statusCode": 403,
"message": "Company does not belong to this affiliate firm",
"error": "Forbidden"
}{
"statusCode": 403,
"message": "Company does not belong to this affiliate firm",
"error": "Forbidden"
}Submit an incorporation
Submit a currently complete incorporation for Commenda review. The server refreshes validation before accepting the submit request. incorporationValidation.isComplete means eligible to submit; SUBMITTED or IN_PROGRESS is returned only after this endpoint succeeds.
curl --request POST \
--url https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit \
--header 'x-api-key: <api-key>'import requests
url = "https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit"
headers = {"x-api-key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.prod.commenda.io/api/v1/partner/incorporation/{incorporationId}/submit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"incorporation": {
"id": "0f9a8f5e-7f7c-4c1b-a60a-b1022f9d8c91",
"customerId": 77,
"country": "SG",
"countryOptions": {
"corporationType": "PRIVATE_LIMITED_COMPANY"
},
"createdAt": "2026-04-21T17:10:00.000Z",
"updatedAt": "2026-04-21T17:10:00.000Z",
"businessEntityId": 44
},
"incorporationValidation": {
"isComplete": false,
"missingRequirements": [
{
"code": "PARTICIPANT_DOCUMENT_REQUIRED",
"path": "participants.participant_123.documents.PASSPORT_SCAN",
"message": "Participant participant_123 requires a PASSPORT_SCAN document",
"participantId": "participant_123",
"displayName": "Jane Founder"
}
],
"invalidRequirements": [
{
"code": "PARTICIPANT_DOCUMENT_REQUIRED",
"path": "participants.participant_123.documents.PASSPORT_SCAN",
"message": "Participant participant_123 requires a PASSPORT_SCAN document",
"participantId": "participant_123",
"displayName": "Jane Founder"
}
]
},
"intakeState": {
"id": "state_123",
"incorporationId": "0f9a8f5e-7f7c-4c1b-a60a-b1022f9d8c91",
"currentState": {
"companyNameOptions": [
{
"name": "Acme SG Pte Ltd"
},
{
"name": "Acme Asia Pte Ltd"
},
{
"name": "Acme Global Pte Ltd"
}
],
"registeredOfficeAddressSource": "commendaService"
},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
},
"participants": [
{
"id": "participant_123",
"participantType": "INDIVIDUAL",
"resource": {
"resourceType": "KEY_PERSON",
"resourceId": 12
},
"roles": [
{
"role": "DIRECTOR"
},
{
"role": "SHAREHOLDER",
"ownershipPercentage": 100
}
],
"documents": [
{
"documentId": "document_123",
"participantId": "participant_123",
"documentKind": "PASSPORT_SCAN",
"fileId": 456,
"status": "SUBMITTED"
},
{
"documentId": "document_124",
"participantId": "participant_123",
"documentKind": "UTILITY_BILL",
"fileId": 789,
"status": "SUBMITTED"
}
]
}
],
"requirements": {
"schemaVersion": "2026-04-22",
"dslVersion": "mvp-2026-04-22",
"key": "sg.private_limited_company",
"country": "SG",
"countryOptions": {
"corporationType": "PRIVATE_LIMITED_COMPANY"
},
"name": "Singapore Private Limited Company Incorporation Requirements",
"blocks": [
{
"key": "companyNames",
"name": "Company name options"
}
],
"participantRequirements": [
{
"key": "directors",
"name": "Directors",
"role": "DIRECTOR",
"allowedParticipantTypes": [
"INDIVIDUAL"
],
"allowedResourceTypes": [
"KEY_PERSON"
],
"resourceFieldsByParticipantType": {
"INDIVIDUAL": [
{
"kind": "resource",
"key": "residentialAddress",
"name": "Residential address",
"description": "The key person's current residential address. Store this on the Commenda OS person as residentialAddress.",
"required": true,
"resourceKind": "address",
"commendaOs": {
"entity": "keyPerson",
"field": "residentialAddress"
},
"fields": [
{
"kind": "scalar",
"key": "addressLine1",
"name": "Address line 1",
"required": true,
"commendaOs": {
"entity": "keyPerson",
"field": "residentialAddress.addressLine1"
}
},
{
"kind": "scalar",
"key": "city",
"name": "City",
"required": true,
"commendaOs": {
"entity": "keyPerson",
"field": "residentialAddress.city"
}
},
{
"kind": "scalar",
"key": "country",
"name": "Country",
"required": true,
"commendaOs": {
"entity": "keyPerson",
"field": "residentialAddress.country"
}
}
]
}
]
},
"documentRequirements": [
{
"documentKind": "PASSPORT_SCAN",
"name": "Passport scan"
},
{
"documentKind": "UTILITY_BILL",
"name": "Utility bill"
}
]
}
]
}
}{
"statusCode": 400,
"message": "Incorporation intake is incomplete and cannot be submitted for review",
"error": "Bad Request",
"incorporationValidation": {
"isComplete": false,
"missingRequirements": [
{
"code": "PARTICIPANT_DOCUMENT_REQUIRED",
"path": "participants.participant_123.documents.PASSPORT_SCAN",
"message": "Participant participant_123 requires a PASSPORT_SCAN document",
"participantId": "participant_123",
"displayName": "Jane Founder"
}
],
"invalidRequirements": [
{
"code": "PARTICIPANT_DOCUMENT_REQUIRED",
"path": "participants.participant_123.documents.PASSPORT_SCAN",
"message": "Participant participant_123 requires a PASSPORT_SCAN document",
"participantId": "participant_123",
"displayName": "Jane Founder"
}
]
}
}{
"statusCode": 403,
"message": "Company does not belong to this affiliate firm",
"error": "Forbidden"
}{
"statusCode": 403,
"message": "Company does not belong to this affiliate firm",
"error": "Forbidden"
}{
"statusCode": 403,
"message": "Company does not belong to this affiliate firm",
"error": "Forbidden"
}incorporationValidation.isComplete means the incorporation is eligible to submit; it does not move to SUBMITTED or IN_PROGRESS until you call this endpoint.
This endpoint refreshes validation before accepting the submit request. If required intake fields, participants, ownership totals, or participant documents are still missing or invalid, the request returns 400 and the response includes validation details.
Submit is idempotent for an already-submitted, still-complete incorporation. Retrying submit returns the current incorporation resource instead of starting a second review.
Incomplete submit response
{
"statusCode": 400,
"message": "Incorporation intake is incomplete and cannot be submitted for review",
"error": "Bad Request",
"incorporationValidation": {
"isComplete": false,
"missingRequirements": [
{
"code": "PARTICIPANT_REQUIRED",
"path": "participants.directors",
"message": "At least one director is required"
}
],
"invalidRequirements": []
}
}
Lifecycle effect
AWAITING_CUSTOMER_INPUT
-> SUBMITTED after POST /submit succeeds and before Commenda review work starts
-> IN_PROGRESS when Commenda review is in progress
-> BLOCKED when there are active partner-visible issues or review start/runtime failures
-> COMPLETED when the incorporation is complete
Authorizations
Path Parameters
Incorporation identifier returned by create or list endpoints.
Response
Incorporation submitted for review
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Current intake state for the incorporation. Always returned; an empty intake state is initialized automatically when one does not yet exist.
Show child attributes
Show child attributes
Participants registered to this incorporation, when requested or available.
Show child attributes
Show child attributes
Requirements schema for the selected incorporation. Clients can use this to render their own intake UI, but intake updates are always validated against the current server-side incorporation requirements.
{
"schemaVersion": "2026-04-22",
"dslVersion": "mvp-2026-04-22",
"key": "sg.private_limited_company",
"country": "SG",
"countryOptions": {
"corporationType": "PRIVATE_LIMITED_COMPANY"
},
"name": "Singapore Private Limited Company Incorporation Requirements",
"blocks": [
{
"key": "companyNames",
"name": "Company name options"
}
],
"participantRequirements": [
{
"key": "directors",
"name": "Directors",
"role": "DIRECTOR",
"allowedParticipantTypes": ["INDIVIDUAL"],
"allowedResourceTypes": ["KEY_PERSON"],
"resourceFieldsByParticipantType": {
"INDIVIDUAL": [
{
"kind": "resource",
"key": "residentialAddress",
"name": "Residential address",
"description": "The key person's current residential address. Store this on the Commenda OS person as residentialAddress.",
"required": true,
"resourceKind": "address",
"commendaOs": {
"entity": "keyPerson",
"field": "residentialAddress"
},
"fields": [
{
"kind": "scalar",
"key": "addressLine1",
"name": "Address line 1",
"required": true,
"commendaOs": {
"entity": "keyPerson",
"field": "residentialAddress.addressLine1"
}
},
{
"kind": "scalar",
"key": "city",
"name": "City",
"required": true,
"commendaOs": {
"entity": "keyPerson",
"field": "residentialAddress.city"
}
},
{
"kind": "scalar",
"key": "country",
"name": "Country",
"required": true,
"commendaOs": {
"entity": "keyPerson",
"field": "residentialAddress.country"
}
}
]
}
]
},
"documentRequirements": [
{
"documentKind": "PASSPORT_SCAN",
"name": "Passport scan"
},
{
"documentKind": "UTILITY_BILL",
"name": "Utility bill"
}
]
}
]
}
Was this page helpful?