Create P&L comparisons
curl --request POST \
--url https://sandbox.layerfi.com/v1/businesses/{businessId}/reports/profit-and-loss-comparison \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"periods": {
"type": "Comparison_Months",
"months": [
{
"year": 2024,
"month": 12
}
]
},
"tag_filters": [
{
"required_tags": [
{
"key": "department",
"value": "sales",
"dimension_display_name": "Department",
"value_display_name": "Sales Department"
}
]
}
]
}
'import requests
url = "https://sandbox.layerfi.com/v1/businesses/{businessId}/reports/profit-and-loss-comparison"
payload = {
"periods": {
"type": "Comparison_Months",
"months": [
{
"year": 2024,
"month": 12
}
]
},
"tag_filters": [{ "required_tags": [
{
"key": "department",
"value": "sales",
"dimension_display_name": "Department",
"value_display_name": "Sales Department"
}
] }]
}
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({
periods: {type: 'Comparison_Months', months: [{year: 2024, month: 12}]},
tag_filters: [
{
required_tags: [
{
key: 'department',
value: 'sales',
dimension_display_name: 'Department',
value_display_name: 'Sales Department'
}
]
}
]
})
};
fetch('https://sandbox.layerfi.com/v1/businesses/{businessId}/reports/profit-and-loss-comparison', 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/businesses/{businessId}/reports/profit-and-loss-comparison",
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([
'periods' => [
'type' => 'Comparison_Months',
'months' => [
[
'year' => 2024,
'month' => 12
]
]
],
'tag_filters' => [
[
'required_tags' => [
[
'key' => 'department',
'value' => 'sales',
'dimension_display_name' => 'Department',
'value_display_name' => 'Sales Department'
]
]
]
]
]),
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/businesses/{businessId}/reports/profit-and-loss-comparison"
payload := strings.NewReader("{\n \"periods\": {\n \"type\": \"Comparison_Months\",\n \"months\": [\n {\n \"year\": 2024,\n \"month\": 12\n }\n ]\n },\n \"tag_filters\": [\n {\n \"required_tags\": [\n {\n \"key\": \"department\",\n \"value\": \"sales\",\n \"dimension_display_name\": \"Department\",\n \"value_display_name\": \"Sales Department\"\n }\n ]\n }\n ]\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/businesses/{businessId}/reports/profit-and-loss-comparison")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"periods\": {\n \"type\": \"Comparison_Months\",\n \"months\": [\n {\n \"year\": 2024,\n \"month\": 12\n }\n ]\n },\n \"tag_filters\": [\n {\n \"required_tags\": [\n {\n \"key\": \"department\",\n \"value\": \"sales\",\n \"dimension_display_name\": \"Department\",\n \"value_display_name\": \"Sales Department\"\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.layerfi.com/v1/businesses/{businessId}/reports/profit-and-loss-comparison")
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 \"periods\": {\n \"type\": \"Comparison_Months\",\n \"months\": [\n {\n \"year\": 2024,\n \"month\": 12\n }\n ]\n },\n \"tag_filters\": [\n {\n \"required_tags\": [\n {\n \"key\": \"department\",\n \"value\": \"sales\",\n \"dimension_display_name\": \"Department\",\n \"value_display_name\": \"Sales Department\"\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body[
{
"pnls": [
{
"period": {
"type": "Comparison_Months",
"months": [
{
"year": 2024,
"month": 12
}
]
},
"tag_filter": {
"key": "<string>",
"value": [
"<string>"
]
},
"pnl": {
"business_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"start_date": "2023-11-07T05:31:56Z",
"end_date": "2023-11-07T05:31:56Z",
"income": {
"name": "<string>",
"display_name": "<string>",
"value": 123,
"is_contra": true,
"line_items": "<array>"
},
"cost_of_goods_sold": {
"name": "<string>",
"display_name": "<string>",
"value": 123,
"is_contra": true,
"line_items": "<array>"
},
"gross_profit": 123,
"expenses": {
"name": "<string>",
"display_name": "<string>",
"value": 123,
"is_contra": true,
"line_items": "<array>"
},
"profit_before_taxes": 123,
"taxes": {
"name": "<string>",
"display_name": "<string>",
"value": 123,
"is_contra": true,
"line_items": "<array>"
},
"net_profit": 123,
"other_outflows": {
"name": "<string>",
"display_name": "<string>",
"value": 123,
"is_contra": true,
"line_items": "<array>"
},
"personal_expenses": {
"name": "<string>",
"display_name": "<string>",
"value": 123,
"is_contra": true,
"line_items": "<array>"
},
"fully_categorized": true
}
}
]
}
]""""Profit and Loss
Create P&L comparisons
Compare Profit & Loss views across time periods and/or tags. This endpoint allows specifying multiple time periods (specified in months, years, or custom date ranges) and tags and will generate a comparison for every combination. Note that this endpoint is retrieval only, but uses a POST HTTP verb rather than GET because of the complexity of the parameters.
POST
/
v1
/
businesses
/
{businessId}
/
reports
/
profit-and-loss-comparison
Create P&L comparisons
curl --request POST \
--url https://sandbox.layerfi.com/v1/businesses/{businessId}/reports/profit-and-loss-comparison \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"periods": {
"type": "Comparison_Months",
"months": [
{
"year": 2024,
"month": 12
}
]
},
"tag_filters": [
{
"required_tags": [
{
"key": "department",
"value": "sales",
"dimension_display_name": "Department",
"value_display_name": "Sales Department"
}
]
}
]
}
'import requests
url = "https://sandbox.layerfi.com/v1/businesses/{businessId}/reports/profit-and-loss-comparison"
payload = {
"periods": {
"type": "Comparison_Months",
"months": [
{
"year": 2024,
"month": 12
}
]
},
"tag_filters": [{ "required_tags": [
{
"key": "department",
"value": "sales",
"dimension_display_name": "Department",
"value_display_name": "Sales Department"
}
] }]
}
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({
periods: {type: 'Comparison_Months', months: [{year: 2024, month: 12}]},
tag_filters: [
{
required_tags: [
{
key: 'department',
value: 'sales',
dimension_display_name: 'Department',
value_display_name: 'Sales Department'
}
]
}
]
})
};
fetch('https://sandbox.layerfi.com/v1/businesses/{businessId}/reports/profit-and-loss-comparison', 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/businesses/{businessId}/reports/profit-and-loss-comparison",
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([
'periods' => [
'type' => 'Comparison_Months',
'months' => [
[
'year' => 2024,
'month' => 12
]
]
],
'tag_filters' => [
[
'required_tags' => [
[
'key' => 'department',
'value' => 'sales',
'dimension_display_name' => 'Department',
'value_display_name' => 'Sales Department'
]
]
]
]
]),
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/businesses/{businessId}/reports/profit-and-loss-comparison"
payload := strings.NewReader("{\n \"periods\": {\n \"type\": \"Comparison_Months\",\n \"months\": [\n {\n \"year\": 2024,\n \"month\": 12\n }\n ]\n },\n \"tag_filters\": [\n {\n \"required_tags\": [\n {\n \"key\": \"department\",\n \"value\": \"sales\",\n \"dimension_display_name\": \"Department\",\n \"value_display_name\": \"Sales Department\"\n }\n ]\n }\n ]\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/businesses/{businessId}/reports/profit-and-loss-comparison")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"periods\": {\n \"type\": \"Comparison_Months\",\n \"months\": [\n {\n \"year\": 2024,\n \"month\": 12\n }\n ]\n },\n \"tag_filters\": [\n {\n \"required_tags\": [\n {\n \"key\": \"department\",\n \"value\": \"sales\",\n \"dimension_display_name\": \"Department\",\n \"value_display_name\": \"Sales Department\"\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.layerfi.com/v1/businesses/{businessId}/reports/profit-and-loss-comparison")
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 \"periods\": {\n \"type\": \"Comparison_Months\",\n \"months\": [\n {\n \"year\": 2024,\n \"month\": 12\n }\n ]\n },\n \"tag_filters\": [\n {\n \"required_tags\": [\n {\n \"key\": \"department\",\n \"value\": \"sales\",\n \"dimension_display_name\": \"Department\",\n \"value_display_name\": \"Sales Department\"\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body[
{
"pnls": [
{
"period": {
"type": "Comparison_Months",
"months": [
{
"year": 2024,
"month": 12
}
]
},
"tag_filter": {
"key": "<string>",
"value": [
"<string>"
]
},
"pnl": {
"business_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"start_date": "2023-11-07T05:31:56Z",
"end_date": "2023-11-07T05:31:56Z",
"income": {
"name": "<string>",
"display_name": "<string>",
"value": 123,
"is_contra": true,
"line_items": "<array>"
},
"cost_of_goods_sold": {
"name": "<string>",
"display_name": "<string>",
"value": 123,
"is_contra": true,
"line_items": "<array>"
},
"gross_profit": 123,
"expenses": {
"name": "<string>",
"display_name": "<string>",
"value": 123,
"is_contra": true,
"line_items": "<array>"
},
"profit_before_taxes": 123,
"taxes": {
"name": "<string>",
"display_name": "<string>",
"value": 123,
"is_contra": true,
"line_items": "<array>"
},
"net_profit": 123,
"other_outflows": {
"name": "<string>",
"display_name": "<string>",
"value": 123,
"is_contra": true,
"line_items": "<array>"
},
"personal_expenses": {
"name": "<string>",
"display_name": "<string>",
"value": 123,
"is_contra": true,
"line_items": "<array>"
},
"fully_categorized": true
}
}
]
}
]""""Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Content-Type must be set to application/json
Path Parameters
The UUID of the business to fetch the profit and loss for
Body
application/json
- Option 1
- Option 2
- Option 3
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Available options:
ACCRUAL, CASH Available options:
DEFAULT, TRUCKING, MEDSPA, MEDSPA_NO_LICENSING, CITRUS, CITRUS_NO_LICENSING, FLORIST Response
Show child attributes
Show child attributes
āI