curl --request GET \
--url https://api.test.doola.com/v1/partner/companies/{companyId}/compliance/annual-reports/{annualReportId} \
--header 'Authorization: <api-key>'import requests
url = "https://api.test.doola.com/v1/partner/companies/{companyId}/compliance/annual-reports/{annualReportId}"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.test.doola.com/v1/partner/companies/{companyId}/compliance/annual-reports/{annualReportId}', 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/companies/{companyId}/compliance/annual-reports/{annualReportId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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/companies/{companyId}/compliance/annual-reports/{annualReportId}"
req, _ := http.NewRequest("GET", 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.get("https://api.test.doola.com/v1/partner/companies/{companyId}/compliance/annual-reports/{annualReportId}")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.test.doola.com/v1/partner/companies/{companyId}/compliance/annual-reports/{annualReportId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"annualReportId": "2Ns8vJqZ1lQwErTyUiOpAsDfGhJ",
"doolaCompanyId": "2Ns8vJqZ1lQwErTyUiOpAsDfGhJ",
"fiscalYear": 2026,
"state": "WY",
"entityType": "LLC",
"status": "FILLED",
"priceInCents": 6225,
"submittedAt": "2026-03-01",
"createdAt": "2026-02-01T09:00:00Z",
"updatedAt": "2026-02-02T09:00:00Z",
"answers": [
{
"fieldId": "Q17",
"value": "1000000"
}
]
}Get one annual report
One of the company’s annual reports with the answers on record for it. Read-only. A report that does not exist, belongs to another company, or is in a state this API does not publish are all 404: telling them apart would confirm that an id the caller may not read is nonetheless real.
curl --request GET \
--url https://api.test.doola.com/v1/partner/companies/{companyId}/compliance/annual-reports/{annualReportId} \
--header 'Authorization: <api-key>'import requests
url = "https://api.test.doola.com/v1/partner/companies/{companyId}/compliance/annual-reports/{annualReportId}"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.test.doola.com/v1/partner/companies/{companyId}/compliance/annual-reports/{annualReportId}', 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/companies/{companyId}/compliance/annual-reports/{annualReportId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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/companies/{companyId}/compliance/annual-reports/{annualReportId}"
req, _ := http.NewRequest("GET", 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.get("https://api.test.doola.com/v1/partner/companies/{companyId}/compliance/annual-reports/{annualReportId}")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.test.doola.com/v1/partner/companies/{companyId}/compliance/annual-reports/{annualReportId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"annualReportId": "2Ns8vJqZ1lQwErTyUiOpAsDfGhJ",
"doolaCompanyId": "2Ns8vJqZ1lQwErTyUiOpAsDfGhJ",
"fiscalYear": 2026,
"state": "WY",
"entityType": "LLC",
"status": "FILLED",
"priceInCents": 6225,
"submittedAt": "2026-03-01",
"createdAt": "2026-02-01T09:00:00Z",
"updatedAt": "2026-02-02T09:00:00Z",
"answers": [
{
"fieldId": "Q17",
"value": "1000000"
}
]
}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).
Annual report ID (KSUID).
Response
The report and the answers on record for it.
One annual report and the answers on record for it.
Annual report ID (KSUID), as the submission returned it and as confirm addresses it.
"2Ns8vJqZ1lQwErTyUiOpAsDfGhJ"
doola company ID (KSUID).
"2Ns8vJqZ1lQwErTyUiOpAsDfGhJ"
Fiscal year the report covers.
2026
US state the report is filed in.
"WY"
Entity type the report was filed for.
LLC, CCorp "LLC"
Where the report stands. Same vocabulary as the list.
FILLED, IN_PROGRESS, AWAITING_INFORMATION, FILING_COMPLETED "FILLED"
The state fee fixed on the report in whole US cents, which doola settles with you outside this API. Null while doola has not priced it.
6225
Date the report was handed to doola's filing pipeline (yyyy-MM-dd). Often null even for a filed report; read status for where the report stands.
"2026-03-01"
When the report was first recorded. Null if the row carries no timestamp.
"2026-02-01T09:00:00Z"
When the report last changed. Null if the row carries no timestamp.
"2026-02-02T09:00:00Z"
The answers on record, addressed by the field ids the requirements published. Empty for a state that asks no questions, which is most of them.
Show child attributes
Show child attributes