Retrieve income statement
Returns the income statement (profit & loss) for the given date range. Defaults to the current quarter.
The full statement is always returned. You cannot filter to a single category. Revenue minus expenses equals net income; returning a slice would break that math.
Returns one period per request. For monthly breakdowns, make separate calls for each month.
Sign convention: income/revenue amounts are positive, expense amounts are negative. Summing all section totals gives net income.
curl --request GET \
--url https://app.finta.com/api/v1/reports/income_statement \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.finta.com/api/v1/reports/income_statement"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.finta.com/api/v1/reports/income_statement', 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://app.finta.com/api/v1/reports/income_statement",
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: Bearer <token>"
],
]);
$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://app.finta.com/api/v1/reports/income_statement"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.finta.com/api/v1/reports/income_statement")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.finta.com/api/v1/reports/income_statement")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "income_statement",
"start_date": "2026-02-01",
"end_date": "2026-02-28",
"currency": "USD",
"uncategorized_income": {
"total_cents": 0,
"categories": []
},
"revenue": {
"total_cents": 8500000,
"categories": [
{
"category_id": "cat_r1a2b3c4d5e6f7",
"name": "Subscription Revenue",
"amount_cents": 7200000,
"position": 1,
"parent_category_id": null
},
{
"category_id": "cat_s2b3c4d5e6f7g8",
"name": "One-Time Revenue",
"amount_cents": 1300000,
"position": 2,
"parent_category_id": null
}
]
},
"expenses": {
"total_cents": -5200000,
"categories": [
{
"category_id": "cat_t3c4d5e6f7g8h9",
"name": "Cost of Revenue",
"amount_cents": -420000,
"position": 1,
"parent_category_id": null
},
{
"category_id": "cat_t4costsvc00001",
"name": "Cost of Services",
"amount_cents": -350000,
"position": 1,
"parent_category_id": "cat_t3c4d5e6f7g8h9"
},
{
"category_id": "cat_t5hosting00001",
"name": "Hosting",
"amount_cents": -70000,
"position": 2,
"parent_category_id": "cat_t3c4d5e6f7g8h9"
},
{
"category_id": "cat_u4d5e6f7g8h9i0",
"name": "People Expenses",
"amount_cents": -3100000,
"position": 2,
"parent_category_id": null
},
{
"category_id": "cat_u5payroll00001",
"name": "Payroll",
"amount_cents": -2800000,
"position": 1,
"parent_category_id": "cat_u4d5e6f7g8h9i0"
},
{
"category_id": "cat_u6contract0001",
"name": "Contractors",
"amount_cents": -300000,
"position": 2,
"parent_category_id": "cat_u4d5e6f7g8h9i0"
},
{
"category_id": "cat_x7g8h9i0j1k2l3",
"name": "Travel & Events",
"amount_cents": -430000,
"position": 3,
"parent_category_id": null
},
{
"category_id": "cat_x8meals000001",
"name": "Meals",
"amount_cents": -180000,
"position": 1,
"parent_category_id": "cat_x7g8h9i0j1k2l3"
},
{
"category_id": "cat_x9flights0001",
"name": "Flights & Hotels",
"amount_cents": -200000,
"position": 2,
"parent_category_id": "cat_x7g8h9i0j1k2l3"
},
{
"category_id": "cat_x0activit0001",
"name": "Activities",
"amount_cents": -50000,
"position": 3,
"parent_category_id": "cat_x7g8h9i0j1k2l3"
},
{
"category_id": "cat_v5e6f7g8h9i0j1",
"name": "Software",
"amount_cents": -680000,
"position": 4,
"parent_category_id": null
},
{
"category_id": "cat_z9i0j1k2l3m4n5",
"name": "Admin",
"amount_cents": -555000,
"position": 5,
"parent_category_id": null
},
{
"category_id": "cat_z0bankfee0001",
"name": "Banking Fees",
"amount_cents": -200000,
"position": 1,
"parent_category_id": "cat_z9i0j1k2l3m4n5"
},
{
"category_id": "cat_z1training001",
"name": "Training",
"amount_cents": -180000,
"position": 2,
"parent_category_id": "cat_z9i0j1k2l3m4n5"
},
{
"category_id": "cat_z2members0001",
"name": "Memberships",
"amount_cents": -175000,
"position": 3,
"parent_category_id": "cat_z9i0j1k2l3m4n5"
},
{
"category_id": "cat_a0j1k2l3m4n5o6",
"name": "Depreciation & Amortization",
"amount_cents": -15000,
"position": 6,
"parent_category_id": null
},
{
"category_id": "cat_a1amortiz0001",
"name": "Amortization Expense",
"amount_cents": -15000,
"position": 1,
"parent_category_id": "cat_a0j1k2l3m4n5o6"
}
]
},
"uncategorized_expenses": {
"total_cents": 0,
"categories": []
},
"operating_income_cents": 3300000,
"non_operating_income": {
"total_cents": 25000,
"categories": [
{
"category_id": "cat_b1k2l3m4n5o6p7",
"name": "Interest Income",
"amount_cents": 25000,
"position": 1,
"parent_category_id": null
}
]
},
"taxes": {
"total_cents": 0,
"categories": []
},
"net_income_cents": 3325000
}Authorizations
API key prefixed with finta_
Query Parameters
Start of the reporting period (YYYY-MM-DD). Defaults to beginning of current quarter.
End of the reporting period (YYYY-MM-DD). Defaults to today.
Response
The income statement
income_statement "2026-01-01"
"2026-03-31"
"USD"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Operating income in cents. Equals revenue.total_cents + uncategorized_income.total_cents + expenses.total_cents + uncategorized_expenses.total_cents (expenses are already negative). Can be negative if the company is unprofitable.
3300000
Non-operating income and expenses (e.g. interest income, gains/losses).
Show child attributes
Show child attributes
Net income in cents for the period. Equals operating_income_cents + non_operating_income.total_cents + taxes.total_cents (taxes are already negative). Can be negative if the company is unprofitable.
3325000
Uncategorized income items. Present when uncategorized income exists.
Show child attributes
Show child attributes
Uncategorized expense items. Present when uncategorized expenses exist.
Show child attributes
Show child attributes
Tax expense. Present when tax data exists.
Show child attributes
Show child attributes
Was this page helpful?
curl --request GET \
--url https://app.finta.com/api/v1/reports/income_statement \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.finta.com/api/v1/reports/income_statement"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.finta.com/api/v1/reports/income_statement', 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://app.finta.com/api/v1/reports/income_statement",
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: Bearer <token>"
],
]);
$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://app.finta.com/api/v1/reports/income_statement"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.finta.com/api/v1/reports/income_statement")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.finta.com/api/v1/reports/income_statement")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"object": "income_statement",
"start_date": "2026-02-01",
"end_date": "2026-02-28",
"currency": "USD",
"uncategorized_income": {
"total_cents": 0,
"categories": []
},
"revenue": {
"total_cents": 8500000,
"categories": [
{
"category_id": "cat_r1a2b3c4d5e6f7",
"name": "Subscription Revenue",
"amount_cents": 7200000,
"position": 1,
"parent_category_id": null
},
{
"category_id": "cat_s2b3c4d5e6f7g8",
"name": "One-Time Revenue",
"amount_cents": 1300000,
"position": 2,
"parent_category_id": null
}
]
},
"expenses": {
"total_cents": -5200000,
"categories": [
{
"category_id": "cat_t3c4d5e6f7g8h9",
"name": "Cost of Revenue",
"amount_cents": -420000,
"position": 1,
"parent_category_id": null
},
{
"category_id": "cat_t4costsvc00001",
"name": "Cost of Services",
"amount_cents": -350000,
"position": 1,
"parent_category_id": "cat_t3c4d5e6f7g8h9"
},
{
"category_id": "cat_t5hosting00001",
"name": "Hosting",
"amount_cents": -70000,
"position": 2,
"parent_category_id": "cat_t3c4d5e6f7g8h9"
},
{
"category_id": "cat_u4d5e6f7g8h9i0",
"name": "People Expenses",
"amount_cents": -3100000,
"position": 2,
"parent_category_id": null
},
{
"category_id": "cat_u5payroll00001",
"name": "Payroll",
"amount_cents": -2800000,
"position": 1,
"parent_category_id": "cat_u4d5e6f7g8h9i0"
},
{
"category_id": "cat_u6contract0001",
"name": "Contractors",
"amount_cents": -300000,
"position": 2,
"parent_category_id": "cat_u4d5e6f7g8h9i0"
},
{
"category_id": "cat_x7g8h9i0j1k2l3",
"name": "Travel & Events",
"amount_cents": -430000,
"position": 3,
"parent_category_id": null
},
{
"category_id": "cat_x8meals000001",
"name": "Meals",
"amount_cents": -180000,
"position": 1,
"parent_category_id": "cat_x7g8h9i0j1k2l3"
},
{
"category_id": "cat_x9flights0001",
"name": "Flights & Hotels",
"amount_cents": -200000,
"position": 2,
"parent_category_id": "cat_x7g8h9i0j1k2l3"
},
{
"category_id": "cat_x0activit0001",
"name": "Activities",
"amount_cents": -50000,
"position": 3,
"parent_category_id": "cat_x7g8h9i0j1k2l3"
},
{
"category_id": "cat_v5e6f7g8h9i0j1",
"name": "Software",
"amount_cents": -680000,
"position": 4,
"parent_category_id": null
},
{
"category_id": "cat_z9i0j1k2l3m4n5",
"name": "Admin",
"amount_cents": -555000,
"position": 5,
"parent_category_id": null
},
{
"category_id": "cat_z0bankfee0001",
"name": "Banking Fees",
"amount_cents": -200000,
"position": 1,
"parent_category_id": "cat_z9i0j1k2l3m4n5"
},
{
"category_id": "cat_z1training001",
"name": "Training",
"amount_cents": -180000,
"position": 2,
"parent_category_id": "cat_z9i0j1k2l3m4n5"
},
{
"category_id": "cat_z2members0001",
"name": "Memberships",
"amount_cents": -175000,
"position": 3,
"parent_category_id": "cat_z9i0j1k2l3m4n5"
},
{
"category_id": "cat_a0j1k2l3m4n5o6",
"name": "Depreciation & Amortization",
"amount_cents": -15000,
"position": 6,
"parent_category_id": null
},
{
"category_id": "cat_a1amortiz0001",
"name": "Amortization Expense",
"amount_cents": -15000,
"position": 1,
"parent_category_id": "cat_a0j1k2l3m4n5o6"
}
]
},
"uncategorized_expenses": {
"total_cents": 0,
"categories": []
},
"operating_income_cents": 3300000,
"non_operating_income": {
"total_cents": 25000,
"categories": [
{
"category_id": "cat_b1k2l3m4n5o6p7",
"name": "Interest Income",
"amount_cents": 25000,
"position": 1,
"parent_category_id": null
}
]
},
"taxes": {
"total_cents": 0,
"categories": []
},
"net_income_cents": 3325000
}