curl --request POST \
--url https://sandbox.layerfi.com/v1/reports/bookkeeping/exports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"use_derived_status": false,
"require_onboarding_call": true
}
'import requests
url = "https://sandbox.layerfi.com/v1/reports/bookkeeping/exports"
payload = {
"use_derived_status": False,
"require_onboarding_call": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({use_derived_status: false, require_onboarding_call: true})
};
fetch('https://sandbox.layerfi.com/v1/reports/bookkeeping/exports', 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://sandbox.layerfi.com/v1/reports/bookkeeping/exports",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'use_derived_status' => false,
'require_onboarding_call' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.layerfi.com/v1/reports/bookkeeping/exports"
payload := strings.NewReader("{\n \"use_derived_status\": false,\n \"require_onboarding_call\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.layerfi.com/v1/reports/bookkeeping/exports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"use_derived_status\": false,\n \"require_onboarding_call\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.layerfi.com/v1/reports/bookkeeping/exports")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"use_derived_status\": false,\n \"require_onboarding_call\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"type": "Export",
"id": "00000000-0000-0000-0000-000000000006",
"business_id": null,
"export_type": "bookkeeping_status_report",
"status": "pending",
"params": {
"use_derived_status": false,
"require_onboarding_call": true
},
"download_url": null,
"file_name": null,
"error": null,
"created_at": "2026-08-04T14:00:00-04:00",
"started_at": null,
"completed_at": null,
"failed_at": null
}
}Create bookkeeping status report export
Starts an async XLSX export of bookkeeping status for the authenticated clientβs enrolled businesses. The workbook contains Businesses and Periods sheets. Returns an export resource; poll GET /v1/exports/ or subscribe to export.completed / export.failed webhooks for completion.
curl --request POST \
--url https://sandbox.layerfi.com/v1/reports/bookkeeping/exports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"use_derived_status": false,
"require_onboarding_call": true
}
'import requests
url = "https://sandbox.layerfi.com/v1/reports/bookkeeping/exports"
payload = {
"use_derived_status": False,
"require_onboarding_call": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({use_derived_status: false, require_onboarding_call: true})
};
fetch('https://sandbox.layerfi.com/v1/reports/bookkeeping/exports', 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://sandbox.layerfi.com/v1/reports/bookkeeping/exports",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'use_derived_status' => false,
'require_onboarding_call' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.layerfi.com/v1/reports/bookkeeping/exports"
payload := strings.NewReader("{\n \"use_derived_status\": false,\n \"require_onboarding_call\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.layerfi.com/v1/reports/bookkeeping/exports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"use_derived_status\": false,\n \"require_onboarding_call\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.layerfi.com/v1/reports/bookkeeping/exports")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"use_derived_status\": false,\n \"require_onboarding_call\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"type": "Export",
"id": "00000000-0000-0000-0000-000000000006",
"business_id": null,
"export_type": "bookkeeping_status_report",
"status": "pending",
"params": {
"use_derived_status": false,
"require_onboarding_call": true
},
"download_url": null,
"file_name": null,
"error": null,
"created_at": "2026-08-04T14:00:00-04:00",
"started_at": null,
"completed_at": null,
"failed_at": null
}
}Businesses sheet with enrollment, onboarding, pending task, and latest closed period information, and a Periods sheet with period statuses, billing statuses, task metrics, and closing milestones.
Poll Fetch export or subscribe to export.completed / export.failed webhooks to retrieve the completed file. See Generating async reports.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Options for the client-wide bookkeeping status XLSX export. Send an empty object to use both defaults.
When true, calculate period statuses from current bookkeeping facts rather than using stored statuses.
When deriving statuses, require the onboarding date to have passed before reporting an actionable period status. Has no effect unless use_derived_status is true.
Response
Export request accepted and generation started.
An async export request and its current status.
Show child attributes
Show child attributes