curl --request POST \
--url https://api.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete \
--header 'Authorization: <api-key>'import requests
url = "https://api.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete"
headers = {"Authorization": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: '<api-key>'}};
fetch('https://api.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete', 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.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: <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.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "<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.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"doolaCompanyId": "<string>",
"service": "Formation",
"triggeredEvents": [
"company_formation_completed",
"document_aoo_uploaded"
]
}Complete Formation (sandbox)
Simulates the State confirming formation: records the filing date, adds a test admin note, and uploads the Articles of Organization. Fires company_formation_completed and document_aoo_uploaded, and advances the Formation service to Completed. Processing the Articles also generates the entity type’s governance document shortly after — Corporate Bylaws for a CCorp (firing document_corporatebylaws_uploaded) or the Operating Agreement for an LLC (firing document_operatingagreement_uploaded) — as in production. Sandbox only.
curl --request POST \
--url https://api.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete \
--header 'Authorization: <api-key>'import requests
url = "https://api.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete"
headers = {"Authorization": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: '<api-key>'}};
fetch('https://api.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete', 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.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: <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.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "<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.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.test.doola.com/v1/partner/playground/companies/{companyId}/formation/complete")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"doolaCompanyId": "<string>",
"service": "Formation",
"triggeredEvents": [
"company_formation_completed",
"document_aoo_uploaded"
]
}Authorizations
Partner API key. Send the raw key as the Authorization header value — e.g. dk_test_… in sandbox or dk_live_… in production. Generate and rotate keys in the doola Partner Portal.
Path Parameters
doola company ID (KSUID).
Response
Milestone completed. The listed webhook events fire asynchronously through the normal delivery pipeline.
Acknowledges a playground milestone. Webhook delivery is asynchronous: triggeredEvents lists the events this call caused to fire, not a delivery confirmation.
doola company ID (KSUID).
The company service the milestone advanced.
Formation, EinCreation "Formation"
Webhook events this call triggered. First-issuance-only events (company_ein_issued) appear only when they actually fired, so repeat calls omit them.
[
"company_formation_completed",
"document_aoo_uploaded"
]