NAV Navigation

Developer's Guide

HTTP cURL / bash Powershell NodeJS C# Go Python Java

Getting started

Create a developer account

Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

Sign up using our developer portal.

Create an App

Creating an App will allow you to gain access to one or more of our API products.

Sign in to your account.

From the products page, click the API product for which you'd like to create an App.

Enter a name for your App, then click Create App.

Manage your Apps

You can view and manage your Apps from your profile page in the developer portal.

Apps that you have created will initially have a Submitted status. Once your App has been Approved by our team, you can use the Client Id and Client Secret that were provisioned for it to access the APIs.

Each of the Apps listed on your profile page are associated with an environment. If you have requested a SANDBOX environment we will provision an App for it on your behalf.

Overview

API Schema

The Strongbox Platform organizes your data using the following conceptual schema.

Strongbox Schema
Environments

When you sign up, a PRODUCTION environment is provisioned for you. If you need a SANDBOX environment for testing and development, please reach out to our support team at support@strongbox.ai.

When you create an App, it is associated with either your PRODUCTION or SANDBOX environment, and only has access to the resources within that environment. Consequently, there are no environment specific URLs. All API requests are restricted to a single environment based on the App that was used during authentication.

The SANDBOX and PRODUCTION environments are functionally equivalent.

Organizations

At its essence, an Organization is just an orgId, which acts as a container for many API resources. Nothing else is required, and you don't need to explicitly create an Organization. Perhaps this is best understood by recognizing that the orgId appears in the URI path for the majority of requests. For example, GET /Organizations/{orgId}/Connections.

Conceptually, each Organization should correspond to an entity in your own system, such as a customer, business, or user. We recommend using the id for that entity as the orgId.

An orgId is represented as a unicode string, and can be any identifier you choose up to 128 characters. However, because it must be present in the URI path for many API requests, we recommend using just these characters:

a-z A-Z 0-9 - . _ ~ ! $ & ' ( ) * + , ; = : @

Connections

A Connection associates an external Dataset with an Organization. Any credentials that are required to access the Dataset are considered to be a part of the Connection.

Related documentation

Financial Records

A Financial Record represents the financial data that was prepared for an Organization as of a specific date [and time]. Each time you import new financials a new Financial Record is created.

Related documentation

Sending requests

URLs

URL Description
https://auth.strongbox.link Provides only those endpoints that are required for Authorization.
https://api.strongbox.link An API Gateway through which the Strongbox Platform services can be reached.

Transport Layer Security

All requests must use the https scheme and TLS 1.2. Any request sent using http will receive a 4xx status code response.

HTTP Methods / REST

Verb Comments
GET Used strictly to retrieve API resources. Idempotent and will never modify server state.
PUT Used to create or replace an API resource at a specific location identified by the URI. Idempotent.
POST Used to [strictly] create an API resource or for other non-idempotent requests.
DELETE Used to remove a resource. Idempotent and typically accompanied by the 204 status code.
PATCH Used for partial modifications of a resource. Typically idempotent.
OPTIONS Used only for CORS.

Authorization Header

An Authorization header is required for all requests. See Authorization.

Content-Type Header & Request Format

The Content-Type header must be present for all requests which include a body parameter. The body of a request should be JSON formatted and use the UTF-8 character encoding unless documented otherwise for an individual HTTP endpoint.

CORS Requests

Cross-origin requests are allowed in order to support interactive API requests from the developer portal as well as client-side widgets. See CORS Response Headers and Authorizing client-side code.

Handling responses

Status Codes

Status Meaning Comments
200 OK The request was processed successfully. The response includes a body payload.
201 Created The requested resource was created.
204 No Content The request was processed successfully. The response does not include a body payload.
400 Bad Request The request was invalid. The response type will always be BadRequest, which should help with troubleshooting the problem.
401 Unauthorized The Authorization header was not present, your access token expired, or insufficent permissions to make the request.
403 Forbidden Access to a specific resource was denied.
404 Not Found The requested resource was not found.
406 Not Acceptable The request included an Accept header, but the endpoint cannot serve the desired content format.
409 Conflict The request failed because the resource was already created or because it would modify the resource in an unsafe way.
415 Unsupported Media Type The request included a body, but the Content-Type header was not set or was set to a non-supported value.
429 Too Many Requests We do not currently rate-limit your API requests, but reserve the right to add reasonable limitations in the future.
500 Internal Server Error An unexpected problem occurred. Please reach out to our support team.
501 Not Implemented The requested API feature is not yet available. See also API Feature support.
503 Service Unavailable The service is currently unavailable. Please reach out to our support team.

Content-Type Header & Response Format

All API endpoints return JSON formatted responses by default, with the Content-Type header value being application/json; charset=utf-8. Consequently, there is no need to explicitly add an Accept header to your requests except to opt-in to an alternative response format as documented for a specific API endpoint.

HSTS

All responses include the Strict-Transport-Security header defined by HSTS.

CORS Response Headers

Header Name Value
Access-Control-Allow-Origin *
Access-Control-Allow-Credentials false
Access-Control-Allow-Headers Accept, Authorization, Content-Type, Origin
Access-Control-Allow-Methods *
Access-Control-Expose-Headers *

Authorization

The Strongbox APIs use OAuth 2.0 to authenticate your App and to authorize your requests.

The process is straight-forward:

  1. Use the Client Id and Client Secret for your App to get an access token. Learn how
  2. Include the access token in your API requests. Learn how
OAuth2

Request an access token

To get an access token, you will need the Client Id and Client Secret that was issued to you when you created an App.

With your Client Id and Client Secret on hand, you can send the request outlined below to get an access token. This request is commonly known as the Client Credentials Grant, and is defined by the OAuth 2.0 Authorization Framework.

Request body

grant_type=client_credentials

Example

POST /v1/token HTTP/1.1
Host: auth.strongbox.link
Authorization: Basic {base64(ClientId + ":" + ClientSecret)}
Content-Type: application/x-www-form-urlencoded
Accept: application/json

grant_type=client_credentials
clientId="YOUR_CLIENT_ID"
clientSecret="YOUR_CLIENT_SECRET"
clientCredentials="${clientId}:${clientSecret}"

curl 'https://auth.strongbox.link/v1/token' \
  -u $clientCredentials \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Accept: application/json' \
  --data-raw 'grant_type=client_credentials'
$ClientId='YOUR_CLIENT_ID'
$ClientSecret='YOUR_CLIENT_SECRET'
$ClientCredentials=[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes("${ClientId}:${ClientSecret}"))
$headers=@{}
$headers.Add("Content-Type", "application/x-www-form-urlencoded")
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Basic $ClientCredentials")
$response = Invoke-WebRequest -Uri 'https://auth.strongbox.link/v1/token' -Method POST -Headers $headers -Body 'grant_type=client_credentials'
const fetch = require('node-fetch');

const clientId = "YOUR_CLIENT_ID";
const clientSecret = "YOUR_CLIENT_SECRET";
const clientCredentials = Buffer.from(clientId + ":" + clientSecret, 'utf-8').toString('base64');

fetch("https://auth.strongbox.link/v1/token", {
  "headers": {
    "authorization": "Basic " + clientCredentials,
    "content-type": "application/x-www-form-urlencoded",
    "accept": "application/json",
  },
  "body": "grant_type=client_credentials",
  "method": "POST",
});
using System;
using System.Text;

var clientId = "YOUR_CLIENT_ID";
var clientSecret = "YOUR_CLIENT_SECRET";
var clientCredentials = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{clientId}:{clientSecret}"));
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://auth.strongbox.link/v1/token"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", $"Basic {clientCredentials}" },
    },
    Content = new StringContent("grant_type=client_credentials")
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded")
        }
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	b64 "encoding/base64"
	"fmt"
	"strings"
	"net/http"
	"io/ioutil"
)

func main() {

	clientId := "YOUR_CLIENT_ID"
	clientSecret := "YOUR_CLIENT_SECRET"

	clientCredentials := b64.StdEncoding.EncodeToString([]byte(clientId + ":" + clientSecret))

	url := "https://auth.strongbox.link/v1/token"

	payload := strings.NewReader("grant_type=client_credentials")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Basic " + clientCredentials)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import base64
import http.client

clientId = "YOUR_CLIENT_ID"
clientSecret = "YOUR_CLIENT_SECRET"
clientCredentials = base64.b64encode((clientId + ":" + clientSecret).encode('utf-8'))

conn = http.client.HTTPSConnection("auth.strongbox.link")

payload = "grant_type=client_credentials"

headers = {
    'Content-Type': "application/x-www-form-urlencoded",
    'Accept': "application/json",
    'Authorization': "Basic " + clientCredentials
    }

conn.request("POST", "/v1/token", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
String clientId = "YOUR_CLIENT_ID";
String clientSecret = "YOUR_CLIENT_SECRET";
String clientCredentials = Base64.getEncoder().encodeToString((clientId + ":" + clientSecret).getBytes());
HttpResponse<String> response = Unirest.post("https://auth.strongbox.link/v1/token")
  .header("Content-Type", "application/x-www-form-urlencoded")
  .header("Accept", "application/json")
  .header("Authorization", "Basic " + clientCredentials)
  .body("grant_type=client_credentials")
  .asString();

200 Response

{
    "access_token":"2YotnFZFEjr1zCsicMWpAA",
    "token_type":"Bearer",
    "expires_in":21600
}

Request

POST https://auth.strongbox.link/v1/token

Header parameters
Name Required Description
Authorization true Basic base64({ClientId} + ":" + {ClientSecret})
Content-Type true Must be application/x-www-form-urlencoded.
Body parameter
Type Required Description
AccessTokenRequest true The request for an access token.

Response

Status Description Type
200 Successful Response AccessTokenResponse
400 Error Response OAuth2ErrorResponse
401 Error Response OAuth2ErrorResponse

Authorize your API requests

Example

GET /v1/example HTTP/1.1
Host: api.strongbox.link
Authorization: Bearer {access-token}
Accept: application/json

curl 'https://api.strongbox.link/v1/example' \
  -H "Authorization: Bearer {access-token}"
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/v1/example' -Method GET -Headers $headers
const fetch = require('node-fetch');

fetch("https://api.strongbox.link/v1/example", {
  "headers": {
    "authorization": "Basic {access-token}",
    "accept": "application/json",
  },
  "method": "GET",
});
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/v1/example"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/v1/example"
    
	req, _ := http.NewRequest("GET", url)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/v1/example", headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/v1/example")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

Once you have aquired an access token, authorizing the requests that you send to the API is as easy as using the Bearer Authentication Scheme.

Simply include an Authorization header in your requests using a value of the form Bearer {access-token}.

Authorize client-side code

Our team is proud to offer front-end components that make integrating with the APIs even easier. These UI widgets are designed to be dropped into your website with minimal effort, but need to be initialized with a delegated access token so that they can make API requests on your behalf, and on behalf of your end-user.

The process for authorizing these client-side components is very similar to authorizing your server-to-server requests, but requires one additional step. Effectively, that extra step is needed to delegate some limited API access to your end-user, since all of the API requests that are needed to drive the user experience are sent directly from code executing in their web browser.

  1. Use your Client Id and Client Secret to get an access token. Learn how
  2. Request a delegated access token. Learn how
  3. Initialize the client-side component with the delegated access token.
OAuth2

Request a delegated access token

This endpoint can be used to request an access token with limited API access. In the request, the actorId is used to restrict access to a single Organization and should be set to the orgId. The purpose is used to specify the minimum set of permissions that are required.

DelegatedAccessTokenRequest

{
  "actorId": "cb021ecf-3621-4b84-ab8e-4fc1cd431b0c",
  "purpose": [
    "ConnectAccountingSystem"
  ]
}

Example

POST /v1/DelegatedAccessTokens HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer {access-token}
Host: auth.strongbox.link
Content-Length: 88

{"actorId":"cb021ecf-3621-4b84-ab8e-4fc1cd431b0c","purpose":["ConnectAccountingSystem"]}
curl --request POST \
  --url https://auth.strongbox.link/v1/DelegatedAccessTokens \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}' \
  --header 'Content-Type: application/json' \
  --data '{"actorId":"cb021ecf-3621-4b84-ab8e-4fc1cd431b0c","purpose":["ConnectAccountingSystem"]}'
$headers=@{}
$headers.Add("Content-Type", "application/json")
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://auth.strongbox.link/v1/DelegatedAccessTokens' -Method POST -Headers $headers -ContentType 'undefined' -Body '{"actorId":"cb021ecf-3621-4b84-ab8e-4fc1cd431b0c","purpose":["ConnectAccountingSystem"]}'
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "auth.strongbox.link",
  "port": null,
  "path": "/v1/DelegatedAccessTokens",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(JSON.stringify({
  actorId: 'cb021ecf-3621-4b84-ab8e-4fc1cd431b0c',
  purpose: ['ConnectAccountingSystem']
}));
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://auth.strongbox.link/v1/DelegatedAccessTokens"),
    Headers =
    {
        { "Content-Type", "application/json" },
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
    Content = new StringContent("{\"actorId\":\"cb021ecf-3621-4b84-ab8e-4fc1cd431b0c\",\"purpose\":[\"ConnectAccountingSystem\"]}")
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/json")
        }
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://auth.strongbox.link/v1/DelegatedAccessTokens"

	payload := strings.NewReader("{\"actorId\":\"cb021ecf-3621-4b84-ab8e-4fc1cd431b0c\",\"purpose\":[\"ConnectAccountingSystem\"]}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("auth.strongbox.link")

payload = "{\"actorId\":\"cb021ecf-3621-4b84-ab8e-4fc1cd431b0c\",\"purpose\":[\"ConnectAccountingSystem\"]}"

headers = {
    'Content-Type': "application/json",
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("POST", "/v1/DelegatedAccessTokens", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.post("https://auth.strongbox.link/v1/DelegatedAccessTokens")
  .header("Content-Type", "application/json")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .body("{\"actorId\":\"cb021ecf-3621-4b84-ab8e-4fc1cd431b0c\",\"purpose\":[\"ConnectAccountingSystem\"]}")
  .asString();

201 Response

{
  "accessToken": "2YotnFZFEjr1zCsicMWpAA",
  "actorId": "cb021ecf-3621-4b84-ab8e-4fc1cd431b0c",
  "expiration": "2020-01-25T15:46:01.0000000+00:00",
  "purpose": [
    "ConnectAccountingSystem"
  ],
  "tokenType": "Bearer"
}

Request

POST https://auth.strongbox.link/v1/DelegatedAccessTokens

Header parameters
Name Required Description
Authorization true See Authorize your API requests.
Content-Type true The format of the request body. Must be application/json.
Body parameter
Type Required Description
DelegatedAccessTokenRequest true The request to create a delegated access token.

Response

Status Description Type
201 Created DelegatedAccessToken
400 Bad Request BadRequest
401 Unauthorized
403 Forbidden Forbidden
415 Unsupported Media Type
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Delegated access token permissions

A delegated access token works just like a regular access token, except that API access is restricted to a single Organization and to just the subset of operations that are required to drive a particular user experience. In other words, the ability to request a delegated access token is a security feature adhering to the principle of least privilege.

When you request a delegated access token, the actorId controls which Organization can be accessed, while the purpose specifies exactly which APIs are permitted. Please reference the table below to better understand how a delegated access token that you request can be used.

DelegatedAccessTokenPurpose API Scopes
ConnectAccountingSystem Create a Connection Request
Get the status of a Connection Request
Import financials on demand
Monitor a financial import
Initialize a listed Organization
ConnectionManagement List Connections
Get an existing Connection
Delete a Connection

Security best practice

Tutorials

Connect an Accounting System

One of the core features provided by the Strongbox Platform is to make it simple for your customers to share their financials with you. In this tutorial you will learn how the API enables them to connect their Accounting System.

  1. Create a Connection Request. Learn how
  2. Navigate the user's web browser to the Connection Endpoint. Learn how
  3. Monitor the status of the Connection Request. Learn how
Connect Accounting System

Create a Connection Request

A Connection Request is used to initiate the process of connecting to an Accounting System. To make this request you will need to provide two parameters; an orgId and a datasourceNameId.

The orgId is a unicode string identifier of your choice for the Organization that is connecting the Accounting System and has a maximum length of 128 characters.

The datasourceNameId should be one of the following:

Value Description Status
example If you don't have an actual Accounting System setup yet, use the example Accounting System Under Development
quickbooksonline QuickBooks Online - Simple Start, Plus, Advanced Generally Available
quickbooksdesktop QuickBooks Desktop - Pro, Premier, Enterprise Generally Available
xero Xero Generally Available
accountrightlive AccountRight Live and [the new] MYOB Essentials Under Development
sageintacct Sage Intacct Beta Release
freshbooks FreshBooks Under Development

The most important components of the response are the connectionEndpoint and the id of the Connection Request.

The connectionEndpoint is a URL to which the user should be directed. The recommended way to do that is to open a new browser window from your website. The connectionEndpoint provides everything that is required for the end-user to connect their Accounting System.

After navigating the user-agent to the connectionEndpoint, use the id from the response to monitor the status of the Connection Request.

Please be aware that the connectionEndpoint URL can only be used once and has a lifetime of 6 hours. Create a new Connection Request if you need to re-attempt connecting to the Accounting System.

ConnectionRequestParameters

{
  "datasourceNameId": "quickbooksonline"
}

Example

POST /Organizations/{orgId}/ConnectionRequests HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link
Content-Length: 39

{"datasourceNameId":"quickbooksonline"}
curl --request POST \
  --url https://api.strongbox.link/Organizations/{orgId}/ConnectionRequests \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}' \
  --header 'Content-Type: application/json' \
  --data '{"datasourceNameId":"quickbooksonline"}'
$headers=@{}
$headers.Add("Content-Type", "application/json")
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/ConnectionRequests' -Method POST -Headers $headers -ContentType 'undefined' -Body '{"datasourceNameId":"quickbooksonline"}'
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/ConnectionRequests",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(JSON.stringify({datasourceNameId: 'quickbooksonline'}));
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/ConnectionRequests"),
    Headers =
    {
        { "Content-Type", "application/json" },
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
    Content = new StringContent("{\"datasourceNameId\":\"quickbooksonline\"}")
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/json")
        }
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/ConnectionRequests"

	payload := strings.NewReader("{\"datasourceNameId\":\"quickbooksonline\"}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

payload = "{\"datasourceNameId\":\"quickbooksonline\"}"

headers = {
    'Content-Type': "application/json",
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("POST", "/Organizations/{orgId}/ConnectionRequests", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.post("https://api.strongbox.link/Organizations/{orgId}/ConnectionRequests")
  .header("Content-Type", "application/json")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .body("{\"datasourceNameId\":\"quickbooksonline\"}")
  .asString();

201 Response

{
  "connectionEndpoint": "https://auth.strongbox.link/v1/quickbooksonline?rt=ABC",
  "expiration": "2020-12-19T00:00:00-08:00",
  "id": "AAF8136F97964CDFA43BF33FDFB395DE-637399907461972510",
  "orgId": "cb021ecf-3621-4b84-ab8e-4fc1cd431b0c",
  "datasourceNameId": "quickbooksonline"
}

Request

POST https://api.strongbox.link/Organizations/{orgId}/ConnectionRequests

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization for which the Connection Request will be created.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.
Content-Type true The format of the request body. Must be application/json.
Body parameter
Type Required Description
ConnectionRequestParameters true Parameters for creating the Connection Request.

Response

Status Description Type
201 Created ConnectionRequestDescriptor
400 Bad Request BadRequest
401 Unauthorized
403 Forbidden Forbidden
415 Unsupported Media Type
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
201 Location string uri The location of the newly created Connection Request
401 WWW-Authenticate string Bearer

How the Connection Endpoint works

Once you have created a Connection Request, the next step in connecting an Accounting System is to navigate your customer's web browser to the connectionEndpoint provided in the response.

The recommended way to do that is to open a pop-up window from your website using javascript. However, for purposes of this tutorial you can simply paste the connectionEndpoint URL into your web browser.

What happens next will vary by Accounting System. You can learn more about the specifics for each in the Datasources documentation, but broadly speaking the user experience will fall into two high-level categories depending on whether the Accounting System is hosted online or is installed as a desktop application.

Now that you know what to expect, open the connectionEndpoint using your web browser and connect an Accounting System!

If you don't have an Accounting System setup yet, create your Connection Request with the datasourceNameId set to example.

Tips for implementing the pop-up window

Example

let button = window.getElementById('#connectButton');
// We want to call window.open inside of a click event handler to
// prevent issues with pop-up blocking.
button.onclick = function() {
    let w = window.open(
        {connectionEndpoint},
        '_blank', 
        'left=0,top=0,resizable');

    // Call window.focus() to increase the chances that the window
    // is brought to the foreground
    w.focus && w.focus();

    // Detect and handle the case where the user
    // has closed the pop-up window
    let timer = setInterval(function() {
        if(w.closed) {
            clearInterval(timer);
            console.log('The user closed the pop-up...');
        }
    }, 2000);
};
  1. To prevent issues with pop-up blocking, please make sure to place the code that opens the new window inside of a click event handler. This makes all the difference because web browsers will recognize that the window was opened in response to a user action.
  2. Please handle the case where the user closes the pop-up window. Unfortunately, it's not possible for us to reliably handle that event from our end because of historic web browser limitations.
  3. In the majority of cases, your pop-up window will be brought to the foreground automatically, but it is best practice to call window.focus() and to display a helpful message from your main webpage just in case.
  4. Please use window.open() to launch the pop-up. While there are certainly other ways to open a new browser window, this is the recommended option because it ensures that the pop-up can be closed automatically.

Get the status of a Connection Request

Send the following request to monitor the status of a Connection Request after you have navigated your customer to the connectionEndpoint.

This request should be repeated until either your customer closes the pop-up window or the status of the Connection Request reaches the Success or Error end-state.

On Success, the response will include a connectionId, which is all you need to start importing financials.

Example

GET /Organizations/{orgId}/ConnectionRequests/{id} HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/ConnectionRequests/{id} \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/ConnectionRequests/{id}' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/ConnectionRequests/{id}",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/ConnectionRequests/{id}"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/ConnectionRequests/{id}"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/ConnectionRequests/{id}", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/ConnectionRequests/{id}")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "connectionId": "1dee3cdc-78a3-452f-9c26-c9c3cb551474",
  "id": "AAF8136F97964CDFA43BF33FDFB395DE-637399907461972510",
  "errorCode": "None",
  "orgId": "cb021ecf-3621-4b84-ab8e-4fc1cd431b0c",
  "status": "Success",
  "datasourceNameId": "quickbooksonline"
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/ConnectionRequests/{id}

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization for which the Connection Request was created.
id path string true An identifier for the Connection Request.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK ConnectionRequest
400 Bad Request BadRequest
401 Unauthorized
403 Forbidden Forbidden
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Use the FinConnect Web Widget

The FinConnect Web Widget is a React based web component that you can optionally add to your website. We've built it to reduce the cost of developing the user experience required to Connect an Accounting System.

After you've Signed Up and your App has been approved, try out the live demo using your developer credentials.

The code for the widget and the demo application is open source and made available for your reference in our GitHub repository. More detailed instructions on how to use the widget can also be found on GitHub.

Connection management

The following APIs are available to manage existing Connections.

List Connections

Use this endpoint to list Connections for an Organization. You must request an individual Connection to get its current state.

Example

GET /Organizations/{orgId}/Connections HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/Connections \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/Connections' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/Connections",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/Connections"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/Connections"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/Connections", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/Connections")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "connections": [
    {
      "datasetId": "123",
      "datasetName": "ABC Plumbing",
      "datasourceNameId": "quickbooksonline",
      "id": "1dee3cdc-78a3-452f-9c26-c9c3cb551474",
      "orgId": "cb021ecf-3621-4b84-ab8e-4fc1cd431b0c"
    }
  ]
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/Connections

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization for which the Connections are being listed.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK ConnectionsList
401 Unauthorized
403 Forbidden Forbidden
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Get an existing Connection

Use this endpoint to get an existing Connection. If the state of the Connection is Disconnected, you can reconnect it by creating a new Connection Request.

Example

GET /Organizations/{orgId}/Connections/{id} HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/Connections/{id} \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/Connections/{id}' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/Connections/{id}",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/Connections/{id}"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/Connections/{id}"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/Connections/{id}", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/Connections/{id}")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "state": "Connected",
  "datasetId": "123",
  "datasetName": "ABC Plumbing",
  "datasourceNameId": "quickbooksonline",
  "id": "1dee3cdc-78a3-452f-9c26-c9c3cb551474",
  "orgId": "cb021ecf-3621-4b84-ab8e-4fc1cd431b0c"
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/Connections/{id}

URI parameters
Name In Type Required Description
orgId path string true An identifier for the Organization associated with the Connection.
id path string(uuid) true An identifier for the Connection.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK Connection
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Delete a Connection

Use this endpoint to delete a Connection. Any credentials used to access the Dataset are removed.

Example

DELETE /Organizations/{orgId}/Connections/{id} HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request DELETE \
  --url https://api.strongbox.link/Organizations/{orgId}/Connections/{id} \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/Connections/{id}' -Method DELETE -Headers $headers
const http = require("https");

const options = {
  "method": "DELETE",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/Connections/{id}",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Delete,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/Connections/{id}"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/Connections/{id}"

	req, _ := http.NewRequest("DELETE", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("DELETE", "/Organizations/{orgId}/Connections/{id}", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.delete("https://api.strongbox.link/Organizations/{orgId}/Connections/{id}")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

Request

DELETE https://api.strongbox.link/Organizations/{orgId}/Connections/{id}

URI parameters
Name In Type Required Description
orgId path string true An identifier for the Organization associated with the Connection.
id path string(uuid) true An identifier for the Connection.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
204 No Content
401 Unauthorized
403 Forbidden Forbidden
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Import financial data

Importing financials is the process of collecting the data from the source Accounting System and then producing a standardized representation, referred to as a Financial Record.

We've made importing the financial data quite easy and there's just two API requests you'll need to familiarize yourself with.

  1. Send a request to start importing the financial data. Learn how
  2. Monitor the status of the financial import. Learn how

Import financials on demand

Send the following request to import new financial data. A new Financial Record is created to represent the imported financials. To make this request you will need to provide two parameters; an accountingConnectionId and the reportingEndDate.

The accountingConnectionId is an identifier for the Connection to the Accounting System that will be used to import the financial data.

The reportingEndDate should be the current date in the user's time zone. Financial data is collected from the Accounting System up to this date [inclusive], and period-to-date reports will end on this date. Typically, you will want to obtain the current date from client-side code running in the customer's web-browser.

You can also associate additional metadata with the Financial Record by using the consumerMetadata parameter. Please be aware that a maximum of 25 items can be added. The maximum size of the label is 100 characters and the maximum size of the value is 200 characters.

The response includes an identifier for the Financial Record, which can be used to monitor the status of importing the requested financials and for exporting the data upon completion.

FinancialImportParameters

{
  "accountingConnectionId": "a0dc8c6e-98fe-48ba-9322-e583db814142",
  "consumerMetadata": [
    {
      "label": "loanId",
      "value": "a88bc467-222e-4d98-b8bc-f890321df1ef"
    }
  ],
  "reportingEndDate": "2021-11-18",
  "accountingDataImportOptions": {
    "privacyControls": [
      "AnonymizeContactLists"
    ],
    "transactions": {
      "reportingPeriod": "FiscalYears",
      "numberOfPeriods": 3
    },
    "financialStatements": {
      "reportingPeriod": "FiscalYears",
      "numberOfPeriods": 3
    },
    "receivables": {
      "reportingPeriod": "FiscalYears",
      "numberOfPeriods": 3
    },
    "payables": {
      "reportingPeriod": "FiscalYears",
      "numberOfPeriods": 3
    }
  }
}

Example

POST /Organizations/{orgId}/FinancialRecords/Import HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link
Content-Length: 538

{"accountingConnectionId":"a0dc8c6e-98fe-48ba-9322-e583db814142","consumerMetadata":[{"label":"loanId","value":"a88bc467-222e-4d98-b8bc-f890321df1ef"}],"reportingEndDate":"2021-11-18","accountingDataImportOptions":{"privacyControls":["AnonymizeContactLists"],"transactions":{"reportingPeriod":"FiscalYears","numberOfPeriods":3},"financialStatements":{"reportingPeriod":"FiscalYears","numberOfPeriods":3},"receivables":{"reportingPeriod":"FiscalYears","numberOfPeriods":3},"payables":{"reportingPeriod":"FiscalYears","numberOfPeriods":3}}}
curl --request POST \
  --url https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/Import \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}' \
  --header 'Content-Type: application/json' \
  --data '{"accountingConnectionId":"a0dc8c6e-98fe-48ba-9322-e583db814142","consumerMetadata":[{"label":"loanId","value":"a88bc467-222e-4d98-b8bc-f890321df1ef"}],"reportingEndDate":"2021-11-18","accountingDataImportOptions":{"privacyControls":["AnonymizeContactLists"],"transactions":{"reportingPeriod":"FiscalYears","numberOfPeriods":3},"financialStatements":{"reportingPeriod":"FiscalYears","numberOfPeriods":3},"receivables":{"reportingPeriod":"FiscalYears","numberOfPeriods":3},"payables":{"reportingPeriod":"FiscalYears","numberOfPeriods":3}}}'
$headers=@{}
$headers.Add("Content-Type", "application/json")
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/Import' -Method POST -Headers $headers -ContentType 'undefined' -Body '{"accountingConnectionId":"a0dc8c6e-98fe-48ba-9322-e583db814142","consumerMetadata":[{"label":"loanId","value":"a88bc467-222e-4d98-b8bc-f890321df1ef"}],"reportingEndDate":"2021-11-18","accountingDataImportOptions":{"privacyControls":["AnonymizeContactLists"],"transactions":{"reportingPeriod":"FiscalYears","numberOfPeriods":3},"financialStatements":{"reportingPeriod":"FiscalYears","numberOfPeriods":3},"receivables":{"reportingPeriod":"FiscalYears","numberOfPeriods":3},"payables":{"reportingPeriod":"FiscalYears","numberOfPeriods":3}}}'
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/Import",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(JSON.stringify({
  accountingConnectionId: 'a0dc8c6e-98fe-48ba-9322-e583db814142',
  consumerMetadata: [{label: 'loanId', value: 'a88bc467-222e-4d98-b8bc-f890321df1ef'}],
  reportingEndDate: '2021-11-18',
  accountingDataImportOptions: {
    privacyControls: ['AnonymizeContactLists'],
    transactions: {reportingPeriod: 'FiscalYears', numberOfPeriods: 3},
    financialStatements: {reportingPeriod: 'FiscalYears', numberOfPeriods: 3},
    receivables: {reportingPeriod: 'FiscalYears', numberOfPeriods: 3},
    payables: {reportingPeriod: 'FiscalYears', numberOfPeriods: 3}
  }
}));
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/Import"),
    Headers =
    {
        { "Content-Type", "application/json" },
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
    Content = new StringContent("{\"accountingConnectionId\":\"a0dc8c6e-98fe-48ba-9322-e583db814142\",\"consumerMetadata\":[{\"label\":\"loanId\",\"value\":\"a88bc467-222e-4d98-b8bc-f890321df1ef\"}],\"reportingEndDate\":\"2021-11-18\",\"accountingDataImportOptions\":{\"privacyControls\":[\"AnonymizeContactLists\"],\"transactions\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3},\"financialStatements\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3},\"receivables\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3},\"payables\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3}}}")
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/json")
        }
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/Import"

	payload := strings.NewReader("{\"accountingConnectionId\":\"a0dc8c6e-98fe-48ba-9322-e583db814142\",\"consumerMetadata\":[{\"label\":\"loanId\",\"value\":\"a88bc467-222e-4d98-b8bc-f890321df1ef\"}],\"reportingEndDate\":\"2021-11-18\",\"accountingDataImportOptions\":{\"privacyControls\":[\"AnonymizeContactLists\"],\"transactions\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3},\"financialStatements\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3},\"receivables\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3},\"payables\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3}}}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

payload = "{\"accountingConnectionId\":\"a0dc8c6e-98fe-48ba-9322-e583db814142\",\"consumerMetadata\":[{\"label\":\"loanId\",\"value\":\"a88bc467-222e-4d98-b8bc-f890321df1ef\"}],\"reportingEndDate\":\"2021-11-18\",\"accountingDataImportOptions\":{\"privacyControls\":[\"AnonymizeContactLists\"],\"transactions\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3},\"financialStatements\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3},\"receivables\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3},\"payables\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3}}}"

headers = {
    'Content-Type': "application/json",
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("POST", "/Organizations/{orgId}/FinancialRecords/Import", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.post("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/Import")
  .header("Content-Type", "application/json")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .body("{\"accountingConnectionId\":\"a0dc8c6e-98fe-48ba-9322-e583db814142\",\"consumerMetadata\":[{\"label\":\"loanId\",\"value\":\"a88bc467-222e-4d98-b8bc-f890321df1ef\"}],\"reportingEndDate\":\"2021-11-18\",\"accountingDataImportOptions\":{\"privacyControls\":[\"AnonymizeContactLists\"],\"transactions\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3},\"financialStatements\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3},\"receivables\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3},\"payables\":{\"reportingPeriod\":\"FiscalYears\",\"numberOfPeriods\":3}}}")
  .asString();

201 Response

{
  "financialRecordId": "fc2497c7-461f-4ac1-a418-7a3f83860209"
}

Request

POST https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/Import

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization for which financials will be imported.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.
Content-Type true The format of the request body. Must be application/json.
Body parameter
Type Required Description
FinancialImportParameters true none

Response

Status Description Type
201 Created FinancialRecordReference
400 Bad Request BadRequest
401 Unauthorized
403 Forbidden Forbidden
500 Internal Server Error
501 Not Implemented
503 Service Unavailable
Headers
Status Header Type Format Description
201 Location string uri The location of the newly created Financial Record
401 WWW-Authenticate string Bearer

Monitor a financial import

Send the following request to get the status or outcome of importing the financial data.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/ImportStatus HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ImportStatus \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ImportStatus' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ImportStatus",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ImportStatus"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ImportStatus"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ImportStatus", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ImportStatus")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "errorCode": "None",
  "outcome": "Success"
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ImportStatus

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization for which financials are being imported.
financialRecordId path string(uuid) true An identifier for the Financial Record representing the imported financials.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK FinancialImportStatus
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Export financial data

The result of importing financials from an Accounting System is the creation of a new Financial Record, which is a standardized representation of the financial data.

We've designed the data schema with two primary goals in mind:

  1. The data should look the same, and be semantically equivalent, regardless of which datasource it originated from.
  2. Applying industry standard financial analysis techniques to the data models should be straight-forward.
Data Schema
Financial Record Data Schema

List Financial Records

Send the following request to list Financial Records for an Organization.

Example

GET /Organizations/{orgId}/FinancialRecords HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/FinancialRecords \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "financialRecords": [
    {
      "consumerMetadata": [
        {
          "label": "loanId",
          "value": "a88bc467-222e-4d98-b8bc-f890321df1ef"
        }
      ],
      "dataAsOfTime": "2020-05-06T23:01:01.0010000+00:00",
      "accountingDataset": {
        "datasetId": "a0dc8c6e-98fe-48ba-9322-e583db814142",
        "datasourceNameId": "example"
      },
      "id": "fc2497c7-461f-4ac1-a418-7a3f83860209",
      "importStatus": {
        "errorCode": "None",
        "outcome": "Success"
      },
      "reportingEndDate": "2020-05-06",
      "scheduled": false,
      "accountingDataImportOptions": {
        "privacyControls": [],
        "transactions": {
          "reportingPeriod": "FiscalYears",
          "numberOfPeriods": 3
        },
        "financialStatements": {
          "reportingPeriod": "FiscalYears",
          "numberOfPeriods": 3
        },
        "receivables": {
          "reportingPeriod": "FiscalYears",
          "numberOfPeriods": 3
        },
        "payables": {
          "reportingPeriod": "FiscalYears",
          "numberOfPeriods": 3
        }
      }
    }
  ]
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization for which financials were imported.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK FinancialRecordList
401 Unauthorized
403 Forbidden Forbidden
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Get the Accounting Entity

An Accounting Entity represents the organization for which accounting and other financial data was prepared.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountingEntity HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountingEntity \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountingEntity' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountingEntity",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountingEntity"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountingEntity"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountingEntity", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountingEntity")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "accountingMethod": "Accrual",
  "baseCurrency": {
    "code": "USD",
    "label": "United States dollar"
  },
  "fiscalYearEnd": {
    "month": 6
  },
  "homeCountry": {
    "code": "US",
    "label": "USA"
  },
  "taxYearEnd": {
    "month": 12
  },
  "addresses": [
    {
      "components": [
        {
          "type": "City",
          "value": "Seattle"
        },
        {
          "type": "StateOrProvince",
          "value": "WA"
        },
        {
          "type": "PostalCode",
          "value": "98059"
        }
      ],
      "freeFormLines": [
        "To: ABC Plumbing",
        "555 1st St",
        "Seattle, WA 98059"
      ],
      "tags": [
        "Legal"
      ]
    }
  ],
  "emails": [
    {
      "contact": "Customer support",
      "value": "support@example.com"
    }
  ],
  "identifiers": [
    {
      "label": "EIN",
      "value": "123"
    }
  ],
  "names": [
    {
      "tags": [
        "Legal"
      ],
      "value": "ABC Plumbing Inc."
    }
  ],
  "otherContactMethods": [
    {
      "contact": "Support team",
      "description": "Skype Id",
      "value": "example_support12345"
    }
  ],
  "phoneNumbers": [
    {
      "components": [
        {
          "type": "AreaCode",
          "value": "555"
        },
        {
          "type": "LocalNumber",
          "value": "5555555"
        },
        {
          "type": "Extension",
          "value": "5"
        }
      ],
      "contact": "John Doe - Director of Customer Success",
      "tags": [
        "Support"
      ],
      "value": "555 555 5555 #5"
    }
  ],
  "websites": [
    {
      "url": "https://www.example.com"
    }
  ]
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountingEntity

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization associated with the financial data.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK AccountingEntity
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Get the Chart Of Accounts

Send the following request to get the Chart Of Accounts used by the organization for accounting and financial reporting.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/ChartOfAccounts HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ChartOfAccounts \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ChartOfAccounts' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ChartOfAccounts",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ChartOfAccounts"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ChartOfAccounts"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ChartOfAccounts", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ChartOfAccounts")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "hierarchy": [
    {
      "classification": [
        {
          "classificationId": "NetSales",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "description": "Primary income account",
      "id": "1",
      "kind": "Nominal",
      "name": "Sales",
      "role": "Bookkeeping",
      "subaccounts": [
        {
          "classification": [
            {
              "classificationId": "NetSales",
              "taxonomyId": "v2.strongbox.accounting.gp"
            }
          ],
          "description": "Account used to track sales of widgets independently",
          "id": "2",
          "kind": "Nominal",
          "name": "Sales of Widgets",
          "role": "Bookkeeping",
          "subaccounts": [],
          "creationDate": "2017-01-09",
          "lastModifiedDate": "2017-01-09"
        }
      ],
      "creationDate": "2017-01-09",
      "lastModifiedDate": "2017-01-09"
    },
    {
      "classification": [
        {
          "classificationId": "CogsOrCos",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "description": "Records purchases to suppliers for goods sold",
      "id": "3",
      "kind": "Nominal",
      "name": "Inventory Purchases",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-02-15",
      "lastModifiedDate": "2019-07-03"
    },
    {
      "classification": [
        {
          "classificationId": "OperatingExpense",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "4",
      "kind": "Nominal",
      "name": "Rent",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-01-09",
      "lastModifiedDate": "2017-01-09"
    },
    {
      "classification": [
        {
          "classificationId": "NonOperatingIncomeOrExpense",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "5",
      "kind": "Nominal",
      "name": "Gains/losses from sale of fixed assets",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-05-23",
      "lastModifiedDate": "2017-05-23"
    },
    {
      "classification": [
        {
          "classificationId": "Cash",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "6",
      "kind": "Real",
      "name": "Business Checking",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-01-09",
      "lastModifiedDate": "2017-01-09"
    },
    {
      "classification": [
        {
          "classificationId": "Cash",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "7",
      "kind": "Real",
      "name": "Undeposited Funds",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-01-09",
      "lastModifiedDate": "2017-01-09"
    },
    {
      "classification": [
        {
          "classificationId": "AccountsReceivable",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "description": "Primary trade receivables account",
      "id": "8",
      "kind": "Real",
      "name": "Trade Receivables",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-01-09",
      "lastModifiedDate": "2017-01-09"
    },
    {
      "classification": [
        {
          "classificationId": "Inventory",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "9",
      "kind": "Real",
      "name": "Inventory (Finished Goods)",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-01-11",
      "lastModifiedDate": "2017-01-11"
    },
    {
      "classification": [
        {
          "classificationId": "OtherCurrentAsset",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "10",
      "kind": "Real",
      "name": "Employee Advances",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-03-03",
      "lastModifiedDate": "2017-03-03"
    },
    {
      "classification": [
        {
          "classificationId": "GrossNonCurrentAssets",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "11",
      "kind": "Real",
      "name": "Warehouse (building and land)",
      "role": "Bookkeeping",
      "subaccounts": [
        {
          "classification": [
            {
              "classificationId": "ContraNonCurrentAsset",
              "taxonomyId": "v2.strongbox.accounting.gp"
            }
          ],
          "id": "12",
          "kind": "Nominal",
          "name": "Depr. Warehouse",
          "role": "Bookkeeping",
          "subaccounts": [],
          "creationDate": "2017-05-01",
          "lastModifiedDate": "2017-05-01"
        }
      ],
      "creationDate": "2017-05-01",
      "lastModifiedDate": "2017-05-01"
    },
    {
      "classification": [
        {
          "classificationId": "AccountsPayable",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "13",
      "kind": "Real",
      "name": "Trade Payables",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-01-09",
      "lastModifiedDate": "2017-01-09"
    },
    {
      "classification": [
        {
          "classificationId": "CreditCardDebt",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "14",
      "kind": "Real",
      "name": "Visa CC",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-01-27",
      "lastModifiedDate": "2017-01-27"
    },
    {
      "classification": [
        {
          "classificationId": "OtherCurrentLiability",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "15",
      "kind": "Real",
      "name": "Sales Tax Payable",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-10-26",
      "lastModifiedDate": "2017-10-26"
    },
    {
      "classification": [
        {
          "classificationId": "NonCurrentLiability",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "16",
      "kind": "Real",
      "name": "PPP Loan",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2020-07-02",
      "lastModifiedDate": "2020-07-02"
    },
    {
      "classification": [
        {
          "classificationId": "OwnerShareholderOrPartnerEquity",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "17",
      "kind": "Real",
      "name": "Common Share Capital",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-01-10",
      "lastModifiedDate": "2017-01-10"
    },
    {
      "classification": [
        {
          "classificationId": "PriorYearEarningsAndAdjustments",
          "taxonomyId": "v2.strongbox.accounting.gp"
        }
      ],
      "id": "18",
      "kind": "Real",
      "name": "Retained Profits",
      "role": "Bookkeeping",
      "subaccounts": [],
      "creationDate": "2017-01-09",
      "lastModifiedDate": "2017-01-09"
    }
  ]
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/ChartOfAccounts

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization associated with the financial data.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK ChartOfAccounts
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Request Account Totals

Send the following request to get the starting, ending, and total change in balance for each account by reporting period.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountTotals{?reportingPeriod}= HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountTotals{?reportingPeriod}=' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountTotals{?reportingPeriod}=' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountTotals{?reportingPeriod}=",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountTotals{?reportingPeriod}="),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountTotals{?reportingPeriod}="

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountTotals{?reportingPeriod}=", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountTotals{?reportingPeriod}=")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "reportedTotals": [
    {
      "fromDate": "2020-01-01",
      "toDate": "2020-01-31",
      "totalsByAccount": [
        {
          "accountId": "1",
          "endingBalance": {
            "amount": 6000,
            "type": "Debit"
          },
          "netChange": {
            "amount": 1000,
            "type": "Debit"
          },
          "startingBalance": {
            "amount": 5000,
            "type": "Debit"
          }
        },
        {
          "accountId": "2",
          "endingBalance": {
            "amount": 5500,
            "type": "Debit"
          },
          "netChange": {
            "amount": 500,
            "type": "Credit"
          },
          "startingBalance": {
            "amount": 6000,
            "type": "Debit"
          }
        }
      ]
    },
    {
      "fromDate": "2020-02-01",
      "toDate": "2020-02-14",
      "totalsByAccount": [
        {
          "accountId": "1",
          "endingBalance": {
            "amount": 5000,
            "type": "Debit"
          },
          "netChange": {
            "amount": 1000,
            "type": "Credit"
          },
          "startingBalance": {
            "amount": 6000,
            "type": "Debit"
          }
        },
        {
          "accountId": "2",
          "endingBalance": {
            "amount": 10500,
            "type": "Debit"
          },
          "netChange": {
            "amount": 5000,
            "type": "Debit"
          },
          "startingBalance": {
            "amount": 5500,
            "type": "Debit"
          }
        }
      ]
    }
  ],
  "reportingPeriod": "MonthsAndMTD"
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/AccountTotals

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization associated with the financial data.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
reportingPeriod query ReportingPeriod true The desired reporting period.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK AccountTotals
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Request Balance Sheets

Make the following request to get balance sheets by reporting period.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/BalanceSheets{?reportingPeriod}= HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/BalanceSheets{?reportingPeriod}=' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/BalanceSheets{?reportingPeriod}=' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/BalanceSheets{?reportingPeriod}=",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/BalanceSheets{?reportingPeriod}="),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/BalanceSheets{?reportingPeriod}="

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/BalanceSheets{?reportingPeriod}=", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/BalanceSheets{?reportingPeriod}=")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "accountingMethod": "Accrual",
  "columnHeaders": [
    {
      "label": "Jan '20",
      "reportingEndDate": "2020-01-31"
    }
  ],
  "currency": {
    "code": "USD",
    "label": "United states dollar"
  },
  "footnotes": [
    "GAAP"
  ],
  "lineItems": [
    {
      "caption": "Assets",
      "columnData": [],
      "id": "1",
      "indentationLevel": 0,
      "styleClasses": [
        "SectionHeader",
        "GrandTotal"
      ]
    },
    {
      "caption": "Current Assets",
      "columnData": [],
      "id": "2",
      "indentationLevel": 1,
      "styleClasses": [
        "SectionHeader",
        "Subtotal"
      ]
    },
    {
      "accountRef": {
        "accountId": "323432423"
      },
      "caption": "Cash",
      "columnData": [
        50000
      ],
      "description": "Savings, checking, and includes undeposited funds",
      "id": "3",
      "indentationLevel": 2,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "accountRef": {
        "accountId": "34343423"
      },
      "caption": "Accounts Receivable",
      "columnData": [
        75000
      ],
      "id": "4",
      "indentationLevel": 2,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "accountRef": {
        "accountId": "89616158"
      },
      "caption": "Inventory",
      "columnData": [
        25000
      ],
      "id": "5",
      "indentationLevel": 2,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "accountRef": {
        "accountId": "996262"
      },
      "caption": "Other Current Assets",
      "columnData": [
        5000
      ],
      "id": "6",
      "indentationLevel": 2,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "caption": "Total Current Assets",
      "columnData": [
        155000
      ],
      "id": "7",
      "indentationLevel": 1,
      "styleClasses": [
        "SectionFooter",
        "Subtotal"
      ]
    },
    {
      "caption": "Non-current Assets",
      "columnData": [],
      "id": "8",
      "indentationLevel": 1,
      "styleClasses": [
        "SectionHeader",
        "Subtotal"
      ]
    },
    {
      "accountRef": {
        "accountId": "4324324"
      },
      "caption": "Long-term Assets",
      "columnData": [
        100000
      ],
      "id": "9",
      "indentationLevel": 2,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "accountRef": {
        "accountId": "95962"
      },
      "caption": "Depreciation, Amortization or Depletion",
      "columnData": [
        -25000
      ],
      "id": "10",
      "indentationLevel": 2,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "caption": "Total Non-current Assets",
      "columnData": [
        75000
      ],
      "id": "11",
      "indentationLevel": 1,
      "styleClasses": [
        "SectionFooter",
        "Subtotal"
      ]
    },
    {
      "caption": "Total Assets",
      "columnData": [
        230000
      ],
      "id": "12",
      "indentationLevel": 0,
      "styleClasses": [
        "SectionFooter",
        "GrandTotal"
      ]
    },
    {
      "caption": "Liabilities and Equity",
      "columnData": [],
      "id": "13",
      "indentationLevel": 0,
      "styleClasses": [
        "SectionHeader",
        "GrandTotal"
      ]
    },
    {
      "caption": "Liabilities",
      "columnData": [],
      "id": "14",
      "indentationLevel": 1,
      "styleClasses": [
        "SectionHeader",
        "Subtotal"
      ]
    },
    {
      "caption": "Current Liabilities",
      "columnData": [],
      "id": "15",
      "indentationLevel": 2,
      "styleClasses": [
        "SectionHeader",
        "Subtotal"
      ]
    },
    {
      "accountRef": {
        "accountId": "42356733423"
      },
      "caption": "Accounts Payable",
      "columnData": [
        30000
      ],
      "id": "16",
      "indentationLevel": 3,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "accountRef": {
        "accountId": "95622"
      },
      "caption": "Credit Card Debt",
      "columnData": [
        10000
      ],
      "id": "17",
      "indentationLevel": 3,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "accountRef": {
        "accountId": "94511"
      },
      "caption": "Other Current Liabilities",
      "columnData": [
        10000
      ],
      "id": "18",
      "indentationLevel": 3,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "caption": "Total Current Liabilities",
      "columnData": [
        50000
      ],
      "id": "19",
      "indentationLevel": 2,
      "styleClasses": [
        "SectionFooter",
        "Subtotal"
      ]
    },
    {
      "accountRef": {
        "accountId": "985956"
      },
      "caption": "Long-term Liabilities",
      "columnData": [
        50000
      ],
      "id": "20",
      "indentationLevel": 2,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "caption": "Total Long-term Liabilities",
      "columnData": [
        50000
      ],
      "id": "21",
      "indentationLevel": 2,
      "styleClasses": [
        "SectionFooter",
        "Subtotal"
      ]
    },
    {
      "caption": "Total Liabilities",
      "columnData": [
        100000
      ],
      "id": "22",
      "indentationLevel": 1,
      "styleClasses": [
        "SectionFooter",
        "Subtotal"
      ]
    },
    {
      "caption": "Equity",
      "columnData": [],
      "id": "23",
      "indentationLevel": 1,
      "styleClasses": [
        "SectionHeader",
        "Subtotal"
      ]
    },
    {
      "accountRef": {
        "accountId": "9897551"
      },
      "caption": "Other Equity",
      "columnData": [
        30000
      ],
      "id": "24",
      "indentationLevel": 2,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "accountRef": {
        "accountId": "262344"
      },
      "caption": "Retained Earnings",
      "columnData": [
        100000
      ],
      "id": "25",
      "indentationLevel": 2,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "caption": "Total Equity",
      "columnData": [
        130000
      ],
      "id": "26",
      "indentationLevel": 1,
      "styleClasses": [
        "SectionFooter",
        "Subtotal"
      ]
    },
    {
      "caption": "Total Liabilities and Equity",
      "columnData": [
        230000
      ],
      "id": "27",
      "indentationLevel": 0,
      "styleClasses": [
        "SectionFooter",
        "GrandTotal"
      ]
    }
  ],
  "organizationName": "ABC Plumbing",
  "scalingFactor": 1,
  "dataAsOfTime": "2020-05-06T23:01:01.0010000+00:00",
  "title": "Balance Sheet"
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/BalanceSheets

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization associated with the financial data.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
reportingPeriod query ReportingPeriod true The desired reporting period.
taxonomyId query string false An optional id for the accounting taxonomy to use when preparing the balance sheets. If not specified, the balance sheet will be represented using the original line items as exported from the accounting system.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK ComparativeBalanceSheet
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Request Income Statements

Make the following request to get income statements by reporting period.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/IncomeStatements{?reportingPeriod}= HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/IncomeStatements{?reportingPeriod}=' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/IncomeStatements{?reportingPeriod}=' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/IncomeStatements{?reportingPeriod}=",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/IncomeStatements{?reportingPeriod}="),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/IncomeStatements{?reportingPeriod}="

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/IncomeStatements{?reportingPeriod}=", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/IncomeStatements{?reportingPeriod}=")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "accountingMethod": "Accrual",
  "columnHeaders": [
    {
      "label": "Jan '20",
      "reportingEndDate": "2020-01-31",
      "reportingStartDate": "2020-01-01"
    }
  ],
  "currency": {
    "code": "USD",
    "label": "United states dollar"
  },
  "footnotes": [
    "GAAP"
  ],
  "lineItems": [
    {
      "accountRef": {
        "accountId": "9151615"
      },
      "caption": "Net Sales",
      "columnData": [
        100000
      ],
      "description": "Includes sales discounts",
      "id": "1",
      "indentationLevel": 1,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "accountRef": {
        "accountId": "342342354234"
      },
      "caption": "COGS/COS",
      "columnData": [
        75000
      ],
      "id": "2",
      "indentationLevel": 1,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "caption": "Gross Profit",
      "columnData": [
        25000
      ],
      "id": "3",
      "indentationLevel": 0,
      "styleClasses": [
        "Subtotal"
      ]
    },
    {
      "accountRef": {
        "accountId": "24324234"
      },
      "caption": "Operating Expenses",
      "columnData": [
        10000
      ],
      "id": "4",
      "indentationLevel": 1,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "caption": "Operating Profit",
      "columnData": [
        15000
      ],
      "id": "5",
      "indentationLevel": 0,
      "styleClasses": [
        "Subtotal"
      ]
    },
    {
      "accountRef": {
        "accountId": "83209480483"
      },
      "caption": "Other Income and Expenses",
      "columnData": [
        5000
      ],
      "id": "6",
      "indentationLevel": 1,
      "styleClasses": [
        "Account"
      ]
    },
    {
      "caption": "Net Income",
      "columnData": [
        20000
      ],
      "id": "7",
      "indentationLevel": 0,
      "styleClasses": [
        "GrandTotal"
      ]
    }
  ],
  "organizationName": "ABC Plumbing",
  "scalingFactor": 1,
  "dataAsOfTime": "2020-05-06T23:01:01.0010000+00:00",
  "title": "Income Statement"
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/IncomeStatements

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization associated with the financial data.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
reportingPeriod query ReportingPeriod true The desired reporting period.
taxonomyId query string false An optional id for the accounting taxonomy to use when preparing the income statements. If not specified, the income statement will be represented using the original line items as exported from the accounting system.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK ComparativeIncomeStatement
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Get the Transaction List

The Transaction List models all accounting transactions for a given time period.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/Transactions HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Transactions \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Transactions' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Transactions",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Transactions"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Transactions"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Transactions", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Transactions")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "supplementalFields": [],
  "dimensions": [
    {
      "id": "BusinessRelation",
      "label": "Primary Business Relation"
    },
    {
      "id": "ProductOrService",
      "label": "Product or Service"
    }
  ],
  "fromDate": "2018-10-01",
  "toDate": "2020-11-12",
  "transactions": [
    {
      "entries": [
        {
          "dimensionTags": [
            {
              "dimensionId": "BusinessRelation",
              "id": "1",
              "label": "John Doe"
            },
            {
              "dimensionId": "ProductOrService",
              "id": "1615654",
              "label": "Widget ABC"
            }
          ],
          "accountId": "555",
          "entry": {
            "amount": 500,
            "type": "Credit"
          },
          "memo": "Will ship goods Friday",
          "number": 1,
          "docNo": "SALE-RECEIPT-71155",
          "refNo": "CC-TXN-38493843",
          "supplementalFieldValues": []
        },
        {
          "dimensionTags": [],
          "accountId": "777",
          "entry": {
            "amount": 500,
            "type": "Debit"
          },
          "number": 2,
          "supplementalFieldValues": []
        }
      ],
      "id": "12345",
      "reportingDate": "2020-11-05",
      "lastModifiedDate": "2020-11-09",
      "creationDate": "2020-11-06",
      "type": "Sales Receipt"
    }
  ]
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Transactions

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization associated with the financial data.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK TransactionList
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Request Outstanding Receivables

Make the following request to get outstanding receivables by reporting period.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingReceivables HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingReceivables \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingReceivables' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingReceivables",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingReceivables"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingReceivables"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingReceivables", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingReceivables")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "history": [
    {
      "asOf": "2020-11-16",
      "transactions": [
        {
          "amountOutstanding": {
            "amount": 500,
            "type": "Debit"
          },
          "businessRelationship": {
            "id": "77c0a7f0-f03e483200af192c-2bee34a0ef4d108a4a35e8c7429c7fe1",
            "name": "John Doe"
          },
          "daysFromDueDate": -29,
          "daysFromTransactionDate": 1,
          "debtDescriptor": "DueFrom",
          "dueDate": "2020-12-15",
          "transactionAmount": {
            "amount": 1500,
            "type": "Debit"
          },
          "transactionDate": "2020-11-15",
          "transactionId": "28340923849038",
          "transactionType": "Invoice",
          "docNo": "ARINV-96"
        },
        {
          "amountOutstanding": {
            "amount": 100,
            "type": "Credit"
          },
          "businessRelationship": {
            "id": "77c0a7f0-f03e483200af192c-2bee34a0ef4d108a4a35e8c7429c7fe1",
            "name": "John Doe"
          },
          "daysFromDueDate": 0,
          "daysFromTransactionDate": 44,
          "debtDescriptor": "OwedTo",
          "transactionAmount": {
            "amount": 100,
            "type": "Credit"
          },
          "transactionDate": "2020-10-03",
          "transactionId": "28340923849038",
          "transactionType": "Credit Note",
          "docNo": "ARCN-96",
          "refNo": "Oct '20 Refund"
        }
      ]
    }
  ]
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingReceivables

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization associated with the financial data.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK OutstandingReceivablesHistory
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Request Outstanding Payables

Make the following request to get outstanding payables by reporting period.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingPayables HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingPayables \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingPayables' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingPayables",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingPayables"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingPayables"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingPayables", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingPayables")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "history": [
    {
      "asOf": "2020-11-16",
      "transactions": [
        {
          "amountOutstanding": {
            "amount": 500,
            "type": "Credit"
          },
          "businessRelationship": {
            "id": "77c0a7f0-f03e483200af192c-55e3c46cc635294a2d17b8808d0b38a2",
            "name": "John Doe"
          },
          "daysFromDueDate": -29,
          "daysFromTransactionDate": 1,
          "debtDescriptor": "OwedTo",
          "dueDate": "2020-12-15",
          "transactionAmount": {
            "amount": 1500,
            "type": "Credit"
          },
          "transactionDate": "2020-11-15",
          "transactionId": "954059450495",
          "transactionType": "Bill",
          "docNo": "APINV-976",
          "refNo": "786-CC-TXN"
        },
        {
          "amountOutstanding": {
            "amount": 10000,
            "type": "Debit"
          },
          "businessRelationship": {
            "id": "77c0a7f0-f03e483200af192c-2bee34a0ef4d108a4a35e8c7429c7fe1",
            "name": "ABC Suppliers"
          },
          "daysFromDueDate": 0,
          "daysFromTransactionDate": 44,
          "debtDescriptor": "DueFrom",
          "transactionAmount": {
            "amount": 10000,
            "type": "Debit"
          },
          "transactionDate": "2020-10-03",
          "transactionId": "34873437248374",
          "transactionType": "Vendor Credit",
          "docNo": "APCN-593"
        }
      ]
    }
  ]
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/OutstandingPayables

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization associated with the financial data.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK OutstandingPayablesHistory
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Financial analysis

Strongbox makes it easy to go beyond just the accounting data. Check out the links below to get started.

Calculate Financial Ratios

Send the following request to get financial ratios calculated for the requested reporting periods. More information about financial ratios can be found here.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/Ratios{?reportingPeriod}= HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/Ratios{?reportingPeriod}=' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/Ratios{?reportingPeriod}=' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/Ratios{?reportingPeriod}=",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/Ratios{?reportingPeriod}="),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/Ratios{?reportingPeriod}="

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/Ratios{?reportingPeriod}=", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/Ratios{?reportingPeriod}=")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "reportingPeriods": [
    {
      "fromDate": "2020-01-01",
      "toDate": "2020-12-31"
    }
  ],
  "ratios": [
    {
      "id": "CurrentRatio",
      "displayName": "Current Ratio",
      "category": "Liquidity",
      "values": [
        {
          "value": 2.1
        }
      ]
    },
    {
      "id": "QuickRatio",
      "displayName": "Quick Ratio",
      "category": "Liquidity",
      "values": [
        {
          "value": 1.2
        }
      ]
    },
    {
      "id": "CashRatio",
      "displayName": "Cash Ratio",
      "category": "Liquidity",
      "values": [
        {
          "value": 0.75
        }
      ]
    },
    {
      "id": "GrossProfitMargin",
      "displayName": "Gross Profit Margin",
      "category": "Profitability",
      "values": [
        {
          "value": 0.73
        }
      ]
    },
    {
      "id": "OperatingProfitMargin",
      "displayName": "Operating Profit Margin",
      "category": "Profitability",
      "values": [
        {
          "value": 0.45
        }
      ]
    },
    {
      "id": "NetProfitMargin",
      "displayName": "Net Profit Margin",
      "category": "Profitability",
      "values": [
        {
          "value": 0.4
        }
      ]
    },
    {
      "id": "ReturnOnAssets",
      "displayName": "Return On Assets",
      "category": "Profitability",
      "values": [
        {
          "value": 0.15
        }
      ]
    },
    {
      "id": "ReturnOnNetAssets",
      "displayName": "Return On Net Assets",
      "category": "Profitability",
      "values": [
        {
          "value": 0.1
        }
      ]
    },
    {
      "id": "ReturnOnEquity",
      "displayName": "Return On Equity",
      "category": "Profitability",
      "values": [
        {
          "value": 0.33
        }
      ]
    },
    {
      "id": "ReturnOnDebt",
      "displayName": "Return On Debt",
      "category": "Profitability",
      "values": [
        {
          "value": 0.28
        }
      ]
    },
    {
      "id": "ReturnOnCapital",
      "displayName": "Return On Capital",
      "category": "Profitability",
      "values": [
        {
          "value": 0.3
        }
      ]
    },
    {
      "id": "AssetTurnover",
      "displayName": "Asset Turnover",
      "category": "Efficiency",
      "values": [
        {
          "value": 0.24
        }
      ]
    },
    {
      "id": "ReceivablesTurnover",
      "displayName": "Receivables Turnover",
      "category": "Efficiency",
      "values": [
        {
          "value": 0.45
        }
      ]
    },
    {
      "id": "WorkingCapitalTurnover",
      "displayName": "Working Capital Turnover",
      "category": "Efficiency",
      "values": [
        {
          "value": 0.31
        }
      ]
    },
    {
      "id": "InventoryTurnover",
      "displayName": "Inventory Turnover",
      "category": "Efficiency",
      "values": [
        {
          "errorCode": "DivideByZero"
        }
      ]
    },
    {
      "id": "PayablesTurnover",
      "displayName": "Payables Turnover",
      "category": "Efficiency",
      "values": [
        {
          "value": 3.13
        }
      ]
    },
    {
      "id": "DaysInventoryOutstanding",
      "displayName": "Days Inventory Outstanding",
      "category": "Efficiency",
      "values": [
        {
          "errorCode": "DivideByZero"
        }
      ]
    },
    {
      "id": "DaysSalesOutstanding",
      "displayName": "Days Sales Outstanding",
      "category": "Efficiency",
      "values": [
        {
          "value": 45
        }
      ]
    },
    {
      "id": "DaysPayablesOutstanding",
      "displayName": "Days Payables Outstanding",
      "category": "Efficiency",
      "values": [
        {
          "value": 30
        }
      ]
    },
    {
      "id": "CashFlowConversionCycle",
      "displayName": "Cash Conversion Cycle",
      "category": "Efficiency",
      "values": [
        {
          "value": 15
        }
      ]
    },
    {
      "id": "DebtToAssets",
      "displayName": "Debt To Assets",
      "category": "Solvency",
      "values": [
        {
          "value": 0.75
        }
      ]
    },
    {
      "id": "DebtToEquity",
      "displayName": "Debt To Equity",
      "category": "Solvency",
      "values": [
        {
          "value": 0.35
        }
      ]
    },
    {
      "id": "LongTermDebtToEquity",
      "displayName": "Long-Term Debt To Equity",
      "category": "Solvency",
      "values": [
        {
          "value": 0.31
        }
      ]
    },
    {
      "id": "EquityToAssets",
      "displayName": "Equity To Assets",
      "category": "Solvency",
      "values": [
        {
          "value": 1.61
        }
      ]
    },
    {
      "id": "CurrentToNonCurrentAssets",
      "displayName": "Current To Non-Current Assets",
      "category": "Supplemental",
      "values": [
        {
          "value": 1.2
        }
      ]
    },
    {
      "id": "DebtToNetIncome",
      "displayName": "Debt To Net Income",
      "category": "Supplemental",
      "values": [
        {
          "value": 1.9
        }
      ]
    }
  ]
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/Ratios

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization associated with the financial data.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
reportingPeriod query ReportingPeriod true The desired reporting period.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK FinancialRatios
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Run a Horizontal Analysis

Send the following request to run a Horizontal Analysis. Detailed documentation for this feature can be found here.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/HorizontalAnalysis{?baselinePeriodType}= HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/HorizontalAnalysis{?baselinePeriodType}=' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/HorizontalAnalysis{?baselinePeriodType}=' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/HorizontalAnalysis{?baselinePeriodType}=",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/HorizontalAnalysis{?baselinePeriodType}="),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/HorizontalAnalysis{?baselinePeriodType}="

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/HorizontalAnalysis{?baselinePeriodType}=", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/HorizontalAnalysis{?baselinePeriodType}=")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "baselinePeriodType": "YoY",
  "reportingPeriods": [
    {
      "label": "FY18 to FY19",
      "reportingPeriod": {
        "label": "FY19",
        "fromDate": "2019-01-01",
        "toDate": "2019-12-31"
      },
      "baselinePeriod": {
        "label": "FY18",
        "fromDate": "2018-01-01",
        "toDate": "2018-12-31"
      }
    },
    {
      "label": "FY19 to FY20",
      "reportingPeriod": {
        "label": "FY20",
        "fromDate": "2020-01-01",
        "toDate": "2020-12-31"
      },
      "baselinePeriod": {
        "label": "FY19",
        "fromDate": "2019-01-01",
        "toDate": "2019-12-31"
      }
    }
  ],
  "metrics": [
    {
      "inputMetricId": "IncomeStatementLineItem-AccountClassification-NetSales",
      "inputMetricType": "IncomeStatementLineItem",
      "comparativeData": [
        {
          "currentValue": 292930.5,
          "pastValue": 347561.5,
          "absoluteChange": -54631,
          "percentChange": {
            "value": -0.1571836926702181
          }
        },
        {
          "currentValue": 387489,
          "pastValue": 292930.5,
          "absoluteChange": 94558.5,
          "percentChange": {
            "value": 0.3228018250062728
          }
        }
      ]
    },
    {
      "inputMetricId": "BalanceSheetLineItem-AccountClassification-Cash",
      "inputMetricType": "BalanceSheetLineItem",
      "comparativeData": [
        {
          "currentValue": 38352.23,
          "pastValue": 12520.69,
          "absoluteChange": 25831.54,
          "percentChange": {
            "value": 2.0631083430705495
          }
        },
        {
          "currentValue": 89028.23,
          "pastValue": 38352.23,
          "absoluteChange": 50676,
          "percentChange": {
            "value": 1.3213312498386665
          }
        }
      ]
    },
    {
      "inputMetricId": "FinancialRatio-CurrentRatio",
      "inputMetricType": "FinancialRatio",
      "comparativeData": [
        {
          "currentValue": 2.9160291554229794,
          "pastValue": 1.7806603889910955,
          "absoluteChange": 1.1353687664318837,
          "percentChange": {
            "value": 0.6376110646652685
          }
        },
        {
          "currentValue": 3.940300681312957,
          "pastValue": 2.9160291554229794,
          "absoluteChange": 1.0242715258899777,
          "percentChange": {
            "value": 0.3512555846655806
          }
        }
      ]
    }
  ]
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/HorizontalAnalysis

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization associated with the financial data.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
baselinePeriodType query BaselinePeriodType true Specifies the baseline period(s) to use for comparisons in the Horizontal Analysis.
inputMetricType query array[string] false This query argument is used to filter the result to one or more input metric types.
inputMetricId query array[string] false This query argument is used to filter the result to one or more input metrics by their id.
sortReportingPeriods query ChronologicalSortOrder false Specifies the chronological sort order of the reportingPeriods in the response, as well as the the corresponding comparativeData.
numberOfComparisons query integer(int32) false Specifies the desired number of comparisons to include in the response. The specific comparisons that are returned will depend on the sortReportingPeriods parameter. If not specified, all comparisons are returned based on the baselinePeriodType and the total number of periods imported from the Accounting System.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK HorizontalAnalysis
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Run a Vertical Analysis

Send the following request to run a Vertical Analysis. Detailed documentation for this feature can be found here.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/VerticalAnalysis HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/VerticalAnalysis \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/VerticalAnalysis' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/VerticalAnalysis",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/VerticalAnalysis"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/VerticalAnalysis"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/VerticalAnalysis", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/VerticalAnalysis")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "reportingPeriods": [
    {
      "label": "FY20",
      "fromDate": "2020-01-01",
      "toDate": "2020-12-31"
    }
  ],
  "incomeStatement": {
    "baseFigures": "NetSales",
    "lineItems": [
      {
        "id": "CurrentYearEarnings",
        "caption": "Net Income",
        "lineItemType": "ClassificationSubtotal",
        "baselineFigureId": "NetSales",
        "comparativeData": [
          {
            "value": -119,
            "comparandValue": 22216,
            "percentageRatio": {
              "value": -0.01
            }
          }
        ],
        "subtotals": [
          {
            "id": "OperatingProfit",
            "caption": "Operating Profit",
            "lineItemType": "ClassificationSubtotal",
            "baselineFigureId": "NetSales",
            "comparativeData": [
              {
                "value": -119,
                "comparandValue": 22216,
                "percentageRatio": {
                  "value": -0.01
                }
              }
            ],
            "subtotals": [
              {
                "id": "GrossProfit",
                "caption": "Gross Profit",
                "lineItemType": "ClassificationSubtotal",
                "baselineFigureId": "NetSales",
                "comparativeData": [
                  {
                    "value": 5602,
                    "comparandValue": 22216,
                    "percentageRatio": {
                      "value": 0.25
                    }
                  }
                ],
                "subtotals": [
                  {
                    "id": "NetSales",
                    "caption": "Net Sales",
                    "lineItemType": "ClassificationSubtotal",
                    "baselineFigureId": "NetSales",
                    "comparativeData": [
                      {
                        "value": 22216,
                        "comparandValue": 22216,
                        "percentageRatio": {
                          "value": 1
                        }
                      }
                    ],
                    "subtotals": [
                      {
                        "id": "coa-account-2",
                        "accountRef": {
                          "accountId": "2"
                        },
                        "caption": "Sales of Widgets",
                        "lineItemType": "SourceCoA",
                        "baselineFigureId": "NetSales",
                        "comparativeData": [
                          {
                            "value": 22216,
                            "comparandValue": 22216,
                            "percentageRatio": {
                              "value": 1
                            }
                          }
                        ],
                        "subtotals": []
                      }
                    ]
                  },
                  {
                    "id": "CogsOrCos",
                    "caption": "COGS/COS",
                    "lineItemType": "ClassificationSubtotal",
                    "baselineFigureId": "NetSales",
                    "comparativeData": [
                      {
                        "value": 16614,
                        "comparandValue": 22216,
                        "percentageRatio": {
                          "value": 0.75
                        }
                      }
                    ],
                    "subtotals": [
                      {
                        "id": "coa-account-3",
                        "accountRef": {
                          "accountId": "3"
                        },
                        "caption": "Inventory Purchases",
                        "lineItemType": "SourceCoA",
                        "baselineFigureId": "NetSales",
                        "comparativeData": [
                          {
                            "value": 16614,
                            "comparandValue": 22216,
                            "percentageRatio": {
                              "value": 0.75
                            }
                          }
                        ],
                        "subtotals": []
                      }
                    ]
                  }
                ]
              },
              {
                "id": "OperatingExpense",
                "caption": "Operating Expenses",
                "lineItemType": "ClassificationSubtotal",
                "baselineFigureId": "NetSales",
                "comparativeData": [
                  {
                    "value": 5721,
                    "comparandValue": 22216,
                    "percentageRatio": {
                      "value": 0.26
                    }
                  }
                ],
                "subtotals": [
                  {
                    "id": "coa-account-4",
                    "accountRef": {
                      "accountId": "4"
                    },
                    "caption": "Rent",
                    "lineItemType": "SourceCoA",
                    "baselineFigureId": "NetSales",
                    "comparativeData": [
                      {
                        "value": 5721,
                        "comparandValue": 22216,
                        "percentageRatio": {
                          "value": 0.26
                        }
                      }
                    ],
                    "subtotals": []
                  }
                ]
              }
            ]
          },
          {
            "id": "NonOperatingIncomeOrExpense",
            "caption": "Non-Operating Income and Expenses",
            "lineItemType": "ClassificationSubtotal",
            "baselineFigureId": "NetSales",
            "comparativeData": [
              {
                "value": 0,
                "comparandValue": 22216,
                "percentageRatio": {
                  "value": 0
                }
              }
            ],
            "subtotals": [
              {
                "id": "coa-account-5",
                "accountRef": {
                  "accountId": "5"
                },
                "caption": "Gains/losses from sale of fixed assets",
                "lineItemType": "SourceCoA",
                "baselineFigureId": "NetSales",
                "comparativeData": [
                  {
                    "value": 0,
                    "comparandValue": 22216,
                    "percentageRatio": {
                      "value": 0
                    }
                  }
                ],
                "subtotals": []
              }
            ]
          }
        ]
      }
    ]
  },
  "balanceSheet": {
    "baseFigures": "TotalAssets",
    "lineItems": [
      {
        "id": "Assets",
        "caption": "Total Assets",
        "lineItemType": "ClassificationSubtotal",
        "baselineFigureId": "Assets",
        "comparativeData": [
          {
            "value": 3621,
            "comparandValue": 3621,
            "percentageRatio": {
              "value": 1
            }
          }
        ],
        "subtotals": [
          {
            "id": "CurrentAssets",
            "caption": "Total Current Assets",
            "lineItemType": "ClassificationSubtotal",
            "baselineFigureId": "Assets",
            "comparativeData": [
              {
                "value": 3586,
                "comparandValue": 3621,
                "percentageRatio": {
                  "value": 0.99
                }
              }
            ],
            "subtotals": [
              {
                "id": "Cash",
                "caption": "Total Cash",
                "lineItemType": "ClassificationSubtotal",
                "baselineFigureId": "Assets",
                "comparativeData": [
                  {
                    "value": 91,
                    "comparandValue": 3621,
                    "percentageRatio": {
                      "value": 0.03
                    }
                  }
                ],
                "subtotals": [
                  {
                    "id": "coa-account-6",
                    "accountRef": {
                      "accountId": "6"
                    },
                    "caption": "Business Checking",
                    "lineItemType": "SourceCoA",
                    "baselineFigureId": "Assets",
                    "comparativeData": [
                      {
                        "value": 91,
                        "comparandValue": 3621,
                        "percentageRatio": {
                          "value": 0.03
                        }
                      }
                    ],
                    "subtotals": []
                  }
                ]
              },
              {
                "id": "AccountsReceivable",
                "caption": "Total Accounts Receivable",
                "lineItemType": "ClassificationSubtotal",
                "baselineFigureId": "Assets",
                "comparativeData": [
                  {
                    "value": 2333,
                    "comparandValue": 3621,
                    "percentageRatio": {
                      "value": 0.64
                    }
                  }
                ],
                "subtotals": [
                  {
                    "id": "coa-account-8",
                    "accountRef": {
                      "accountId": "8"
                    },
                    "caption": "Trade Receivables",
                    "lineItemType": "SourceCoA",
                    "baselineFigureId": "Assets",
                    "comparativeData": [
                      {
                        "value": 2333,
                        "comparandValue": 3621,
                        "percentageRatio": {
                          "value": 0.64
                        }
                      }
                    ],
                    "subtotals": []
                  }
                ]
              },
              {
                "id": "Inventory",
                "caption": "Total Inventory",
                "lineItemType": "ClassificationSubtotal",
                "baselineFigureId": "Assets",
                "comparativeData": [
                  {
                    "value": 0,
                    "comparandValue": 3621,
                    "percentageRatio": {
                      "value": 0
                    }
                  }
                ],
                "subtotals": []
              },
              {
                "id": "OtherCurrentAsset",
                "caption": "Total Other Current Assets",
                "lineItemType": "ClassificationSubtotal",
                "baselineFigureId": "Assets",
                "comparativeData": [
                  {
                    "value": 1162,
                    "comparandValue": 3621,
                    "percentageRatio": {
                      "value": 0.32
                    }
                  }
                ],
                "subtotals": [
                  {
                    "id": "coa-account-10",
                    "accountRef": {
                      "accountId": "10"
                    },
                    "caption": "Employee Advances",
                    "lineItemType": "SourceCoA",
                    "baselineFigureId": "Assets",
                    "comparativeData": [
                      {
                        "value": 1162,
                        "comparandValue": 3621,
                        "percentageRatio": {
                          "value": 0.32
                        }
                      }
                    ],
                    "subtotals": []
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "id": "LiabilitiesAndEquity",
        "caption": "Total Liabilities and Equity",
        "lineItemType": "ClassificationSubtotal",
        "baselineFigureId": "Assets",
        "comparativeData": [
          {
            "value": 3621,
            "comparandValue": 3621,
            "percentageRatio": {
              "value": 1
            }
          }
        ],
        "subtotals": [
          {
            "id": "Liabilities",
            "caption": "Total Liabilities",
            "lineItemType": "ClassificationSubtotal",
            "baselineFigureId": "Assets",
            "comparativeData": [
              {
                "value": 10277,
                "comparandValue": 3621,
                "percentageRatio": {
                  "value": 2.84
                }
              }
            ],
            "subtotals": [
              {
                "id": "CurrentLiabilities",
                "caption": "Total Current Liabilities",
                "lineItemType": "ClassificationSubtotal",
                "baselineFigureId": "Assets",
                "comparativeData": [
                  {
                    "value": 9000,
                    "comparandValue": 3621,
                    "percentageRatio": {
                      "value": 2.49
                    }
                  }
                ],
                "subtotals": [
                  {
                    "id": "CreditCardDebt",
                    "caption": "Total Credit Card Debt",
                    "lineItemType": "ClassificationSubtotal",
                    "baselineFigureId": "Assets",
                    "comparativeData": [
                      {
                        "value": 13,
                        "comparandValue": 3621,
                        "percentageRatio": {
                          "value": 2.49
                        }
                      }
                    ],
                    "subtotals": [
                      {
                        "id": "coa-account-14",
                        "accountRef": {
                          "accountId": "14"
                        },
                        "caption": "Visa CC",
                        "lineItemType": "SourceCoA",
                        "baselineFigureId": "Assets",
                        "comparativeData": [
                          {
                            "value": 13,
                            "comparandValue": 3621,
                            "percentageRatio": {
                              "value": 2.49
                            }
                          }
                        ],
                        "subtotals": []
                      }
                    ]
                  },
                  {
                    "id": "AccountsPayable",
                    "caption": "Total Accounts Payable",
                    "lineItemType": "ClassificationSubtotal",
                    "baselineFigureId": "Assets",
                    "comparativeData": [
                      {
                        "value": -56,
                        "comparandValue": 3621,
                        "percentageRatio": {
                          "value": -0.02
                        }
                      }
                    ],
                    "subtotals": [
                      {
                        "id": "coa-account-13",
                        "accountRef": {
                          "accountId": "13"
                        },
                        "caption": "Trade Payables",
                        "lineItemType": "SourceCoA",
                        "baselineFigureId": "Assets",
                        "comparativeData": [
                          {
                            "value": -56,
                            "comparandValue": 3621,
                            "percentageRatio": {
                              "value": -0.02
                            }
                          }
                        ],
                        "subtotals": []
                      }
                    ]
                  },
                  {
                    "id": "OtherCurrentLiability",
                    "caption": "Total Other Current Liabilities",
                    "lineItemType": "ClassificationSubtotal",
                    "baselineFigureId": "Assets",
                    "comparativeData": [
                      {
                        "value": 9043,
                        "comparandValue": 3621,
                        "percentageRatio": {
                          "value": 2.5
                        }
                      }
                    ],
                    "subtotals": [
                      {
                        "id": "coa-account-15",
                        "accountRef": {
                          "accountId": "15"
                        },
                        "caption": "Sales Tax Payable",
                        "lineItemType": "SourceCoA",
                        "baselineFigureId": "Assets",
                        "comparativeData": [
                          {
                            "value": 9043,
                            "comparandValue": 3621,
                            "percentageRatio": {
                              "value": 2.5
                            }
                          }
                        ],
                        "subtotals": []
                      }
                    ]
                  }
                ]
              },
              {
                "id": "NonCurrentLiability",
                "caption": "Total Non-Current Liabilities",
                "lineItemType": "ClassificationSubtotal",
                "baselineFigureId": "Assets",
                "comparativeData": [
                  {
                    "value": 1277,
                    "comparandValue": 3621,
                    "percentageRatio": {
                      "value": 0.35
                    }
                  }
                ],
                "subtotals": [
                  {
                    "id": "coa-account-16",
                    "accountRef": {
                      "accountId": "16"
                    },
                    "caption": "PPP Loan",
                    "lineItemType": "SourceCoA",
                    "baselineFigureId": "Assets",
                    "comparativeData": [
                      {
                        "value": 1277,
                        "comparandValue": 3621,
                        "percentageRatio": {
                          "value": 0.35
                        }
                      }
                    ],
                    "subtotals": []
                  }
                ]
              }
            ]
          },
          {
            "id": "Equity",
            "caption": "Total Equity",
            "lineItemType": "ClassificationSubtotal",
            "baselineFigureId": "Assets",
            "comparativeData": [
              {
                "value": -6656,
                "comparandValue": 3621,
                "percentageRatio": {
                  "value": -1.84
                }
              }
            ],
            "subtotals": [
              {
                "id": "OwnerShareholderOrPartnerEquity",
                "caption": "Total Owner, Shareholder, or Partner Equity",
                "lineItemType": "ClassificationSubtotal",
                "baselineFigureId": "Assets",
                "comparativeData": [
                  {
                    "value": 50,
                    "comparandValue": 3621,
                    "percentageRatio": {
                      "value": 0.01
                    }
                  }
                ],
                "subtotals": [
                  {
                    "id": "coa-account-17",
                    "accountRef": {
                      "accountId": "17"
                    },
                    "caption": "Common Share Capital",
                    "lineItemType": "SourceCoA",
                    "baselineFigureId": "Assets",
                    "comparativeData": [
                      {
                        "value": 50,
                        "comparandValue": 3621,
                        "percentageRatio": {
                          "value": 0.01
                        }
                      }
                    ],
                    "subtotals": []
                  }
                ]
              },
              {
                "id": "RetainedEarnings",
                "caption": "Total Retained Earnings",
                "lineItemType": "ClassificationSubtotal",
                "baselineFigureId": "Assets",
                "comparativeData": [
                  {
                    "value": 6706,
                    "comparandValue": 3621,
                    "percentageRatio": {
                      "value": -1.84
                    }
                  }
                ],
                "subtotals": [
                  {
                    "id": "PriorYearEarningsAndAdjustments",
                    "caption": "Total Prior Year Earnings and Adjustments",
                    "lineItemType": "ClassificationSubtotal",
                    "baselineFigureId": "Assets",
                    "comparativeData": [
                      {
                        "value": -6587,
                        "comparandValue": 3621,
                        "percentageRatio": {
                          "value": -1.82
                        }
                      }
                    ],
                    "subtotals": [
                      {
                        "id": "coa-account-18",
                        "accountRef": {
                          "accountId": "18"
                        },
                        "caption": "Retained Profits",
                        "lineItemType": "SourceCoA",
                        "baselineFigureId": "Assets",
                        "comparativeData": [
                          {
                            "value": -6587,
                            "comparandValue": 3621,
                            "percentageRatio": {
                              "value": -1.82
                            }
                          }
                        ],
                        "subtotals": []
                      }
                    ]
                  },
                  {
                    "id": "CurrentYearEarnings",
                    "caption": "Current Year Earnings",
                    "lineItemType": "ClassificationSubtotal",
                    "baselineFigureId": "Assets",
                    "comparativeData": [
                      {
                        "value": -119,
                        "comparandValue": 3621,
                        "percentageRatio": {
                          "value": -0.03
                        }
                      }
                    ],
                    "subtotals": []
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialStatements/VerticalAnalysis

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization associated with the financial data.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
reportingPeriod query ReportingPeriod false The reporting period for which the Vertical Analysis will be run. The default is per fiscal year if not specified.
balanceSheetBaseFigures query BalanceSheetBaseFigures false Used to select the set of Balance Sheet line items to use as base figures against which other line items are compared. The default if not specified is to compare all line items against Total Assets.
incomeStatementBaseFigures query IncomeStatementBaseFigures false Used to select the set of Income Statement items to use as base figures against which other line items are compared. The default if not specified is to compare all line items against Net Sales.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK VerticalAnalysis
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Request a Financial Review

The purpose of a Financial Review is to detect if imported financial data may be incomplete or unreliable. This works by running a comprehensive set of checks designed to uncover any missing or questionable data points. Detailed documentation for this feature can be found here.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialReview HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialReview \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialReview' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialReview",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialReview"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialReview"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialReview", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialReview")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "checks": [
    {
      "id": "InactivityHistoricPeriods",
      "category": "Missing Historic Periods",
      "outcome": "Fail",
      "outcomeDescription": "The provided financial statements contain business activity first starting August 01 2019. If the company was in operation from January 01 2018 to July 31 2019, the financial data is missing.",
      "fromDate": "2018-01-01",
      "toDate": "2021-09-25"
    },
    {
      "id": "MissingFigure_NetSales",
      "category": "Missing Figures",
      "outcome": "Fail",
      "outcomeDescription": "'Net Sales' is missing from the financial statements for the period ending January 31 2019. This could mean that the statements are incomplete or misrepresented.",
      "fromDate": "2019-01-01",
      "toDate": "2019-01-31"
    },
    {
      "id": "InactivityBalanceSheet_Cash",
      "category": "Missing Balance Sheet Activity",
      "outcome": "Fail",
      "outcomeDescription": "No 'Cash' activity was reported on the financial statements for the period ending January 31 2019. This could indicate that the financial data is incomplete or unreliable.",
      "fromDate": "2019-01-01",
      "toDate": "2019-01-31"
    },
    {
      "id": "NegativeFigure_CurrentAssets",
      "category": "Negative Figures",
      "outcome": "Fail",
      "outcomeDescription": "'Current Assets' is reported on the financial statements as a negative value for the period ending January 31 2019. This could indicate a misclassification such as assets vs liabilities, or revenue vs expenses.",
      "fromDate": "2019-01-01",
      "toDate": "2019-01-31"
    },
    {
      "id": "Correlation_CogsOrCos_With_NetSales",
      "category": "Missing Correlations",
      "outcome": "Fail",
      "outcomeDescription": "Expected a correlation between COGS/COS and Net Sales reported on the financial statements. Net Sales was unchanged for the period ending March 31 2020, but was expected to increase because of the 33,257.99 DR to COGS/COS.",
      "fromDate": "2020-03-01",
      "toDate": "2020-03-31"
    },
    {
      "id": "Equality_AccountingEquation",
      "category": "Equalities",
      "outcome": "Pass",
      "outcomeDescription": "Verified the equality 'Total Assets = Total Liabilities + Total Equity'.",
      "fromDate": "2021-01-01",
      "toDate": "2021-01-31"
    },
    {
      "id": "InactivityMostRecentPeriod",
      "category": "Information Out-Of-Date",
      "outcome": "Pass",
      "outcomeDescription": "The company's financial statements appear to have been at least partially maintained up-to September 25 2021.",
      "fromDate": "2018-01-01",
      "toDate": "2021-09-25"
    },
    {
      "id": "Continuity_IncomeStatement_CurrentYearEarnings",
      "category": "Continuity",
      "outcome": "Pass",
      "outcomeDescription": "The YTD running total for the PNL line item 'Current Year Earnings' matches the total reported for the prior period plus activity for the period ending January 31 2021.",
      "fromDate": "2021-01-01",
      "toDate": "2021-01-31"
    },
    {
      "id": "TrialBalance",
      "category": "Trial Balance",
      "outcome": "Pass",
      "outcomeDescription": "The company's Trial Balance has been verified for the reporting period.",
      "fromDate": "2021-01-01",
      "toDate": "2021-01-31"
    },
    {
      "id": "BenfordsLaw_BalanceSheet_KSTest",
      "category": "Forensic Accounting",
      "outcome": "Pass",
      "outcomeDescription": "The ending balances of accounts appearing on the financial statements adhere to Benford's Law.",
      "fromDate": "2018-01-01",
      "toDate": "2021-09-25"
    }
  ]
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/FinancialReview

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization associated with the financial data.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK FinancialReview
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

List Financial Workbooks

Use this endpoint to list the set of Financial Workbooks that were addded to the Financial Record.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "workbooks": [
    {
      "variantId": "FullAnalysis",
      "filename": "STRONGBOX FULL ANALYSIS - ABC PLUMBING.XLSX",
      "creationTime": "2020-05-06T23:01:01.0010000+00:00"
    },
    {
      "variantId": "CustomerDataCopy",
      "filename": "ABC PLUMBING - CUSTOMER COPY.XLSX",
      "creationTime": "2020-05-06T23:01:01.0010000+00:00"
    }
  ]
}

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization for which financials were imported.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK FinancialWorkbooksList
401 Unauthorized
403 Forbidden Forbidden
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Download a Financial Workbook

Use this endpoint to download one of our Excel Workbooks. The response will be an Excel file with the .xlsx extension.

Example

GET /Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks/{variantId} HTTP/1.1
Accept: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks/{variantId} \
  --header 'Accept: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks/{variantId}' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks/{variantId}",
  "headers": {
    "Accept": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks/{variantId}"),
    Headers =
    {
        { "Accept", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks/{variantId}"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks/{variantId}", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks/{variantId}")
  .header("Accept", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

Request

GET https://api.strongbox.link/Organizations/{orgId}/FinancialRecords/{financialRecordId}/Workbooks/{variantId}

URI parameters
Name In Type Required Description
orgId path string true An identifier for the organization for which financials were imported.
financialRecordId path string(uuid) true An identifier for the Financial Record from which to pull the requested financial data.
variantId path string true An identifier for the specific Financial Workbook variant to download.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK string
401 Unauthorized
403 Forbidden Forbidden
404 Not Found NotFound
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
200 Content-Type string application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
200 Content-Disposition string Used to specify the file name associated with the Workbook.
401 WWW-Authenticate string Bearer

Setup a Webhook

WebHooks offer a convenient way to get notified when new financial data becomes available. Cruise through the topics below to get the details you'll need to implement your Webhook.

  1. Get started by reading about the request and message that you can expect to receive.
  2. Familiarize yourself with the the events that can trigger a notification to your Webhook.
  3. Learn how to secure your Webhook.
  4. Register your Webhook via the Strongbox API.
  5. Finally, learn how to manage your Webhooks via the list and delete APIs.

The request sent to your Webhook

You can expect the following request to be sent to your Webhook. Responding with a 204 Status Code makes sense, but any successful status code will do.

If your Webhook is not available, or does not respond with a 2xx HTTP Status Code within 30 seconds, we will attempt to call your Webhook again every hour for up to 24 hours.

WebhookMessage

{
  "eventType": "v1.financialrecord.created",
  "payload": {
    "financialRecordId": "2db85e6a-ebff-4f07-a427-567d635c6462",
    "orgId": "e0003fa6-68d5-4616-a8e5-4d49e6912452"
  },
  "timestamp": "2020-01-01T15:21:54.0000000+00:00",
  "uuid": "76131598-5d3a-4cb4-9515-d86bfda4bf1a"
}

Example

POST /Webhooks/Example HTTP/1.1
Content-Type: application/json
Accept: application/json
X-Webhook-Signature: {HMAC-SHA256-SIGNATURE}
Host: yoursite.com
Content-Length: 254

{"eventType":"v1.financialrecord.created","payload":{"financialRecordId":"2db85e6a-ebff-4f07-a427-567d635c6462","orgId":"e0003fa6-68d5-4616-a8e5-4d49e6912452"},"timestamp":"2020-01-01T15:21:54.0000000+00:00","uuid":"76131598-5d3a-4cb4-9515-d86bfda4bf1a"}
curl --request POST \
  --url https://yoursite.com/Webhooks/Example \
  --header 'Accept: application/json' \
  --header 'X-Webhook-Signature: {HMAC-SHA256-SIGNATURE}' \
  --header 'Content-Type: application/json' \
  --data '{"eventType":"v1.financialrecord.created","payload":{"financialRecordId":"2db85e6a-ebff-4f07-a427-567d635c6462","orgId":"e0003fa6-68d5-4616-a8e5-4d49e6912452"},"timestamp":"2020-01-01T15:21:54.0000000+00:00","uuid":"76131598-5d3a-4cb4-9515-d86bfda4bf1a"}'
$headers=@{}
$headers.Add("Content-Type", "application/json")
$headers.Add("Accept", "application/json")
$headers.Add("X-Webhook-Signature", "{HMAC-SHA256-SIGNATURE}")
$response = Invoke-WebRequest -Uri 'https://yoursite.com/Webhooks/Example' -Method POST -Headers $headers -ContentType 'undefined' -Body '{"eventType":"v1.financialrecord.created","payload":{"financialRecordId":"2db85e6a-ebff-4f07-a427-567d635c6462","orgId":"e0003fa6-68d5-4616-a8e5-4d49e6912452"},"timestamp":"2020-01-01T15:21:54.0000000+00:00","uuid":"76131598-5d3a-4cb4-9515-d86bfda4bf1a"}'
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "yoursite.com",
  "port": null,
  "path": "/Webhooks/Example",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Webhook-Signature": "{HMAC-SHA256-SIGNATURE}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(JSON.stringify({
  eventType: 'v1.financialrecord.created',
  payload: {
    financialRecordId: '2db85e6a-ebff-4f07-a427-567d635c6462',
    orgId: 'e0003fa6-68d5-4616-a8e5-4d49e6912452'
  },
  timestamp: '2020-01-01T15:21:54.0000000+00:00',
  uuid: '76131598-5d3a-4cb4-9515-d86bfda4bf1a'
}));
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://yoursite.com/Webhooks/Example"),
    Headers =
    {
        { "Content-Type", "application/json" },
        { "Accept", "application/json" },
        { "X-Webhook-Signature", "{HMAC-SHA256-SIGNATURE}" },
    },
    Content = new StringContent("{\"eventType\":\"v1.financialrecord.created\",\"payload\":{\"financialRecordId\":\"2db85e6a-ebff-4f07-a427-567d635c6462\",\"orgId\":\"e0003fa6-68d5-4616-a8e5-4d49e6912452\"},\"timestamp\":\"2020-01-01T15:21:54.0000000+00:00\",\"uuid\":\"76131598-5d3a-4cb4-9515-d86bfda4bf1a\"}")
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/json")
        }
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://yoursite.com/Webhooks/Example"

	payload := strings.NewReader("{\"eventType\":\"v1.financialrecord.created\",\"payload\":{\"financialRecordId\":\"2db85e6a-ebff-4f07-a427-567d635c6462\",\"orgId\":\"e0003fa6-68d5-4616-a8e5-4d49e6912452\"},\"timestamp\":\"2020-01-01T15:21:54.0000000+00:00\",\"uuid\":\"76131598-5d3a-4cb4-9515-d86bfda4bf1a\"}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("Accept", "application/json")
	req.Header.Add("X-Webhook-Signature", "{HMAC-SHA256-SIGNATURE}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("yoursite.com")

payload = "{\"eventType\":\"v1.financialrecord.created\",\"payload\":{\"financialRecordId\":\"2db85e6a-ebff-4f07-a427-567d635c6462\",\"orgId\":\"e0003fa6-68d5-4616-a8e5-4d49e6912452\"},\"timestamp\":\"2020-01-01T15:21:54.0000000+00:00\",\"uuid\":\"76131598-5d3a-4cb4-9515-d86bfda4bf1a\"}"

headers = {
    'Content-Type': "application/json",
    'Accept': "application/json",
    'X-Webhook-Signature': "{HMAC-SHA256-SIGNATURE}"
    }

conn.request("POST", "/Webhooks/Example", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.post("https://yoursite.com/Webhooks/Example")
  .header("Content-Type", "application/json")
  .header("Accept", "application/json")
  .header("X-Webhook-Signature", "{HMAC-SHA256-SIGNATURE}")
  .body("{\"eventType\":\"v1.financialrecord.created\",\"payload\":{\"financialRecordId\":\"2db85e6a-ebff-4f07-a427-567d635c6462\",\"orgId\":\"e0003fa6-68d5-4616-a8e5-4d49e6912452\"},\"timestamp\":\"2020-01-01T15:21:54.0000000+00:00\",\"uuid\":\"76131598-5d3a-4cb4-9515-d86bfda4bf1a\"}")
  .asString();

Request

POST https://yoursite.com/Webhooks/Example

Header parameters
Name Required Description
X-Webhook-Signature true See Secure your Webhook.
Content-Type true The format of the request body will be application/json.
Body parameter
Property Type Required Restrictions Description
eventType string true none The type of event. This can be used as a discriminator for the type of payload.
payload any false none Reference the documentation for each event to get a description of the payload for that event. May be null for specific events.
timestamp string(date-time) true none The time at which the event occured.
uuid string(uuid) true none A unique identifier for the event being delivered to your Webhook.

Response

Status Description
204 No Content

Webhook Events

EventType Description
v1.financialrecord.created This event is used to signal that a Financial Record has been created.

When your Webhook receives this event you can expect the following payload, which includes everything you will need to export the newly aquired financial data.

{
  "financialRecordId": "2db85e6a-ebff-4f07-a427-567d635c6462",
  "orgId": "e0003fa6-68d5-4616-a8e5-4d49e6912452"
}

Property Type Required Restrictions Description
financialRecordId string true none An identifier for the newly created Financial Record.
orgId string true none An identifier for the Organization for which the Financial Record was created.

Secure your Webhook

When you create your Webhook, a sharedSecret is provisioned for it. You will need the sharedSecret in order to validate the incoming requests to your Webhook.

When we send a request, we will include an HMAC-SHA256 signature of the request body using your sharedSecret as the cryptographic key. The signature will be passed to you as the value of the X-Webhook-Signature header. Both the signature and the sharedSecret are Base64 encoded so the pseudo-code to validate a request is:

{X-Webhook-Signature} == Base64Encode(HMACSHA256.Digest(Base64Decode({SHARED_SECRET}), {REQUEST_BODY})).

Register a Webhook

Send the following request to create a Webhook Endpoint.

You will need to provide two parameters; a URL and a list of events you would like to receive. The URL for your Webhook MUST use the https scheme.

The most important component of the response is the sharedSecret, which can be used to secure your Webhook Endpoint.

WebhookEndpointParameters

{
  "events": [
    "v1.financialrecord.created"
  ],
  "url": "https://yoursite.example/strongbox-webhook"
}

Example

POST /Webhooks/WebhookEndpoints HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link
Content-Length: 92

{"events":["v1.financialrecord.created"],"url":"https://yoursite.example/strongbox-webhook"}
curl --request POST \
  --url https://api.strongbox.link/Webhooks/WebhookEndpoints \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}' \
  --header 'Content-Type: application/json' \
  --data '{"events":["v1.financialrecord.created"],"url":"https://yoursite.example/strongbox-webhook"}'
$headers=@{}
$headers.Add("Content-Type", "application/json")
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Webhooks/WebhookEndpoints' -Method POST -Headers $headers -ContentType 'undefined' -Body '{"events":["v1.financialrecord.created"],"url":"https://yoursite.example/strongbox-webhook"}'
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Webhooks/WebhookEndpoints",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(JSON.stringify({
  events: ['v1.financialrecord.created'],
  url: 'https://yoursite.example/strongbox-webhook'
}));
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://api.strongbox.link/Webhooks/WebhookEndpoints"),
    Headers =
    {
        { "Content-Type", "application/json" },
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
    Content = new StringContent("{\"events\":[\"v1.financialrecord.created\"],\"url\":\"https://yoursite.example/strongbox-webhook\"}")
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/json")
        }
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Webhooks/WebhookEndpoints"

	payload := strings.NewReader("{\"events\":[\"v1.financialrecord.created\"],\"url\":\"https://yoursite.example/strongbox-webhook\"}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

payload = "{\"events\":[\"v1.financialrecord.created\"],\"url\":\"https://yoursite.example/strongbox-webhook\"}"

headers = {
    'Content-Type': "application/json",
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("POST", "/Webhooks/WebhookEndpoints", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.post("https://api.strongbox.link/Webhooks/WebhookEndpoints")
  .header("Content-Type", "application/json")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .body("{\"events\":[\"v1.financialrecord.created\"],\"url\":\"https://yoursite.example/strongbox-webhook\"}")
  .asString();

201 Response

{
  "creationTime": "2020-09-01T22:34:01.0000000+00:00",
  "eventTypes": [
    "v1.financialrecord.created"
  ],
  "id": "76131598-5d3a-4cb4-9515-d86bfda4bf1a",
  "sharedSecret": "+hlItlVKw3QtBR6iK3gENjNq1j+mpit/SrajgM6OVXY=",
  "url": "https://yoursite.example/strongbox-webhook"
}

Request

POST https://api.strongbox.link/Webhooks/WebhookEndpoints

Header parameters
Name Required Description
Authorization true See Authorize your API requests.
Content-Type true The format of the request body. Must be application/json.
Body parameter
Type Required Description
WebhookEndpointParameters true Parameters for creating the Webhook Endpoint.

Response

Status Description Type
201 Created WebhookEndpoint
400 Bad Request BadRequest
401 Unauthorized
403 Forbidden Forbidden
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

List your Webhooks

Send the following request to list your Webhook Endpoints.

Example

GET /Webhooks/WebhookEndpoints HTTP/1.1
Accept: application/json
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request GET \
  --url https://api.strongbox.link/Webhooks/WebhookEndpoints \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Webhooks/WebhookEndpoints' -Method GET -Headers $headers
const http = require("https");

const options = {
  "method": "GET",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Webhooks/WebhookEndpoints",
  "headers": {
    "Accept": "application/json",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri("https://api.strongbox.link/Webhooks/WebhookEndpoints"),
    Headers =
    {
        { "Accept", "application/json" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Webhooks/WebhookEndpoints"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "application/json",
    'Authorization': "Bearer {access-token}"
    }

conn.request("GET", "/Webhooks/WebhookEndpoints", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.get("https://api.strongbox.link/Webhooks/WebhookEndpoints")
  .header("Accept", "application/json")
  .header("Authorization", "Bearer {access-token}")
  .asString();

200 Response

{
  "webhookEndpoints": [
    {
      "creationTime": "2020-09-01T22:34:01.0000000+00:00",
      "eventTypes": [
        "v1.financialrecord.created"
      ],
      "id": "76131598-5d3a-4cb4-9515-d86bfda4bf1a",
      "sharedSecret": "+hlItlVKw3QtBR6iK3gENjNq1j+mpit/SrajgM6OVXY=",
      "url": "https://yoursite.example/strongbox-webhook"
    }
  ]
}

Request

GET https://api.strongbox.link/Webhooks/WebhookEndpoints

Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
200 OK WebhookEndpointList
401 Unauthorized
403 Forbidden Forbidden
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Delete a Webhook

Send the following request to delete a Webhook Endpoint. This operation is idempotent.

Example

DELETE /Webhooks/WebhookEndpoints/{id} HTTP/1.1
Accept: text/plain
Authorization: Bearer {access-token}
Host: api.strongbox.link

curl --request DELETE \
  --url https://api.strongbox.link/Webhooks/WebhookEndpoints/{id} \
  --header 'Accept: text/plain' \
  --header 'Authorization: Bearer {access-token}'
$headers=@{}
$headers.Add("Accept", "text/plain")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/Webhooks/WebhookEndpoints/{id}' -Method DELETE -Headers $headers
const http = require("https");

const options = {
  "method": "DELETE",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/Webhooks/WebhookEndpoints/{id}",
  "headers": {
    "Accept": "text/plain",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Delete,
    RequestUri = new Uri("https://api.strongbox.link/Webhooks/WebhookEndpoints/{id}"),
    Headers =
    {
        { "Accept", "text/plain" },
        { "Authorization", "Bearer {access-token}" },
    },
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/Webhooks/WebhookEndpoints/{id}"

	req, _ := http.NewRequest("DELETE", url, nil)

	req.Header.Add("Accept", "text/plain")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

headers = {
    'Accept': "text/plain",
    'Authorization': "Bearer {access-token}"
    }

conn.request("DELETE", "/Webhooks/WebhookEndpoints/{id}", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.delete("https://api.strongbox.link/Webhooks/WebhookEndpoints/{id}")
  .header("Accept", "text/plain")
  .header("Authorization", "Bearer {access-token}")
  .asString();

Request

DELETE https://api.strongbox.link/Webhooks/WebhookEndpoints/{id}

URI parameters
Name In Type Required Description
id path string(uuid) true An identifier for the Webhook Endpoint to delete.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.

Response

Status Description Type
204 No Content
400 Bad Request BadRequest
401 Unauthorized
403 Forbidden Forbidden
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Web Portal Management

Under construction

The documentation for Web Portal management is under construction.

Initialize a listed Organization

Send the following request to change how an Organization appears in the Strongbox Web Portal. By default, the Organization is listed using the name that was imported from the Accounting System, but this API can be used to configure the name that appears explicitly.

This operation has no effect on an Organization that has already been initialized, and is designed specifically for use by client-side code that is operating with very limited API access.

InitializeOrganizationParameters

{
  "displayName": "ABC Plumbing Inc."
}

Example

POST /WebPortal/Organizations/{orgId}/Initialize HTTP/1.1
Content-Type: application/json
Accept: text/plain
Authorization: Bearer {access-token}
Host: api.strongbox.link
Content-Length: 35

{"displayName":"ABC Plumbing Inc."}
curl --request POST \
  --url https://api.strongbox.link/WebPortal/Organizations/{orgId}/Initialize \
  --header 'Accept: text/plain' \
  --header 'Authorization: Bearer {access-token}' \
  --header 'Content-Type: application/json' \
  --data '{"displayName":"ABC Plumbing Inc."}'
$headers=@{}
$headers.Add("Content-Type", "application/json")
$headers.Add("Accept", "text/plain")
$headers.Add("Authorization", "Bearer {access-token}")
$response = Invoke-WebRequest -Uri 'https://api.strongbox.link/WebPortal/Organizations/{orgId}/Initialize' -Method POST -Headers $headers -ContentType 'undefined' -Body '{"displayName":"ABC Plumbing Inc."}'
const http = require("https");

const options = {
  "method": "POST",
  "hostname": "api.strongbox.link",
  "port": null,
  "path": "/WebPortal/Organizations/{orgId}/Initialize",
  "headers": {
    "Content-Type": "application/json",
    "Accept": "text/plain",
    "Authorization": "Bearer {access-token}"
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(JSON.stringify({displayName: 'ABC Plumbing Inc.'}));
req.end();
var client = new HttpClient();
var request = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://api.strongbox.link/WebPortal/Organizations/{orgId}/Initialize"),
    Headers =
    {
        { "Content-Type", "application/json" },
        { "Accept", "text/plain" },
        { "Authorization", "Bearer {access-token}" },
    },
    Content = new StringContent("{\"displayName\":\"ABC Plumbing Inc.\"}")
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/json")
        }
    }
};
using (var response = await client.SendAsync(request))
{
    response.EnsureSuccessStatusCode();
    var body = await response.Content.ReadAsStringAsync();
    Console.WriteLine(body);
}
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://api.strongbox.link/WebPortal/Organizations/{orgId}/Initialize"

	payload := strings.NewReader("{\"displayName\":\"ABC Plumbing Inc.\"}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("Accept", "text/plain")
	req.Header.Add("Authorization", "Bearer {access-token}")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
import http.client

conn = http.client.HTTPSConnection("api.strongbox.link")

payload = "{\"displayName\":\"ABC Plumbing Inc.\"}"

headers = {
    'Content-Type': "application/json",
    'Accept': "text/plain",
    'Authorization': "Bearer {access-token}"
    }

conn.request("POST", "/WebPortal/Organizations/{orgId}/Initialize", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
HttpResponse<String> response = Unirest.post("https://api.strongbox.link/WebPortal/Organizations/{orgId}/Initialize")
  .header("Content-Type", "application/json")
  .header("Accept", "text/plain")
  .header("Authorization", "Bearer {access-token}")
  .body("{\"displayName\":\"ABC Plumbing Inc.\"}")
  .asString();

Request

POST https://api.strongbox.link/WebPortal/Organizations/{orgId}/Initialize

URI parameters
Name In Type Required Description
orgId path string true An identifier for the Organization to initialize.
Header parameters
Name Required Description
Authorization true See Authorize your API requests.
Content-Type true The format of the request body. Must be application/json.
Body parameter
Type Required Description
InitializeOrganizationParameters true The request to initialize the Organization.

Response

Status Description Type
204 No Content
400 Bad Request BadRequest
401 Unauthorized
403 Forbidden Forbidden
500 Internal Server Error
503 Service Unavailable
Headers
Status Header Type Format Description
401 WWW-Authenticate string Bearer

Feature guides

Financial Ratios

Financial Ratios are a core component of financial statement analysis and are used by management, investors, and creditors in order to quantify key aspects of business health and performance.

All ratios work by comparing the relative magnitude of line items appearing on the financial statements using well-established formulas. However, the purpose and interpretation of each ratio varies greatly. Fortunately, the most common ratios can be organized into just a few categories, which reduces the learning curve dramatically.

Reference the following subtopics for a detailed explanation of the Financial Ratios. The full set of supported ratios are also listed here.

Ratio Categories

Liquidity

Liquidity Ratios measure the ability of a company to pay its short-term debts.

Current Ratio

The Current Ratio compares a firm's Current Assets to it's Current Liabilities using totals reported on the Balance Sheet. It is a high-level measure of the company's ability to pay its short-term debts.

Formula

Current Ratio = Total Current Assets / Total Current Liabilities

Interpretation

A Current Ratio below 1 may indicate that the company does not have enough funds to meet its short-term obligations.

On the other hand, a Current Ratio that is too high may be an indicator that the company could better utilize it's current assets or benefit from leveraging more short-term debt.

Also known as: Working Capital Ratio

Quick Ratio

The Quick Ratio is similar to the Current Ratio, but is more conservative because it only includes Current Assets that are expected be convertible to cash within 90 days.

Formula

Quick Ratio = (Cash + Marketable Securities + Accounts Receivable) / Total Current Liabilities

Also known as: Acid-Test Ratio

Cash Ratio

The Cash Ratio is the most conservative liquidity ratio because it measures the ability of the company to pay it's Current Liabilities from Cash And Equivalents alone.

Formula

Cash Ratio = (Cash + Marketable Securities) / Total Current Liabilities

Solvency

Solvency ratios, also known as Leverage or Debt ratios, measure the ability of the company to repay their long-term debt.

Debt To Assets

Formula

Debt To Assets = Total Liabilities / Total Assets

Also known as: Debt Ratio, Total Debt To Total Assets

Debt To Equity

Formula

Debt To Equity = Total Liabilities / Total Equity

Also known as: D/E

Long-term Debt To Equity

Formula

Long-term Debt To Equity = Total Non-Current Liabilities / Total Equity

Equity To Assets

Formula

Equity To Assets = Total Equity / Total Assets

Also known as: Equity Ratio

Profitability

Profitability Ratios measure the ability of a company to turn a profit and can be organized into two subcategories.

Margin Ratios gauge how well a company is managing its expenses in order to generate profits.

Return Ratios are designed to measure how effectively the company is utilizing its assets and financing funds to generate profits.

Gross Profit Margin

Formula

Gross Profit Margin = Gross Profit / Net Sales

Also known as: Gross Margin

Operating Profit Margin

Formula

Operating Profit Margin = Operating Profit / Net Sales

Also known as: Operating Margin, Operating Income Margin, Return on Sales (ROS)

Net Profit Margin

Formula

Net Profit Margin = Net Income / Net Sales

Also known as: Net Margin, Profit Margin

Return On Assets

Formula

Return On Assets = Net Income / Total Assets

Also known as: ROA

Return On Net Assets

Formula

Return On Net Assets = Net Income / (Fixed Assets + Working Capital)

where

Working Capital = Total Current Assets - Total Current Liabilities

Also known as: RONA

Return On Equity

Formula

Return On Equity = Net Income / Average Total Equity

Also known as: ROE

Return On Debt

Formula

Return On Debt = Net Income / Average Total Liabilities

Also known as: ROD

Return On Capital

Formula

Return On Capital = Net Income / (Average Total Equity + Average Total Liabilities)

Also known as: ROC

Efficiency

Effeciency ratios, also known as Activity ratios, measure the ability of the company to convert their assets to cash.

Receivables Turnover

Formula

Receivables Turnover = Net Sales / Average Accounts Receivable

Also known as: Accounts Receivable Turnover, AR Turnover

Days Sales Outstanding

Formula

Days Sales Outstanding = Average Accounts Receivable / Average Sales Per Day

where

Average Sales Per Day = Net Sales / Number Of Days In Period

Also known as: DSO, Days Receivables, AR Days, Average Collection Period

Payables Turnover

Formula

Payables Turnover = (COGS + COS) / Average Accounts Payable

Also known as: Accounts Payable Turnover, AP Turnover

Days Payables Outstanding

Formula

Days Payables Outstanding = Average Accounts Payable / Average Expenses Per Day

where

Average Expenses Per Day = (COGS + COS) / Number Of Days In Period

Also known as: DPO, Days Payables, AP Days

Inventory Turnover

Formula

Inventory Turnover = COGS / Average Inventory

Also known as: Merchandise Turnover, Stock Turnover, Inventory Turns, Stock Turns

Days Inventory Outstanding

Formula

Days Inventory Outstanding = Average Inventory / Average COGS Per Day

where

Average COGS Per Day = COGS / Number Of Days In Period

Also known as: DIO, Days Sales Of Inventory (DSI), Inventory Days, Days In Inventory (DII)

Cash Conversion Cycle

Formula

Cash Conversion Cycle = Days Sales Outstanding + Days Inventory Outstanding - Days Payables Outstanding

Also known as: CCC, Cash Gap

Asset Turnover

Formula

Asset Turnover = Net Sales / Average Total Assets

Also known as: Total Asset Turnover Ratio

Working Capital Turnover

Formula

Working Capital Turnover = Net Sales / Average Working Capital

where

Working Capital = Total Current Assets - Total Current Liabilities

Also known as: Net Sales To Working Capital

Supplemental

Supplemental ratios can be added by customer request. Please reach out to our support team at support@strongbox.ai to learn more.

Current To Non-Current Assets

Formula

Current To Non-Current Assets = Total Current Assets / Total Non-Current Assets

Debt To Net Income

This ratio is simply the reciprocal of the Return On Debt ratio.

Formula

Debt To Net Income = Average Total Liabilities / Net Income

List of ratios

Id Display Name Category # Format
CurrentRatio Current Ratio Liquidity 1.6
QuickRatio Quick Ratio Liquidity 1.2
CashRatio Cash Ratio Liquidity 0.7
DebtToAssets Debt To Assets Solvency 1.9
DebtToEquity Debt To Equity Solvency 3.3
LongTermDebtToEquity Long-Term Debt To Equity Solvency 3.1
EquityToAssets Equity To Assets Solvency 0.1
GrossProfitMargin Gross Profit Margin Profitability 68%
OperatingProfitMargin Operating Profit Margin Profitability 35%
NetProfitMargin Net Profit Margin Profitability 29%
ReturnOnAssets Return On Assets Profitability 5%
ReturnOnNetAssets Return On Net Assets Profitability 10%
ReturnOnEquity Return On Equity Profitability 21%
ReturnOnDebt Return On Debt Profitability 15%
ReturnOnCapital Return On Capital Profitability 18%
AssetTurnover Asset Turnover Efficiency 0.6
ReceivablesTurnover Receivables Turnover Efficiency 0.9
WorkingCapitalTurnover Working Capital Turnover Efficiency 0.7
InventoryTurnover Inventory Turnover Efficiency 0.3
PayablesTurnover Payables Turnover Efficiency 0.6
DaysInventoryOutstanding Days Inventory Outstanding Efficiency 45 days
DaysSalesOutstanding Days Sales Outstanding Efficiency 33 days
DaysPayablesOutstanding Days Payables Outstanding Efficiency 38 days
CashFlowConversionCycle Cash Conversion Cycle Efficiency 40 days
CurrentToNonCurrentAssets Current To Non-Current Assets Supplemental 5.3
DebtToNetIncome Debt To Net Income Supplemental 5.3

Horizontal Analysis

Horizontal Analysis, also known as Trend Analysis, is a flexible technique that examines a company's financials over time to unlock powerful new insights. For example, it is commonly used to:

More specifically, a Horizontal Analysis works by comparing the line items reported on the financial statements, and the Financial Ratios, to the same metrics reported in a Baseline Period. The difference between the two periods is expressed as an absolute and a percentage change.

Formula

Absolute Change = Current Value - Baseline Value

Percentage Change = ( Current Value - Baseline Value ) / | Baseline Value |

There are several different methodologies for selecting a Baseline Period to compare against.

First Period

The most basic approach is to use the first available year, quarter, or month as the Baseline Period. This approach is most often used for measuring long-term trends and growth rates. One downside of this approach is that the historic data may becomes less and less relevant over time.

Prior Period

Comparing each period to the prior period is also relatively common. This includes Month over Month (MoM) and Quarter over Quarter (QoQ) analysis, which are both important for measuring short-term trends and growth rates. However, this type of comparison may be less useful when applied to companies with seasonal trends.

Year over Year

Year over Year (YoY) analysis compares a period from one fiscal year to the same period in the prior year. This type of analysis can be performed for Months, Quarters, or Annual periods. For example, January 2020 would be compared to January 2019 and Q1 2020 to Q1 2019. The primary advantage of a YoY analysis is that it is unaffected by seasonality.

Financial Statement Line Items

The following line items are included in the Horizontal Analysis

Id Display Name Financial Statement(s)
Assets Total Assets Balance Sheet
CurrentAssets Total Current Assets Balance Sheet
Cash Total Cash Balance Sheet
AccountsReceivable Total Accounts Receivable Balance Sheet
Inventory Total Inventory Balance Sheet
OtherCurrentAsset Total Other Current Assets Balance Sheet
NonCurrentAssets Total Non-Current Assets Balance Sheet
GrossNonCurrentAssets Gross Non-Current Assets Balance Sheet
ContraNonCurrentAsset Total Depreciation, Depletion, Amortization, and Impairment Balance Sheet
LiabilitiesAndEquity Total Liabilities & Equity Balance Sheet
Liabilities Total Liabilities Balance Sheet
CurrentLiabilities Total Current Liabilities Balance Sheet
CreditCardDebt Total Credit Card Debt Balance Sheet
AccountsPayable Total Accounts Payable Balance Sheet
OtherCurrentLiability Total Other Current Liabilities Balance Sheet
NonCurrentLiability Total Non-Current Liabilities Balance Sheet
Equity Total Equity Balance Sheet
OwnerShareholderOrPartnerEquity Total Owner, Shareholder, or Partner Equity Balance Sheet
RetainedEarnings Total Retained Earnings Balance Sheet
PriorYearEarningsAndAdjustments Total Prior Year Earnings and Adjustments Balance Sheet
CurrentYearEarnings Net Income Balance Sheet & Income Statement
NetSales Net Sales Income Statement
CogsOrCos COGS/COS Income Statement
GrossProfit Gross Profit Income Statement
OperatingExpense Operating Expenses Income Statement
OperatingProfit Operating Profit Income Statement
NonOperatingIncomeOrExpense Non-Operating Income and Expenses Income Statement

Vertical Analysis

Under construction

The documentation for Vertical Analysis is under construction.

Financial Review

The purpose of a Financial Review is to detect if the financial data that was provided to you may be incomplete or unreliable. This works by running a comprehensive set of checks designed to uncover any missing or questionable data points. Each check has an outcome that will be either Pass, Fail, or Inconclusive. In the failure case a detailed description of the potential issue is provided.

The core features provided by a Financial Review are summarized below. A complete list of the checks can be found here.

Checks for completeness

Information out-of-date

Having up-to-date financial data is often desirable for analysis. However, it is not uncommon for a company's books to go weeks or even months between updates. These checks provide some assurance that the books have been actively maintained up to the requested reporting period.

Example
Financial Statements are collected from the accounting system on August 5th, and are expected to be up-to-date to the day. However, the bookkeeper regularly records business transactions once per month for the prior month on the 10th. Consequently, data from July 1st to August 5th is missing, and the financial data is flagged as being out-of-date.

Missing historic periods

The financials are examined to ensure that data is available for the full time period that was requested. If data was unavailable for a historic period, and the business was in operation during that period, then the financial data is missing.

Example
A business that has been operation for over ten years transitioned from QuickBooks Desktop to QuickBooks Online starting January 1st 2020. They decided not to migrate any data from their company file prior to 2020 into QuickBooks Online. Two full years of financial statements are requested from QuickBooks Online on August 5th 2021, and the missing history for 2019 is detected.

Missing figures

Totals that will appear on the vast majority of financial statements are checked to ensure they are respresented (and non-zero). This includes Net Sales, Operating Expenses, Total Assets, Total Liabilities, and Total Equity. If one of these totals do not appear for a reporting period it could indicate that the financial data is incomplete.

Example
No Assets are listed on a company's Balance Sheet, but would be expected to appear in the vast majority of cases. The total is flagged as missing because Total Assets = 0.

Missing Balance Sheet activity

Normal business operations typically generate Balance Sheet activity (net change between periods) such as changes to the company's Cash balance. If no such activity is reported on the financial statements it could mean that the financial data is incomplete for the reporting period.

Example
The business's Cash balance reported on the their Balance Sheets has not changed for over 18 months. This unexpected inactivity is flagged for review.

Trial balance

Double entry accounting allows for a simple yet effective high-level check on the accounting data referred to as a Trial Balance. This works by totalling all credits and debits separately and checking that they are equal (Total Credits = Total Debits). If any accounting figures are omitted the Trial Balance check would most likely fail.

Example
A bug in the accounting system causes a Sales entry for $500,000 dollars to be deleted from the General Ledger without affecting the corresponding entry to Accounts Receivable. The Trial Balance check fails because the General Ledger is out-of-balance by $500,000, which is reflected in the totals reported on the Financial Statements.

Checks for reliability

Equalities

Standard accounting practices ensure that many equalities can be found on the Financial Statements for any given company, and these can be verified.

Well-known examples are the accounting equation, defined by:

Assets = Liabilities + Equity

And the equation defining the relationship between the Balance Sheet and Income Statement:

Retained Earnings = Current Year Earnings + Prior Year Earnings and Adjustments

Other equalities that are expected to always hold for a Balance Sheet are:

Total Assets = Current Assets + Non-Current Assets

Total Liabilities = Current Liabilities + Non-Current Liabilities

And for the Income Statement:

Gross Profit = Net Sales - COGS/COS

Operating Profit = Gross Profit - Operating Expenses

Current Year Earnings = Operating Profit + Non-Operating Income and Expenses

If any of these equalities were not to hold it could indicate a significant issue with the financial data.

Example
A bug processing data from the accounting system results in data loss related to Operating Expenses. The issue is detected because the equality Operating Profit = Gross Profit - Operating Expenses no longer holds for the figures reported on the Income Statement.

Continuity

A company's Financial Statements for any given reporting period are expected to relate perfectly to the Financial Statements for the prior period.

Balance Sheet line items are related by the following equation:

Ending Balance = Net Activity + Prior Period Ending Balance

Similarly, for line items appearing on the Income Statements the following equation applies:

YTD Total = Net Activity + Prior Period YTD Total

Fiscal year end boundaries are a special case, where the relationship between Retained Earnings and Income Statement accounts applies.

Verifying that these relationships hold is an essential test for the integrity of the financial data.

Example
A leap year bug in the accounting system causes financial statements for February of 2020 to be run on the 28th rather than the 29th. Consequently, over a million dollars of transactions occuring on the 29th are not reported for the month of Februrary. The issue is detected because ending balances for February 2020 plus activity for March 2020 do not correspond to the ending balances reported for March 2020.

Negative figures

Many of the figures reported on the Financial Statements typically have a positive total and a negative total could indicate a possible misclassification of the accounting data or worse.

Example
A business has reported Credit Card Debt and other line items as negative Current Assets rather than as Current Liabilities on their Balance Sheet. This artificially reduces the amount of short-term debt reported for the company, but the abnormal case is detected.

Missing correlations

Many relationships between line items appearing on the Financial Statements are highly correlated (not quite causal) and can be checked to detect anomolies in the data. Examples include:

Example
A business has reported that their Accounts Receivable have grown by over one million dollars over the last three months. However, there is no corresponding increase in Net Sales reported on the Income Statements. The increase to Accounts Receivable is flagged as highly questionable.

Forensic accounting

Benford's Law

Benford's Law is applied to the financial data to detect possible fraudulent activity. This works by comparing the actual distribution of first-digits appearing in the financial data with the expected frequency for datasets adhering to the law. More specifically, the KS test is used at a 0.001 significance level. The maximimum allowed difference from the expected distribution is calculated from the sample size N using the formula 1.949/√N.

If the financial data does not adhere to Benford's Law then a more detailed review of the transaction level data may be merited.

Example
A company has artifically inflated their Net Sales for the last twelve months by entering fictitious transactions into their Accounting System. Red flags are raised because the numbers reported do not correspond to the expected frequency distribution that would occur if they were produced from naturally occuring business transactions.

List of checks

Check Id Category Evaluation Style
Continuity_BalanceSheet_AccountsPayable Continuity Check per month
Continuity_BalanceSheet_AccountsReceivable Continuity Check per month
Continuity_BalanceSheet_Assets Continuity Check per month
Continuity_BalanceSheet_Cash Continuity Check per month
Continuity_BalanceSheet_ContraNonCurrentAsset Continuity Check per month
Continuity_BalanceSheet_CreditCardDebt Continuity Check per month
Continuity_BalanceSheet_CurrentAssets Continuity Check per month
Continuity_BalanceSheet_CurrentLiabilities Continuity Check per month
Continuity_BalanceSheet_Equity Continuity Check per month
Continuity_BalanceSheet_GrossNonCurrentAssets Continuity Check per month
Continuity_BalanceSheet_Inventory Continuity Check per month
Continuity_BalanceSheet_Liabilities Continuity Check per month
Continuity_BalanceSheet_LiabilitiesAndEquity Continuity Check per month
Continuity_BalanceSheet_NonCurrentAssets Continuity Check per month
Continuity_BalanceSheet_NonCurrentLiability Continuity Check per month
Continuity_BalanceSheet_OtherCurrentAsset Continuity Check per month
Continuity_BalanceSheet_OtherCurrentLiability Continuity Check per month
Continuity_BalanceSheet_OwnerShareholderOrPartnerEquity Continuity Check per month
Continuity_BalanceSheet_PriorYearEarningsAndAdjustments Continuity Check per month
Continuity_BalanceSheet_RetainedEarnings Continuity Check per month
Continuity_IncomeStatement_CogsOrCos Continuity Check per month
Continuity_IncomeStatement_CurrentYearEarnings Continuity Check per month
Continuity_IncomeStatement_GrossProfit Continuity Check per month
Continuity_IncomeStatement_NetSales Continuity Check per month
Continuity_IncomeStatement_NonOperatingIncomeOrExpense Continuity Check per month
Continuity_IncomeStatement_OperatingExpense Continuity Check per month
Continuity_IncomeStatement_OperatingProfit Continuity Check per month
Equality_AccountingEquation Equalities Check per month
Equality_GrossProfit Equalities Check per month
Equality_NetProfit Equalities Check per month
Equality_OperatingProfit Equalities Check per month
Equality_RetainedEarnings Equalities Check per month
Equality_TotalAssets Equalities Check per month
Equality_TotalLiabilities Equalities Check per month
BenfordsLaw_AccountActivity_KSTest Forensic Accounting Single check
BenfordsLaw_BalanceSheet_KSTest Forensic Accounting Single check
InactivityMostRecentPeriod Information Out-Of-Date Single check
InactivityBalanceSheet_Cash Missing Balance Sheet Activity Check per month
Correlation_AccountsReceivable_With_NetSales Missing Correlations Check per month
Correlation_CogsOrCos_With_NetSales Missing Correlations Check per month
MissingFigure_Assets Missing Figures Check per month
MissingFigure_LiabilitiesAndEquity Missing Figures Check per month
MissingFigure_NetSales Missing Figures Check per month
MissingFigure_OperatingExpense Missing Figures Check per month
InactivityHistoricPeriods Missing Historic Periods Single Check
NegativeFigure_CogsOrCos Negative Figures Check per month
NegativeFigure_CurrentAssets Negative Figures Check per month
NegativeFigure_CurrentLiabilities Negative Figures Check per month
NegativeFigure_NetSales Negative Figures Check per month
NegativeFigure_NonCurrentAssets Negative Figures Check per month
NegativeFigure_NonCurrentLiability Negative Figures Check per month
NegativeFigure_OperatingExpense Negative Figures Check per month
TrialBalance Trial Balance Check per month

Datasources

API Feature support

Core Features

Feature set Description
Connect datasource Connect and disconnect the datasource.
Import on demand Import financials on demand.
Multi-currency All exported financial data is represented in a single base currency as reported by the acccounting entity.
Datasource Connect datasource Import on demand Multi-currency
QuickBooks Online
QuickBooks Desktop
Xero
Sage Intacct
MYOB AccountRight Live Beta Release Under Development
MYOB Essentials Beta Release Under Development

Accounting

Feature set Description
Accounting Entity Export information about the organization for which the financial data was prepared.
Chart of Accounts Export the Chart Of Accounts that was used for preparing the financial data.
Account Totals Export the starting, ending, and total change in balance for each account by reporting period.
Transaction List Export accounting transactions.
Datasource Accounting Entity Chart of Accounts Account Totals Transaction List
QuickBooks Online
QuickBooks Desktop
Xero
Sage Intacct
MYOB AccountRight Live Not Scheduled
MYOB Essentials Not Scheduled

Financial Statements

Feature set Description
Balance Sheets Export balance sheets.
Income Statements Export income statements.
Financial Ratios Export financial ratios.
Datasource Balance Sheets Income Statements Financial Ratios
QuickBooks Online
QuickBooks Desktop
Xero
Sage Intacct
MYOB AccountRight Live
MYOB Essentials

Receivables and Payables

Feature set Description
Outstanding Receivables Export outstanding receivables.
Outstanding Payables Export outstanding payables.
Datasource Outstanding Receivables Outstanding Payables
QuickBooks Online
QuickBooks Desktop
Xero
Sage Intacct Beta Release Beta Release
MYOB AccountRight Live Not Scheduled Not Scheduled
MYOB Essentials Not Scheduled Not Scheduled

QuickBooks Online

User experience

When your customer connects their QuickBooks Online account they will be prompted to sign in, to choose a company, and finally to confirm access to their data.

Connect QuickBooks Online

Branding Guidelines

The user experience for connecting to QuickBooks Online should adhere to the style guidelines defined by Intuit. To simplify the UI development process we recommend adding our web widget to your website.

QuickBooks Desktop

User experience

In order for your customer to connect their QuickBooks Desktop company file, they will first be instructed on how to download and install Strongbox Connect.

Connect QuickBooks Desktop

After the installation, your customer must login to their company file as the Admin user, at which point they will be prompted to grant access to Strongbox Connect.

Connect QuickBooks Desktop

After granting access, your customer can then click the Share with Strongbox button from the Connect to QuickBooks Desktop webpage to complete the connection to their Quickbooks Desktop company file.

Connect QuickBooks Desktop

Xero

User experience

  1. When your customer connects Xero they will first be prompted to Log in to their account.
  2. Next, if the user has access to more than one organisation, they must choose one.
  3. Finally, clicking Allow access completes the process of connecting to Xero.
Connect Xero

Branding Guidelines

The user experience for connecting to Xero should adhere to these branding guidelines. To simplify the UI development process we recommend adding our web widget to your website.

Sage Intacct

Under construction

The documentation for Sage Intacct is under construction.

MYOB AccountRight Live

Under construction

The documentation for MYOB AccountRight Live is under construction.

MYOB Essentials

Under construction

The documentation for MYOB Essentials is under construction.

Request and response types

The following documentation on API requests and responses was generated from our OpenAPI 3 specification. To learn more about the API endpoints themselves refer to the Tutorials section of this document.

AccessTokenRequest

grant_type=client_credentials

Models a request that can be sent to an OAuth 2.0 Token Endpoint implementing the Client Credentials Grant.

Unlike most requests, this request MUST be sent using the application/x-www-form-urlencoded media type.

Property Type Required Restrictions Description
grant_type string true Must be client_credentials The OAuth 2.0 grant type. Only the client_credentials grant is supported.
scope string false none An optional set of scopes for which access is requested. If not specified, the full set of API scopes available to the client are used.

For your reference:

RFC 6749 Section 4.4.2. - Access Token Request

AccessTokenResponse

{
    "access_token":"2YotnFZFEjr1zCsicMWpAA",
    "token_type":"Bearer",
    "expires_in":21600
}

Models a response from an OAuth 2.0 Token Endpoint implementing the Client Credentials Grant.

Property Type Required Restrictions Description
access_token string true none The requested access token. Should be considered an opaque string.
token_type string true Always Bearer Specifies how the access token is to be used by the client. Will always be set to Bearer.
expires_in integer true none The number of seconds until the access_token expires relative to the response time.

For your reference:

RFC 6749 Section 5.1 - Successful Response

OAuth2ErrorResponse

{
    "error":"invalid_client",
    "error_description":"Authentication failed. Invalid client credentials."
}

Models an error response from an OAuth 2.0 Token Endpoint implementing the Client Credentials Grant.

Property Type Required Restrictions Description
error string true none An error code.
error_description string false none A description of the error.
error_uri string(uri) false none A URI for a webpage that documents the error.

For your reference:

RFC 6749 Section 5.2 - Error Response

Account

{
  "classification": [
    {
      "classificationId": "string",
      "taxonomyId": "string"
    }
  ],
  "description": "string",
  "id": "string",
  "kind": "Real",
  "name": "string",
  "role": "Bookkeeping",
  "subaccounts": [
    {
      "classification": [
        {
          "classificationId": "string",
          "taxonomyId": "string"
        }
      ],
      "description": "string",
      "id": "string",
      "kind": "Real",
      "name": "string",
      "role": "Bookkeeping",
      "subaccounts": [],
      "userAssignedCode": "string",
      "creationDate": "2019-08-24T14:15:22Z",
      "lastModifiedDate": "2019-08-24T14:15:22Z"
    }
  ],
  "userAssignedCode": "string",
  "creationDate": "2019-08-24T14:15:22Z",
  "lastModifiedDate": "2019-08-24T14:15:22Z"
}

Models an account listed in a Chart Of Accounts.

Property Type Required Restrictions Description
classification [AccountClassification] true none A set of classifications for the account used for financial analysis.
description string¦null false none A description of the account.
id string true none An identifier for the account, unique within the scope of the Chart Of Accounts associated with this account.
kind AccountKind true none The kind of an account can be either real or nominal.

name string true none A friendly name for the account.
role ChartOfAccountsRole true none Defines how an account appearing in the Chart Of Accounts is used.

subaccounts [Account] true none A hierarchical representation of any sub-accounts that are associated with this account. Sub-accounts are used to organize the Chart of Accounts for reporting purposes and may manifest themselves as subtotals in the presentaton of Financial Statements.
userAssignedCode string¦null false none A human-friendly alpha-numeric code or number as originally assigned to the account by the bookkeeper. If provided, this value may be helpful for classification, sorting, or as a secondary identifier for the account.
creationDate string(date-time)¦null false none The date on which the account was created, if known. This date is serialized to a string using the "YYYY-MM-DD" format as defined by ISO 8601-1:2019.
lastModifiedDate string(date-time)¦null false none The date on which the account was last modified, if known. This date is serialized to a string using the "YYYY-MM-DD" format as defined by ISO 8601-1:2019.

AccountClassification

{
  "classificationId": "string",
  "taxonomyId": "string"
}

Models a classification for an account.

Property Type Required Restrictions Description
classificationId string true none An identifier for the account classification within the scope of the associated taxonomy.
taxonomyId string true none The taxonomy in which the account classification is defined.

AccountingEntity

{
  "accountingMethod": "Unknown",
  "baseCurrency": {
    "code": "string",
    "label": "string"
  },
  "fiscalYearEnd": {
    "month": 0
  },
  "homeCountry": {
    "code": "string",
    "label": "string"
  },
  "taxYearEnd": {
    "month": 0
  },
  "addresses": [
    {
      "components": [
        {
          "type": "Addressee",
          "value": "string"
        }
      ],
      "freeFormLines": [
        "string"
      ],
      "tags": [
        "POBox"
      ]
    }
  ],
  "emails": [
    {
      "contact": "string",
      "value": "string"
    }
  ],
  "identifiers": [
    {
      "label": "string",
      "value": "string"
    }
  ],
  "names": [
    {
      "tags": [
        "Legal"
      ],
      "value": "string"
    }
  ],
  "otherContactMethods": [
    {
      "contact": "string",
      "description": "string",
      "value": "string"
    }
  ],
  "phoneNumbers": [
    {
      "components": [
        {
          "type": "AreaCode",
          "value": "string"
        }
      ],
      "contact": "string",
      "tags": [
        "Cellular"
      ],
      "value": "string"
    }
  ],
  "websites": [
    {
      "url": "string"
    }
  ]
}

Models the organization for which accounting and other financial data was prepared.

Property Type Required Restrictions Description
accountingMethod AccountingMethod true none Defines possible values for accounting methods (aka the basis of accounting).

baseCurrency Currency false none Models information about a particular currency.
fiscalYearEnd YearEnd false none Represents the end of a fiscal, tax, or other year used for reporting.
homeCountry Country false none Models information about a country.
taxYearEnd YearEnd false none Represents the end of a fiscal, tax, or other year used for reporting.
addresses [Address] true none A list of addresses.
emails [EmailAddress] true none A list of emails.
identifiers [Identifier] true none A list of identifiers.
names [OrganizationName] true none A list of names.
otherContactMethods [OtherContactMethod] true none A list of other contact methods.
phoneNumbers [PhoneNumber] true none A list of phone numbers.
websites [Website] true none A list of websites.

AccountingImportOptions

{
  "privacyControls": [
    "AllPrivacyControls"
  ],
  "transactions": {
    "reportingPeriod": "Months",
    "numberOfPeriods": 0
  },
  "financialStatements": {
    "reportingPeriod": "Months",
    "numberOfPeriods": 0
  },
  "receivables": {
    "reportingPeriod": "Months",
    "numberOfPeriods": 0
  },
  "payables": {
    "reportingPeriod": "Months",
    "numberOfPeriods": 0
  }
}

Models options for importing accounting data.

Property Type Required Restrictions Description
privacyControls [PrivacyControl] true none Used to specify privacy controls to be applied to the imported financial data.
transactions TransactionImportOptions true none Used to configure the transactional data that is collected from the accounting system.
financialStatements FinancialStatementImportOptions true none Used to configure the financial statements that are collected from the accounting system.
receivables ReceivablesAndPayablesOptions true none Used to configure the receivables and payables that are collected from the accounting system.
payables ReceivablesAndPayablesOptions true none Used to configure the receivables and payables that are collected from the accounting system.

AccountingMethod

"Unknown"

Defines possible values for accounting methods (aka the basis of accounting).

Enum Value Description
Unknown The accounting method is not known.
Accrual Income and expenses are recorded when earned, which does not necessarily align with
when cash is actually received or paid. Creditors and debtors are typically tracked via AR and AP accounts.
Cash Income and expenses are recorded when cash is actually received.
ModifiedCash Income is recorded when it is earned, but expenses are recorded only when money is paid out.

AccountKind

"Real"

The kind of an account can be either real or nominal.

Enum Value Description
Real Real or permanent account balances carry over to the next fiscal year. This includes Asset, Liability, and Equity accounts.
Nominal Nominal accounts are reset at the end of each fiscal year. This includes Revenue and Expense accounts.

AccountReference

{
  "accountId": "string"
}

A reference to an account for which full details can be found in the Chart Of Accounts.

Property Type Required Restrictions Description
accountId string true none An identifier for an account in the Chart Of Accounts.

AccountSummary

{
  "accountId": "string",
  "endingBalance": {
    "amount": 0,
    "type": "Zero"
  },
  "netChange": {
    "amount": 0,
    "type": "Zero"
  },
  "startingBalance": {
    "amount": 0,
    "type": "Zero"
  }
}

Models the starting, ending, and total change in account balance for a specific account.

Property Type Required Restrictions Description
accountId string true none An identifier for the account.
endingBalance DoubleEntryAmount true none Models an amount credited or debited.
netChange DoubleEntryAmount true none Models an amount credited or debited.
startingBalance DoubleEntryAmount true none Models an amount credited or debited.

AccountTotals

{
  "reportedTotals": [
    {
      "fromDate": "2019-08-24T14:15:22Z",
      "toDate": "2019-08-24T14:15:22Z",
      "totalsByAccount": [
        {
          "accountId": "string",
          "endingBalance": {
            "amount": 0,
            "type": "Zero"
          },
          "netChange": {
            "amount": 0,
            "type": "Zero"
          },
          "startingBalance": {
            "amount": 0,
            "type": "Zero"
          }
        }
      ]
    }
  ],
  "reportingPeriod": "Months"
}

Account Totals model the starting, ending, and total change in account balance by reporting period.

Property Type Required Restrictions Description
reportedTotals [ReportedAccountTotals] true none Totals for each account by reporting period.
reportingPeriod ReportingPeriod true none Specifies the time period for which accounting and other financial data is prepared.

Address

{
  "components": [
    {
      "type": "Addressee",
      "value": "string"
    }
  ],
  "freeFormLines": [
    "string"
  ],
  "tags": [
    "POBox"
  ]
}

Models a mailing address.

Property Type Required Restrictions Description
components [AddressComponent] true none Specific parts of the address that have been identified. The set of Components does not necessarily provide a complete representation of the address.
freeFormLines [string] true none A complete representation of the address without any implied structure or formatting.
tags [AddressTag] true none A set of tags for the address intended to identify how the address is used.

AddressComponent

{
  "type": "Addressee",
  "value": "string"
}

Models a part of an address that has been identified.

Property Type Required Restrictions Description
type ComponentOfAddress true none Defines the set of address component types that can be identified.

value string true none A value for the part of the address that has been identified with no implied formatting.

AddressTag

"POBox"

Defines a set of tags providing additional information about an address.

Enum Value Description
POBox The address represents a postal box rather than a physical address.
Shipping The address is used for delivery or receipt of products.
Contact The address is used as a public contact address.
Invoicing The address is used for invoicing.
Legal The address is used for legal purposes.
Billing The address is used for billing purposes.

BadRequest

{
  "description": "string",
  "parameter": "string"
}

This response may be used to describe a client error when returning a 400 HTTP status code.

Property Type Required Restrictions Description
description string true none A description of the client error.
parameter string¦null false none The name of the parameter that was invalid, if applicable.
May be null or omitted.

BalanceSheetBaseFigures

"TotalAssets"

Models options for selecting the base figures to use when running a vertical analysis against the Balance Sheet.

Enum Value Description
TotalAssets All line items are compared against Total Assets.
TotalAssetsTotalLiabilitiesAndTotalEquity All assets are compared against Total Assets, all liabilities against Total Liabilities, and all equity accounts are compared against Total Equity.

BalanceSheetVerticalAnalysis

{
  "baseFigures": "TotalAssets",
  "lineItems": [
    {
      "id": "string",
      "accountRef": {
        "accountId": "string"
      },
      "caption": "string",
      "lineItemType": "SourceCoA",
      "baselineFigureId": "string",
      "comparativeData": [
        {
          "value": 0,
          "comparandValue": 0,
          "percentageRatio": {
            "errorCode": "Unknown",
            "value": 0
          }
        }
      ],
      "subtotals": [
        {}
      ]
    }
  ]
}

A Vertical Analysis of Balance Sheet line items.

Property Type Required Restrictions Description
baseFigures BalanceSheetBaseFigures true none Models options for selecting the base figures to use when running a vertical analysis against the Balance Sheet.

lineItems [VerticalAnalysisLineItem] true none Vertical Analysis comparative data by line item.

BaselinePeriodType

"YoY"

Defines possible options for selecting baseline period(s) to use for a Horizontal Analysis.

Enum Value Description
YoY Each full fiscal year is compared to the prior fiscal year.
YoYAndTTM Each full fiscal year is compared to the prior fiscal year, and the TTM period is compared to the last closed fiscal year.
YoYByQuarter Each fiscal quarter is compared to the same quarter of the prior fiscal year.
YoYByMonth Each month is compared to the same month of the prior fiscal year.
InterimYoY Each interim year is compared to the previous, where the interim year is defined by the number of months completed in the current fiscal year.
CalendarYoY Each calendar year is compared to the prior calendar year.
CalendarYoYByQuarter Each quarter is compared to the same quarter of the prior calendar year.
CalendarYoYByMonth Each month is compared to the same month of the prior calendar year.
Rolling12MonthsYoY Each rolling 12 month period is compared to the previous rolling 12 month period.
QoQ Each fiscal quarter is compared to the previous fiscal quarter.
CalendarQoQ Each quarter of the calendar year is compared to the previous quarter.
MoM Each month is compared to the previous month.
FirstMonth Each month is compared to the first available month.
FirstQuarter Each fiscal quarter is compared to the first available fiscal quarter.
FirstCalendarQuarter Each quarter of the calendar year is compared to the first available quarter.
FirstYear Each fiscal year is compared to the first available fiscal year.
FirstCalendarYear Each calendar year is compared to the first available calendar year.
FirstInterimYear Each interim year is compared to the first available, where the interim year is defined by the number of months completed in the current fiscal year.
FirstRolling12Months Each rolling 12 month period is compared to the first available rolling 12 month period.

BusinessRelationship

{
  "id": "string",
  "name": "string"
}

Models an id and name for a person or organization with which the business transacts. For example, a customer, vendor, employee, or shareholder.

Property Type Required Restrictions Description
id string¦null false none An identifier for the business relationship, if specified.
name string¦null false none The name associated with the business relationship, if specified.

CalculationError

"Unknown"

Models error codes related to issues calculating mathematical formulas.

Enum Value Description
Unknown An unexpected error occurred during calculation.
DivideByZero Unable to evaluate the formula because divide by zero is not defined.

ChartOfAccounts

{
  "hierarchy": [
    {
      "classification": [
        {
          "classificationId": "string",
          "taxonomyId": "string"
        }
      ],
      "description": "string",
      "id": "string",
      "kind": "Real",
      "name": "string",
      "role": "Bookkeeping",
      "subaccounts": [
        {}
      ],
      "userAssignedCode": "string",
      "creationDate": "2019-08-24T14:15:22Z",
      "lastModifiedDate": "2019-08-24T14:15:22Z"
    }
  ]
}

Models a Chart Of Accounts, which provides a hierarchical listing of all accounts used for financial reporting.

Property Type Required Restrictions Description
hierarchy [Account] true none A hierarchical representation of the accounts used for financial reporting.

ChartOfAccountsRole

"Bookkeeping"

Defines how an account appearing in the Chart Of Accounts is used.

Enum Value Description
Bookkeeping The account is used to record business transactions. Many accounting systems refer to these as 'Detail Accounts'.
ReportHeader The account is used for presentation purposes only. Many accounting systems refer to these accounts as 'Header Accounts'.

ChronologicalSortOrder

"OldestFirst"

Specifies the desired chronological sort order.

Enum Value Description
OldestFirst Older data is ordered before more recent data.
NewestFirst More recent data is ordered before older data.

ColumnHeader

{
  "label": "string",
  "reportingEndDate": "2019-08-24T14:15:22Z",
  "reportingStartDate": "2019-08-24T14:15:22Z"
}

Models a column header for a comparative financial statement. The column header contains information about the reporting period associated with each column.

Property Type Required Restrictions Description
label string¦null false none A label for the column header. For example "FY 2019".
reportingEndDate string(date-time) true none The end date of the reporting period for which the financial data was prepared (inclusive).
reportingStartDate string(date-time)¦null false none The start date of the reporting period for which the financial data was prepared (inclusive). May be null for point-in-time statements such as the Balance Sheet.

ComparativeBalanceSheet

{
  "accountingMethod": "Unknown",
  "columnHeaders": [
    {
      "label": "string",
      "reportingEndDate": "2019-08-24T14:15:22Z",
      "reportingStartDate": "2019-08-24T14:15:22Z"
    }
  ],
  "currency": {
    "code": "string",
    "label": "string"
  },
  "footnotes": [
    "string"
  ],
  "lineItems": [
    {
      "accountRef": {
        "accountId": "string"
      },
      "caption": "string",
      "columnData": [
        0
      ],
      "description": "string",
      "id": "string",
      "indentationLevel": 0,
      "styleClasses": [
        "Account"
      ]
    }
  ],
  "organizationName": "string",
  "scalingFactor": 0,
  "dataAsOfTime": "2019-08-24T14:15:22Z",
  "title": "string"
}

Models a Comparative Balance Sheet (aka The Statement of Financial Position).

Property Type Required Restrictions Description
accountingMethod AccountingMethod true none Defines possible values for accounting methods (aka the basis of accounting).

columnHeaders [ColumnHeader] true none The column headers contain information about the reporting periods represented in the comparative financial statement.
currency Currency false none Models information about a particular currency.
footnotes [string] true none An optional set of notes for the financial statement. May be empty.
lineItems [LineItem] true none The set of line items appearing in the financial statement.
organizationName string¦null false none The name of the organization associated with the financial statement. May be null.
scalingFactor integer(int32) true none A whole number indicating if, for example, monetary amounts are represented in actual (1), thousands (1,000), or millions (1,000,000).
dataAsOfTime string(date-time) true none The time at which the financial statement was prepared.
title string true none A title for the financial statement that was prepared. Example: "Balance Sheet".

ComparativeIncomeStatement

{
  "accountingMethod": "Unknown",
  "columnHeaders": [
    {
      "label": "string",
      "reportingEndDate": "2019-08-24T14:15:22Z",
      "reportingStartDate": "2019-08-24T14:15:22Z"
    }
  ],
  "currency": {
    "code": "string",
    "label": "string"
  },
  "footnotes": [
    "string"
  ],
  "lineItems": [
    {
      "accountRef": {
        "accountId": "string"
      },
      "caption": "string",
      "columnData": [
        0
      ],
      "description": "string",
      "id": "string",
      "indentationLevel": 0,
      "styleClasses": [
        "Account"
      ]
    }
  ],
  "organizationName": "string",
  "scalingFactor": 0,
  "dataAsOfTime": "2019-08-24T14:15:22Z",
  "title": "string"
}

Models a Comparative Income Statement (aka The Profit and Loss Statement).

Property Type Required Restrictions Description
accountingMethod AccountingMethod true none Defines possible values for accounting methods (aka the basis of accounting).

columnHeaders [ColumnHeader] true none The column headers contain information about the reporting periods represented in the comparative financial statement.
currency Currency false none Models information about a particular currency.
footnotes [string] true none An optional set of notes for the financial statement. May be empty.
lineItems [LineItem] true none The set of line items appearing in the financial statement.
organizationName string¦null false none The name of the organization associated with the financial statement. May be null.
scalingFactor integer(int32) true none A whole number indicating if, for example, monetary amounts are represented in actual (1), thousands (1,000), or millions (1,000,000).
dataAsOfTime string(date-time) true none The time at which the financial statement was prepared.
title string true none A title for the financial statement that was prepared. Example: "Balance Sheet".

ComponentOfAddress

"Addressee"

Defines the set of address component types that can be identified.

Enum Value Description
Addressee A name for a person, organization, building, or venue appearing as part of the address.
POBoxNumber A Postal Box number.
Unit An apartment, unit, office, lot, or room number.
Floor A floor number
StreetAndNumber A street or route name and building number.
Neighborhood A suburb or other unofficial neighborhood name.
District A district, borough, or other second-level municipality.
PostalCode A postal / zip code.
City The name of a city, town, village, hamlet, locality, or other first-level municipality.
County A second-level administrative division for a country.
StateOrProvince A first-level administrative division for a country.
Region An informal geographic region smaller than a country including named islands.
Country Sovereign nations and their dependent territories. See ISO 3166-1.
WorldRegion An informal geographic region larger than a country.

ComponentOfPhoneNumber

"AreaCode"

Defines the types of phone number components.

Enum Value Description
AreaCode A numeric prefix used by various telephone numbering plans for routing between geographic areas and for provisioning.
CountryCallingCode A telephone number prefix that is used for international calls.
Extension An extension number for the phone number.
NationalNumber A representation of the phone number excluding the Country Calling Code and any extension, but including area code [for numbering plans having one]. Domestic calls can be made using the national number alone.
LocalNumber The local part of the phone number excluding the area code. 7-digits in the NANP.

Connection

{
  "state": "Disconnected",
  "datasetId": "string",
  "datasetName": "string",
  "datasourceNameId": "string",
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "orgId": "string"
}

Models a Connection to an external Dataset.

Property Type Required Restrictions Description
state ConnectionState true none Specifies the current status of a Connection.

datasetId string true none An identifier for the external Dataset associated with the Connection.
datasetName string¦null false none A friendly name for the external Dataset associated with the Connection.
datasourceNameId string true none The name identifier of a datasource. Ex: 'quickbooksonline'.
id string(uuid) true none An identifier for the Connection.
orgId string true none An identifier for the Organization for which the Connection was created.

ConnectionDescriptor

{
  "datasetId": "string",
  "datasetName": "string",
  "datasourceNameId": "string",
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "orgId": "string"
}

A descriptor for a Connection to an external Dataset.

Property Type Required Restrictions Description
datasetId string true none An identifier for the external Dataset associated with the Connection.
datasetName string¦null false none A friendly name for the external Dataset associated with the Connection.
datasourceNameId string true none The name identifier of a datasource. Ex: 'quickbooksonline'.
id string(uuid) true none An identifier for the Connection.
orgId string true none An identifier for the Organization for which the Connection was created.

ConnectionRequest

{
  "connectionId": "84b500d7-71c8-4b1f-adf4-f1eb0000973d",
  "id": "string",
  "errorCode": "None",
  "errorDescription": "string",
  "orgId": "string",
  "status": "NotStarted",
  "datasourceNameId": "string"
}

Models a Connection Request.

Property Type Required Restrictions Description
connectionId string(uuid)¦null false none If the Status of the Connection Request is Success, this will be an identifier for the Connection to the datasource.
id string true none An identifier for the Connection Request.
errorCode ConnectionRequestErrorCode false none Specifies the high-level reason why a Connection Request was not successful.

errorDescription string¦null false none If the Status of the Connection Request is Error, and ErrorDescription provides a user friendly description of to better understand why the Connection Request was not successful.
orgId string true none An identifier for the Organization for which the datasource is being connected.
status ConnectionRequestStatus true none Specifies the status of a Connection Request.

datasourceNameId string true none A name identifier for the datasource being connected to.

ConnectionRequestDescriptor

{
  "connectionEndpoint": "http://example.com",
  "expiration": "2019-08-24T14:15:22Z",
  "id": "string",
  "orgId": "string",
  "datasourceNameId": "string"
}

A descriptor for a newly created Connnection Request.

Property Type Required Restrictions Description
connectionEndpoint string(uri)¦null false none The URL to which the user should be directed for them to connect the datasource.
expiration string(date-time) true none The connectionEndpoint URL in this response cannot be used beyond this expiration time.
id string true none An identifier for the Connection Request.
orgId string true none An identifier for the Organization for which the datasource is being connected.
datasourceNameId string true none A name identifier for the datasource being connected to.

ConnectionRequestErrorCode

"None"

Specifies the high-level reason why a Connection Request was not successful.

Enum Value Description
None No error.
UserCancelled The user chose not to grant access to the datasource.
RequestNonceAlreadyUsed The Connection Request failed because it was attempted more than once.
RequestExpired The Connection Request failed because it was not completed within the required time frame.
DatasourceUnresponsive The Connection Request failed because the datasource was not responsive or returned an error. For example, 503 or 500 response received and re-attempting to did help.
InsufficientUserPermissions The user did not have sufficient privileges to grant access to the datasource.
InternalError An internal error occured. Reach out to our support team to get help.

ConnectionRequestParameters

{
  "datasourceNameId": "string"
}

Represents the parameters that are required to create a Connection Request.

Property Type Required Restrictions Description
datasourceNameId string true none A name identifier for the datasource being connected to.

ConnectionRequestStatus

"NotStarted"

Specifies the status of a Connection Request.

Enum Value Description
NotStarted The Connection Request has been created, but has not yet started.
Started The Connection Request is in progress.
Success The Connection Request was successful.
Error The Connection Request was not successful.

ConnectionsList

{
  "connections": [
    {
      "datasetId": "string",
      "datasetName": "string",
      "datasourceNameId": "string",
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "orgId": "string"
    }
  ]
}

Models a list of Connections.

Property Type Required Restrictions Description
connections [ConnectionDescriptor] true none The set of Connections listed.

ConnectionState

"Disconnected"

Specifies the current status of a Connection.

Enum Value Description
Disconnected The Connection can no longer be used.
Connected The Connection can be used.

ConsumerMetadata

{
  "label": "string",
  "value": "string"
}

Models additional metadata that can be attached to an API resource by the API consumer.

Property Type Required Restrictions Description
label string true none A label or key for the metadata that can be used to identify it.
value string¦null false none A value for the metadata. Null is allowed.

Country

{
  "code": "string",
  "label": "string"
}

Models information about a country.

Property Type Required Restrictions Description
code string¦null false none The ISO 3166 2-digit Country Code if known.
label string true none A label for the country without any implied formatting or validation.

CreditOrDebit

"Zero"

Indicates whether an amount represents a credit, debit, or neither (zero).

Enum Value Description
Zero The amount is zero. Neither a credit or a debit.
Credit The amount represents a credit. Equity and liabilities typically have a credit balance. Revenue is typically credited.
Debit The amount represents a debit. Assets typically have a debit balance and expenses are typically debited.

Currency

{
  "code": "string",
  "label": "string"
}

Models information about a particular currency.

Property Type Required Restrictions Description
code string¦null false none The ISO 4217 alphabetic code if known.
label string true none A label for the currency without any implied formatting or validation.

Dataset

{
  "datasetId": "string",
  "datasourceNameId": "string"
}

Models information about where financial data was sourced from.

Property Type Required Restrictions Description
datasetId string true none An identifier for the dataset from which the financial data originated. Unique within the scope of the datasource.
datasourceNameId string true none An identifier for the Accounting System or other datasource from which the financial data originated.

DebtDescriptor

"OwedTo"

Used to specify whether an outstanding debt represents money owed or due.

Enum Value Description
OwedTo Money is owed to an external entity.
DueFrom Money is due from an external entity.

DelegatedAccessToken

{
  "accessToken": "string",
  "actorId": "string",
  "expiration": "11/11/2020 3:33:11 PM -08:00",
  "purpose": [
    "ConnectAccountingSystem"
  ],
  "tokenType": "string"
}

A Delegated Access Token response.

Property Type Required Restrictions Description
accessToken string true none The requested access token.
actorId string true none An identifier for the Organization to which access being delegated.
expiration string(date-time) true none The UTC time after which the access token is no longer valid.
purpose [DelegatedAccessTokenPurpose] true none Specifies what the delegated access token is to be used for.
tokenType string true none The Authorization header scheme to use when presenting the token. Only "Bearer" is supported at this time.

DelegatedAccessTokenPurpose

"ConnectAccountingSystem"

Defines what a delegated access token is to be used for.

Enum Value Description
ConnectAccountingSystem Specifies that the delegated access token is intended to be used to enable the end-user to connect their accounting system.
ConnectionManagement Specifies that the delegated access token can be used to list/get/delete existing Connections.

DelegatedAccessTokenRequest

{
  "actorId": "string",
  "purpose": [
    "ConnectAccountingSystem"
  ]
}

Models a request to delegate limited API access to API resources.

Property Type Required Restrictions Description
actorId string true none An identifier for the Organization to which access being delegated.
purpose [DelegatedAccessTokenPurpose] true none Specifies what the delegated access token is to be used for.

DoubleEntryAmount

{
  "amount": 0,
  "type": "Zero"
}

Models an amount credited or debited.

Property Type Required Restrictions Description
amount number(double) true none The scalar amount. Always positive or 0.
type CreditOrDebit true none Indicates whether an amount represents a credit, debit, or neither (zero).

EmailAddress

{
  "contact": "string",
  "value": "string"
}

Models an email address.

Property Type Required Restrictions Description
contact string¦null false none A name or description of the contact associated with the email. For example, "John Doe" or "Customer Support".
value string true none The value for the email address without any implied formatting or validation.

FieldDataType

"Numeric"

Defines possible data types for fields.

Enum Value Description
Numeric The field is a numeric quantity.

FinancialImportErrorCode

"None"

Specifies the high-level reason why a Financial Import was not successful.

Enum Value Description
None No error.
InsufficientUserPermissions The end-user did not have or did not grant sufficient privileges to access the requested financials.
DatasourceUnresponsive The 3rd party service providing the financial data is not responding or has responded with one or more error messages. 5xx HTTP responses from the datasource are a typical example. Re-attempting the financial import after some time may be merited, but you can reach out to our support team so that we can help to get the issue resolved as soon as is possible.
InternalError An internal error occured. Reach out to our support team to get help.
Disconnected The Connection to the datasource requires authorization. This can happen if the authorization has expired or was revoked by the end-user. The end-user must reconnect their Accounting System or other financial datasource to import financials successfully.
Cancelled The financial import was cancelled by the end-user, the datasource, the API consumer, or by the Strongbox Platform.

FinancialImportOutcome

"Pending"

Specifies the outcome of importing new financial data.

Enum Value Description
Pending The outcome is still pending.
Success Importing the financial data is complete.
Error Importing the financial data failed.

FinancialImportParameters

{
  "accountingConnectionId": "15a34c5a-2153-4717-b80d-7b1b9ec1ead9",
  "consumerMetadata": [
    {
      "label": "string",
      "value": "string"
    }
  ],
  "reportingEndDate": "2019-08-24T14:15:22Z",
  "accountingDataImportOptions": {
    "privacyControls": [
      "AllPrivacyControls"
    ],
    "transactions": {
      "reportingPeriod": "Months",
      "numberOfPeriods": 0
    },
    "financialStatements": {
      "reportingPeriod": "Months",
      "numberOfPeriods": 0
    },
    "receivables": {
      "reportingPeriod": "Months",
      "numberOfPeriods": 0
    },
    "payables": {
      "reportingPeriod": "Months",
      "numberOfPeriods": 0
    }
  }
}

Models parameters that are required to import new financial data.

Property Type Required Restrictions Description
accountingConnectionId string(uuid) true none An identifier for the Connection used to import financials.
consumerMetadata [ConsumerMetadata]¦null false none Optional metadata to associate with the Financial Record. For example, you might associate the Financial Record with an identifier for a specific Loan Submission in your own system.
reportingEndDate string(date-time) true none This parameter is used as the end date for period-to-date financial data. Please use ISO 8601 date format "YYYY-MM-DD".
accountingDataImportOptions AccountingImportOptions false none Models options for importing accounting data.

FinancialImportStatus

{
  "errorCode": "None",
  "errorDescription": "string",
  "outcome": "Pending"
}

Models the status of importing new financial data to create a Financial Record.

Property Type Required Restrictions Description
errorCode FinancialImportErrorCode false none Specifies the high-level reason why a Financial Import was not successful.

errorDescription string¦null false none If the Outcome is Error, then the ErrorDescription provides a description of the problem that occurred when attempting to import financials.
outcome FinancialImportOutcome true none Specifies the outcome of importing new financial data.

FinancialRatio

{
  "id": "string",
  "displayName": "string",
  "category": "string",
  "values": [
    {
      "errorCode": "Unknown",
      "value": 0
    }
  ]
}

Models a calculated Financial Ratio.

Property Type Required Restrictions Description
id string true none A unique identifier for the financial ratio.
displayName string true none A friendly name for the ratio.
category string¦null false none A category assigned to the ratio.
values [FinancialRatioValue] true none The calculated values of the ratio.

FinancialRatios

{
  "reportingPeriods": [
    {
      "label": "string",
      "fromDate": "2019-08-24T14:15:22Z",
      "toDate": "2019-08-24T14:15:22Z"
    }
  ],
  "ratios": [
    {
      "id": "string",
      "displayName": "string",
      "category": "string",
      "values": [
        {
          "errorCode": "Unknown",
          "value": 0
        }
      ]
    }
  ]
}

Models a set of calculated financial ratios.

Property Type Required Restrictions Description
reportingPeriods [ReportingPeriodDescriptor] true none The set of reporting periods for which ratios were calculated.
ratios [FinancialRatio] true none The set of ratios that were calculated.

FinancialRatiosHorizontalAnalysis

{
  "ratios": [
    {
      "id": "string",
      "displayName": "string",
      "category": "string",
      "comparativeData": [
        {
          "currentValue": 0,
          "pastValue": 0,
          "absoluteChange": 0,
          "percentChange": {
            "errorCode": "Unknown",
            "value": 0
          }
        }
      ]
    }
  ]
}

A Horizontal Analysis of Financial Ratios.

Property Type Required Restrictions Description
ratios [HorizontalAnalysisFinancialRatio] true none Horiztontal Analysis comparative data by Financial Ratio.

FinancialRatioValue

{
  "errorCode": "Unknown",
  "value": 0
}

Models the value of a calculated ratio.

Property Type Required Restrictions Description
errorCode CalculationError false none Models error codes related to issues calculating mathematical formulas.

value number(double)¦null false none The calculated value of the ratio. May be null if the ratio could not be calculated.

FinancialRecord

{
  "consumerMetadata": [
    {
      "label": "string",
      "value": "string"
    }
  ],
  "dataAsOfTime": "2019-08-24T14:15:22Z",
  "accountingDataset": {
    "datasetId": "string",
    "datasourceNameId": "string"
  },
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "importStatus": {
    "errorCode": "None",
    "errorDescription": "string",
    "outcome": "Pending"
  },
  "reportingEndDate": "2019-08-24T14:15:22Z",
  "scheduled": true,
  "accountingDataImportOptions": {
    "privacyControls": [
      "AllPrivacyControls"
    ],
    "transactions": {
      "reportingPeriod": "Months",
      "numberOfPeriods": 0
    },
    "financialStatements": {
      "reportingPeriod": "Months",
      "numberOfPeriods": 0
    },
    "receivables": {
      "reportingPeriod": "Months",
      "numberOfPeriods": 0
    },
    "payables": {
      "reportingPeriod": "Months",
      "numberOfPeriods": 0
    }
  }
}

Models imported financials.

Property Type Required Restrictions Description
consumerMetadata [ConsumerMetadata] true none Additional metadata associated with the Financial Record that was added, by you, the API consumer. For example, you might associate the Financial Record with an identifier for a specific Loan Submission in your own system.
dataAsOfTime string(date-time) true none The time at which the financial data was imported.
accountingDataset Dataset true none Models information about where financial data was sourced from.
id string(uuid) true none An identifier for the Financial Record.
importStatus FinancialImportStatus true none Models the status of importing new financial data to create a Financial Record.
reportingEndDate string(date-time) true none The end date for period-to-date financial data. Serialized using ISO 8601 date format "YYYY-MM-DD".
scheduled boolean true none Specifies whether the financial data was imported on-demand or via a schedule.
accountingDataImportOptions AccountingImportOptions true none Models options for importing accounting data.

FinancialRecordList

{
  "financialRecords": [
    {
      "consumerMetadata": [
        {
          "label": "string",
          "value": "string"
        }
      ],
      "dataAsOfTime": "2019-08-24T14:15:22Z",
      "accountingDataset": {
        "datasetId": "string",
        "datasourceNameId": "string"
      },
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "importStatus": {
        "errorCode": "None",
        "errorDescription": "string",
        "outcome": "Pending"
      },
      "reportingEndDate": "2019-08-24T14:15:22Z",
      "scheduled": true,
      "accountingDataImportOptions": {
        "privacyControls": [
          "AllPrivacyControls"
        ],
        "transactions": {
          "reportingPeriod": "Months",
          "numberOfPeriods": 0
        },
        "financialStatements": {
          "reportingPeriod": "Months",
          "numberOfPeriods": 0
        },
        "receivables": {
          "reportingPeriod": "Months",
          "numberOfPeriods": 0
        },
        "payables": {
          "reportingPeriod": "Months",
          "numberOfPeriods": 0
        }
      }
    }
  ]
}

Models a list of Financial Records.

Property Type Required Restrictions Description
financialRecords [FinancialRecord] true none The set of Financial Records listed.

FinancialRecordReference

{
  "financialRecordId": "7ad9e9b5-4e66-48a1-902f-0c1afd0682e5"
}

A reference to a Financial Record by its id.

Property Type Required Restrictions Description
financialRecordId string(uuid) true none An identifier for a Financial Record.

FinancialReview

{
  "checks": [
    {
      "id": "string",
      "category": "string",
      "outcome": "Inconclusive",
      "outcomeDescription": "string",
      "fromDate": "2019-08-24T14:15:22Z",
      "toDate": "2019-08-24T14:15:22Z"
    }
  ]
}

Models a set of checks that were run against the financial data to verify accuracy, completeness, and reliability of that data.

Property Type Required Restrictions Description
checks [FinancialReviewCheck] true none The checks that were run for the review of the financial data.

FinancialReviewCheck

{
  "id": "string",
  "category": "string",
  "outcome": "Inconclusive",
  "outcomeDescription": "string",
  "fromDate": "2019-08-24T14:15:22Z",
  "toDate": "2019-08-24T14:15:22Z"
}

Models the outcome of a check that was executed against the financial data.

Property Type Required Restrictions Description
id string true none An identifier for the check.
category string¦null false none A category assigned to the check. Refer to the documentation here to learn more.
outcome FinancialReviewCheckOutcome true none Models possible outcomes for a financial review check.

outcomeDescription string¦null false none A description of the outcome of the check. May be null.
fromDate string(date-time)¦null false none If the check was run for a specific time period, the first date in that time period (inclusive), otherwise null. Serialized using "YYYY-MM-DD" format as defined by ISO 8601-1:2019.
toDate string(date-time)¦null false none If the check was run for a specific time period, the last date in that time period (inclusive), otherwise null. Serialized using "YYYY-MM-DD" format as defined by ISO 8601-1:2019.

FinancialReviewCheckOutcome

"Inconclusive"

Models possible outcomes for a financial review check.

Enum Value Description
Inconclusive No conclusion could be drawn or the check was not applicable.
Pass The check passed.
Fail The check failed.

FinancialStatementHorizontalAnalysis

{
  "lineItems": [
    {
      "id": "string",
      "accountRef": {
        "accountId": "string"
      },
      "caption": "string",
      "lineItemType": "SourceCoA",
      "comparativeData": [
        {
          "currentValue": 0,
          "pastValue": 0,
          "absoluteChange": 0,
          "percentChange": {
            "errorCode": "Unknown",
            "value": 0
          }
        }
      ],
      "subtotals": [
        {}
      ]
    }
  ]
}

A Horizontal Analysis of Financial Statement line items.

Property Type Required Restrictions Description
lineItems [HorizontalAnalysisLineItem] true none Horiztontal Analysis comparative data by line item.

FinancialStatementImportOptions

{
  "reportingPeriod": "Months",
  "numberOfPeriods": 0
}

Used to configure the financial statements that are collected from the accounting system.

Property Type Required Restrictions Description
reportingPeriod ImportReportingPeriod false none Specifies the time period for which accounting and other financial data is prepared.

numberOfPeriods integer(int32) true none A natural number greater than or equal to zero used to specify the total number of months, quarters, or years for which financial data is desired. The month-to-date, quarter-to-date, or year-to-date period is included in this count. For example, setting 'reportingPeriod' to 'FiscalYears' and 'numberOfReportingPeriods' to 3 should be interpreted as '2 full fiscal years and fiscal YTD'. Setting 'numberOfPeriods' to zero disables data collection.

FinancialWorkbook

{
  "variantId": "string",
  "filename": "string",
  "creationTime": "2019-08-24T14:15:22Z"
}

Models information about a Financial Workbook that can be downloaded.

Property Type Required Restrictions Description
variantId string true none An identifier for the Financial Workbook variant.
filename string true none The filename associated with the Financial Workbook.
creationTime string(date-time) true none The time at which the Financial Workbook was created.

FinancialWorkbooksList

{
  "workbooks": [
    {
      "variantId": "string",
      "filename": "string",
      "creationTime": "2019-08-24T14:15:22Z"
    }
  ]
}

Models a list of Financial Workbooks.

Property Type Required Restrictions Description
workbooks [FinancialWorkbook] true none The set of Financial Workbooks being listed.

Forbidden

{
  "description": "string"
}

This response may be used when returning a 403 HTTP status code.

Property Type Required Restrictions Description
description string¦null false none A description of why the request was denied for troubleshooting purposes.
May be null or omitted.

HorizontalAnalysis

{
  "baselinePeriodType": "YoY",
  "reportingPeriods": [
    {
      "label": "string",
      "reportingPeriod": {
        "label": "string",
        "fromDate": "2019-08-24T14:15:22Z",
        "toDate": "2019-08-24T14:15:22Z"
      },
      "baselinePeriod": {
        "label": "string",
        "fromDate": "2019-08-24T14:15:22Z",
        "toDate": "2019-08-24T14:15:22Z"
      }
    }
  ],
  "metrics": [
    {
      "inputMetricId": "string",
      "inputMetricType": "IncomeStatementLineItem",
      "comparativeData": [
        {
          "currentValue": 0,
          "pastValue": 0,
          "absoluteChange": 0,
          "percentChange": {
            "errorCode": "Unknown",
            "value": 0
          }
        }
      ]
    }
  ]
}

Models a Horizontal Analysis.

Property Type Required Restrictions Description
baselinePeriodType BaselinePeriodType true none Defines possible options for selecting baseline period(s) to use for a Horizontal Analysis.

reportingPeriods [ReportingPeriodComparison] true none Information about the set of reporting periods included in the Horizontal Analysis, including the baseline period that each is being compared to.
metrics [HorizontalAnalysisMetric] true none The set of metrics that were evaluated for the Horizontal Analysis.

HorizontalAnalysisFinancialRatio

{
  "id": "string",
  "displayName": "string",
  "category": "string",
  "comparativeData": [
    {
      "currentValue": 0,
      "pastValue": 0,
      "absoluteChange": 0,
      "percentChange": {
        "errorCode": "Unknown",
        "value": 0
      }
    }
  ]
}

Comparative data representing a Horizontal Analysis of a single Financial Ratio.

Property Type Required Restrictions Description
id string true none A unique identifier for the financial ratio.
displayName string true none A friendly name for the ratio.
category string¦null false none A category assigned to the ratio.
comparativeData [HorizontalComparison] true none [Models a comparison between a past and present value calculated as part of a horizontal analysis.]

HorizontalAnalysisInputMetricType

"IncomeStatementLineItem"

Defines possible metrics for which a Horizontal Analysis can be done.

Enum Value Description
IncomeStatementLineItem The metric represents the amounts reported by a line item on the Income Statement.
BalanceSheetLineItem The metric represents the amounts reported by a line item on the Balance Sheet.
FinancialRatio The metric represents a Finacial Ratio calculated from figures appearing on the Financial Statements.

HorizontalAnalysisLegacy

{
  "baselinePeriodType": "YoY",
  "reportingPeriods": [
    {
      "label": "string",
      "reportingPeriod": {
        "label": "string",
        "fromDate": "2019-08-24T14:15:22Z",
        "toDate": "2019-08-24T14:15:22Z"
      },
      "baselinePeriod": {
        "label": "string",
        "fromDate": "2019-08-24T14:15:22Z",
        "toDate": "2019-08-24T14:15:22Z"
      }
    }
  ],
  "incomeStatement": {
    "lineItems": [
      {
        "id": "string",
        "accountRef": {
          "accountId": "string"
        },
        "caption": "string",
        "lineItemType": "SourceCoA",
        "comparativeData": [
          {
            "currentValue": 0,
            "pastValue": 0,
            "absoluteChange": 0,
            "percentChange": {
              "errorCode": "Unknown",
              "value": 0
            }
          }
        ],
        "subtotals": [
          {}
        ]
      }
    ]
  },
  "balanceSheet": {
    "lineItems": [
      {
        "id": "string",
        "accountRef": {
          "accountId": "string"
        },
        "caption": "string",
        "lineItemType": "SourceCoA",
        "comparativeData": [
          {
            "currentValue": 0,
            "pastValue": 0,
            "absoluteChange": 0,
            "percentChange": {
              "errorCode": "Unknown",
              "value": 0
            }
          }
        ],
        "subtotals": [
          {}
        ]
      }
    ]
  },
  "financialRatios": {
    "ratios": [
      {
        "id": "string",
        "displayName": "string",
        "category": "string",
        "comparativeData": [
          {
            "currentValue": 0,
            "pastValue": 0,
            "absoluteChange": 0,
            "percentChange": {
              "errorCode": "Unknown",
              "value": 0
            }
          }
        ]
      }
    ]
  }
}

Models a Horizontal Analysis.

Property Type Required Restrictions Description
baselinePeriodType BaselinePeriodType true none Defines possible options for selecting baseline period(s) to use for a Horizontal Analysis.

reportingPeriods [ReportingPeriodComparison] true none Information about the set of reporting periods included in the horizontal analysis, including the baseline period that each is being compared to.
incomeStatement FinancialStatementHorizontalAnalysis true none A Horizontal Analysis of Financial Statement line items.
balanceSheet FinancialStatementHorizontalAnalysis true none A Horizontal Analysis of Financial Statement line items.
financialRatios FinancialRatiosHorizontalAnalysis true none A Horizontal Analysis of Financial Ratios.

HorizontalAnalysisLineItem

{
  "id": "string",
  "accountRef": {
    "accountId": "string"
  },
  "caption": "string",
  "lineItemType": "SourceCoA",
  "comparativeData": [
    {
      "currentValue": 0,
      "pastValue": 0,
      "absoluteChange": 0,
      "percentChange": {
        "errorCode": "Unknown",
        "value": 0
      }
    }
  ],
  "subtotals": [
    {
      "id": "string",
      "accountRef": {
        "accountId": "string"
      },
      "caption": "string",
      "lineItemType": "SourceCoA",
      "comparativeData": [
        {
          "currentValue": 0,
          "pastValue": 0,
          "absoluteChange": 0,
          "percentChange": {
            "errorCode": "Unknown",
            "value": 0
          }
        }
      ],
      "subtotals": []
    }
  ]
}

Comparative data representing a Horizontal Analysis of a single line item appearing on a financial statement.

Property Type Required Restrictions Description
id string true none An identifier for the line item.
accountRef AccountReference false none A reference to an account for which full details can be found in the Chart Of Accounts.
caption string true none The line item caption, which is label for the line item as it would appear on the statement.
lineItemType LineItemType true none Models the types of line items appearing in financial statement analysis responses.

comparativeData [HorizontalComparison] true none The results of comparing this line item to value reported in the baseline period.
subtotals [HorizontalAnalysisLineItem] true none Each line item may contain a set of subtotal lines.

HorizontalAnalysisMetric

{
  "inputMetricId": "string",
  "inputMetricType": "IncomeStatementLineItem",
  "comparativeData": [
    {
      "currentValue": 0,
      "pastValue": 0,
      "absoluteChange": 0,
      "percentChange": {
        "errorCode": "Unknown",
        "value": 0
      }
    }
  ]
}

Models Horizontal Analysis data calculated for a specific financial statement metric.

Property Type Required Restrictions Description
inputMetricId string true none An identifier for the financial statement metric.
inputMetricType HorizontalAnalysisInputMetricType true none Defines possible metrics for which a Horizontal Analysis can be done.

comparativeData [HorizontalComparison] true none Horizontal comparisons for each reporting period compared to the baseline period.

HorizontalComparison

{
  "currentValue": 0,
  "pastValue": 0,
  "absoluteChange": 0,
  "percentChange": {
    "errorCode": "Unknown",
    "value": 0
  }
}

Models a comparison between a past and present value calculated as part of a horizontal analysis.

Property Type Required Restrictions Description
currentValue number(double)¦null false none The current value of the metric being compared to the past value.
pastValue number(double)¦null false none The currentValue is compared to the pastValue.
absoluteChange number(double)¦null false none The absolute change measured between the past and current value (currentValue − pastValue).
percentChange PercentageValue true none Models a calculated percentage.

Identifier

{
  "label": "string",
  "value": "string"
}

Models an identifier.

Property Type Required Restrictions Description
label string true none A label for the identifier to better understand its meaning. Possible values include, but are not limited to; ABN, ACN, TFN, EIN, WPN, ResaleNumber, SSN.
value string true none The value for the identifier without any implied formatting or validation.

ImportReportingPeriod

"Months"

Specifies the time period for which accounting and other financial data is prepared.

Enum Value Description
Months The reporting period is monthly.
FiscalQuarters The reporting period is quarterly; aligned to the fiscal year for the accounting entity.
FiscalYears The reporting period is annual; aligned to the fiscal year for the accounting entity.

IncomeStatementBaseFigures

"NetSales"

Models options for selecting the base figures to use when running a vertical analysis against the Income Statement.

Enum Value Description
NetSales All line items are compared against Total Net Sales.
NetIncome All line items are compared against Net Income.

IncomeStatementVerticalAnalysis

{
  "baseFigures": "NetSales",
  "lineItems": [
    {
      "id": "string",
      "accountRef": {
        "accountId": "string"
      },
      "caption": "string",
      "lineItemType": "SourceCoA",
      "baselineFigureId": "string",
      "comparativeData": [
        {
          "value": 0,
          "comparandValue": 0,
          "percentageRatio": {
            "errorCode": "Unknown",
            "value": 0
          }
        }
      ],
      "subtotals": [
        {}
      ]
    }
  ]
}

A Vertical Analysis of Income Statement line items.

Property Type Required Restrictions Description
baseFigures IncomeStatementBaseFigures true none Models options for selecting the base figures to use when running a vertical analysis against the Income Statement.

lineItems [VerticalAnalysisLineItem] true none Vertical Analysis comparative data by line item.

InitializeOrganizationParameters

{
  "displayName": "string"
}

Models parameters to setup an Organization as it appears in the Strongbox Web Portal.

Property Type Required Restrictions Description
displayName string true none A display name to be used for the Organization as it appears in the Strongbox Web Portal.
The maximum length of the display name is 256 characters.

LineItem

{
  "accountRef": {
    "accountId": "string"
  },
  "caption": "string",
  "columnData": [
    0
  ],
  "description": "string",
  "id": "string",
  "indentationLevel": 0,
  "styleClasses": [
    "Account"
  ]
}

Models a line item appearing in a financial statement.

Property Type Required Restrictions Description
accountRef AccountReference false none A reference to an account for which full details can be found in the Chart Of Accounts.
caption string true none A label for for the line item. For example, "Assets", "Total Current Assets", "Gross Profit", or "Accounts Receivable".
columnData [number] true none The reported monetary amounts associated with the line item. These figures correspond to the reporting periods in the financial statement column headers. If the type of line item is None, then there will be no column data.
description string¦null false none An optional description of the line item. Can be presented as tooltip depending on the mechanism being used to present the financial statement. May be null.
id string true none An identifier for the line item which is unique within the scope of the financial statement.
indentationLevel integer(int32) true none For presentation purposes, this represents the indentation level of the line item.
styleClasses [StyleClasses] true none The style of the line item.

LineItemType

"SourceCoA"

Models the types of line items appearing in financial statement analysis responses.

Enum Value Description
SourceCoA The line item represents an account from the company's chart of accounts.
SourceCoASubtotal The line item represents a subtotal of accounts in the company's chart of accounts.
ClassificationSubtotal The line item represents a subtotal for an account classification in the taxonomy that the company's chart of accounts was mapped to.

NotFound

{
  "description": "string"
}

This response may be used when returning a 404 HTTP status code.

Property Type Required Restrictions Description
description string¦null false none A message describing which resource could not be found for troubleshooting purposes.

OrganizationName

{
  "tags": [
    "Legal"
  ],
  "value": "string"
}

Models the name of an organization.

Property Type Required Restrictions Description
tags [OrganizationNameTag] true none A set of tags providing additional information about the name.
value string true none The name value with no implied formatting or validation.

OrganizationNameTag

"Legal"

Defines a set of tags providing additional information about a Name.

Enum Value Description
Legal The name is the legal name for the Organization.
Dba The name is used as a trade name. Short for "Doing Business As".

OtherContactMethod

{
  "contact": "string",
  "description": "string",
  "value": "string"
}

Models additional contact information.

Property Type Required Restrictions Description
contact string¦null false none A name or description of the contact associated with the contact info. For example, "John Doe" or "Customer Support".
description string true none A friendly description of the contact method. For example 'Skype Account'.
value string true none A value for the contact method without any implied formatting or validation.

OutstandingPayablesHistory

{
  "history": [
    {
      "asOf": "2019-08-24T14:15:22Z",
      "transactions": [
        {
          "amountOutstanding": {
            "amount": 0,
            "type": "Zero"
          },
          "businessRelationship": {
            "id": "string",
            "name": "string"
          },
          "daysFromDueDate": 0,
          "daysFromTransactionDate": 0,
          "debtDescriptor": "OwedTo",
          "dueDate": "2019-08-24T14:15:22Z",
          "transactionAmount": {
            "amount": 0,
            "type": "Zero"
          },
          "transactionDate": "2019-08-24T14:15:22Z",
          "transactionId": "string",
          "transactionType": "string",
          "docNo": "string",
          "refNo": "string"
        }
      ]
    }
  ]
}

Outstanding Payables by reporting period.

Property Type Required Restrictions Description
history [OutstandingReceivableOrPayableList] true none Outstanding receivables or payables calculated for each reporting period.

OutstandingReceivableOrPayable

{
  "amountOutstanding": {
    "amount": 0,
    "type": "Zero"
  },
  "businessRelationship": {
    "id": "string",
    "name": "string"
  },
  "daysFromDueDate": 0,
  "daysFromTransactionDate": 0,
  "debtDescriptor": "OwedTo",
  "dueDate": "2019-08-24T14:15:22Z",
  "transactionAmount": {
    "amount": 0,
    "type": "Zero"
  },
  "transactionDate": "2019-08-24T14:15:22Z",
  "transactionId": "string",
  "transactionType": "string",
  "docNo": "string",
  "refNo": "string"
}

Models an outstanding receivable or payable transaction including invoices, receipts, credit notes, and refunds.

Property Type Required Restrictions Description
amountOutstanding DoubleEntryAmount true none Models an amount credited or debited.
businessRelationship BusinessRelationship false none Models an id and name for a person or organization with which the business transacts. For example, a customer, vendor, employee, or shareholder.
daysFromDueDate integer(int32) true none A positive or negative integer representing the number of days before or after the due date relative to the financial reporting date. For example, the age one day before the due date is -1 and the age one day after the due date is 1. If a due date is not specified then 'transactionDate' is treated as the due date.
daysFromTransactionDate integer(int32) true none A positive integer representing the number of days since the transaction was created as of the financial reporting date. For example, the age one day after the transaction date is 1.
debtDescriptor DebtDescriptor true none Used to specify whether an outstanding debt represents money owed or due.

dueDate string(date-time)¦null false none The date at which time an invoice is due, if a due date is specified.
transactionAmount DoubleEntryAmount true none Models an amount credited or debited.
transactionDate string(date-time) true none The date on which the transaction occured, for financial reporting purposes.
transactionId string true none An identifier for the transaction.
transactionType string¦null false none The type of the transaction, as specified by the datasource. Some examples are: "Invoice", "Credit Memo", and "Credit Card Payment".
docNo string¦null false none A document number assigned to the transaction. Usually alpha-numeric and sequenced by the accounting system automatically. Examples are 'Invoice #' and 'Credit Memo #' found in QuickBooks or Xero.
refNo string¦null false none An secondary reference number assigned to the transaction. Typically alpha-numeric and user-defined.

OutstandingReceivableOrPayableList

{
  "asOf": "2019-08-24T14:15:22Z",
  "transactions": [
    {
      "amountOutstanding": {
        "amount": 0,
        "type": "Zero"
      },
      "businessRelationship": {
        "id": "string",
        "name": "string"
      },
      "daysFromDueDate": 0,
      "daysFromTransactionDate": 0,
      "debtDescriptor": "OwedTo",
      "dueDate": "2019-08-24T14:15:22Z",
      "transactionAmount": {
        "amount": 0,
        "type": "Zero"
      },
      "transactionDate": "2019-08-24T14:15:22Z",
      "transactionId": "string",
      "transactionType": "string",
      "docNo": "string",
      "refNo": "string"
    }
  ]
}

Models a set of outstanding receivable or payable transactions.

Property Type Required Restrictions Description
asOf string(date-time) true none The date corresponding at which outstanding receivables or payables data was calculated.
transactions [OutstandingReceivableOrPayable] true none The set of outstanding receivable or payable transactions.

OutstandingReceivablesHistory

{
  "history": [
    {
      "asOf": "2019-08-24T14:15:22Z",
      "transactions": [
        {
          "amountOutstanding": {
            "amount": 0,
            "type": "Zero"
          },
          "businessRelationship": {
            "id": "string",
            "name": "string"
          },
          "daysFromDueDate": 0,
          "daysFromTransactionDate": 0,
          "debtDescriptor": "OwedTo",
          "dueDate": "2019-08-24T14:15:22Z",
          "transactionAmount": {
            "amount": 0,
            "type": "Zero"
          },
          "transactionDate": "2019-08-24T14:15:22Z",
          "transactionId": "string",
          "transactionType": "string",
          "docNo": "string",
          "refNo": "string"
        }
      ]
    }
  ]
}

Outstanding Receivables by reporting period.

Property Type Required Restrictions Description
history [OutstandingReceivableOrPayableList] true none Outstanding receivables or payables calculated for each reporting period.

PercentageValue

{
  "errorCode": "Unknown",
  "value": 0
}

Models a calculated percentage.

Property Type Required Restrictions Description
errorCode CalculationError false none Models error codes related to issues calculating mathematical formulas.

value number(double)¦null false none The percentage represented as a number between 0 and 1, but may be null if the percentage is undefined (divide by zero).

PhoneNumber

{
  "components": [
    {
      "type": "AreaCode",
      "value": "string"
    }
  ],
  "contact": "string",
  "tags": [
    "Cellular"
  ],
  "value": "string"
}

Models a phone number.

Property Type Required Restrictions Description
components [PhoneNumberComponent] true none Specific components of the phone number that have been identified. The set of Components do not necessarily provide a complete representation of the phone number.
contact string¦null false none A name or description of the contact associated with the phone number. For example, "John Doe" or "Customer Support".
tags [PhoneNumberTags] true none A set of tags for the phone intended to provide accessory information about it.
value string true none A complete representation of the phone number without any implied formatting or validation.

PhoneNumberComponent

{
  "type": "AreaCode",
  "value": "string"
}

Models the part of a phone number that has been identified.

Property Type Required Restrictions Description
type ComponentOfPhoneNumber true none Defines the types of phone number components.

value string true none The value of the part of the phone number that has been identified with no implied formatting.

PhoneNumberTags

"Cellular"

Defines a set of tags providing additional information about a phone number.

Enum Value Description
Cellular The phone number is for a cell phone.
Landline The phone number is a land line.
Fax The phone number is for fax.
Pager The phone number is for a pager.
Support The phone number is a customer support number.
Person The phone number is associated with a person.
Organization The phone number is associated with an organization.

PrivacyControl

"AllPrivacyControls"

Defines the set of privacy controls that can be applied to imported financial data.

Enum Value Description
AllPrivacyControls Redact all potential PII. Equivalent to the combination of all possible options.
AnonymizeAccountingEntity The Accounting Entity will be anonymized. This includes the company name(s), emails, phone numbers, addresses, identifiers, and contact methods.
AnonymizeContactLists All customer, vendor, and employee data will be anonymized.
RedactCOADescription Redact the description for accounts in the Chart Of Accounts (free-form field).
RedactCOAName Redact the name for accounts in the Chart Of Accounts (free-form field).
RedactDocNoAndRefNo Redact doc and ref numbers associated with transactions (free-form field).
RedactTransactionDimensions Redact dimension values in the Transaction List (free-form field).
RedactTransactionMemos Redact memos/narrations attached to transactions (free-form field).

ReceivablesAndPayablesOptions

{
  "reportingPeriod": "Months",
  "numberOfPeriods": 0
}

Used to configure the receivables and payables that are collected from the accounting system.

Property Type Required Restrictions Description
reportingPeriod ImportReportingPeriod false none Specifies the time period for which accounting and other financial data is prepared.

numberOfPeriods integer(int32) true none A natural number greater than or equal to zero used to specify the total number of months, quarters, or years for which financial data is desired. The month-to-date, quarter-to-date, or year-to-date period is included in this count. For example, setting 'reportingPeriod' to 'FiscalYears' and 'numberOfReportingPeriods' to 3 should be interpreted as '2 full fiscal years and fiscal YTD'. Setting 'numberOfPeriods' to zero disables data collection.

ReportedAccountTotals

{
  "fromDate": "2019-08-24T14:15:22Z",
  "toDate": "2019-08-24T14:15:22Z",
  "totalsByAccount": [
    {
      "accountId": "string",
      "endingBalance": {
        "amount": 0,
        "type": "Zero"
      },
      "netChange": {
        "amount": 0,
        "type": "Zero"
      },
      "startingBalance": {
        "amount": 0,
        "type": "Zero"
      }
    }
  ]
}

Models account totals for a specific reporting period.

Property Type Required Restrictions Description
fromDate string(date-time) true none The first day of the reporting period (inclusive).
toDate string(date-time) true none The last day for the reporting period (inclusive).
totalsByAccount [AccountSummary] true none Lists the totals for each account for the given reporting period.

ReportingPeriod

"Months"

Specifies the time period for which accounting and other financial data is prepared.

Enum Value Description
Months The reporting period is monthly (full months only).
MonthsAndMTD The reporting period is monthly and includes the month-to-date period.
FiscalQuarters The reporting period is quarterly (full quarters only); aligned to the fiscal year for the accounting entity.
CalendarQuarters The reporting period is quarterly (full quarters only); aligned to the calendar year.
CalendarQuartersAndQtd The reporting period is quarterly (full quarters only) and includes the quarter-to-date period; aligned to the calendar year.
FiscalQuartersAndQTD The reporting period is quarterly and includes the quarter-to-date period; aligned to the fiscal year for the accounting entity.
FiscalYears The reporting period is annual (full years only); aligned to the fiscal year for the accounting entity.
FiscalYearsAndYTD The reporting period is annual and includes the fiscal year-to-date period; aligned to the fiscal year for the accounting entity.
FiscalYearsAndTTM The reporting period is annual (full years only) and includes the TTM period; aligned to the fiscal year for the accounting entity.
InterimYears An interim year is similar to a YTD period, but is defined as the number of full months completed in the current fiscal year, and the same period for prior fiscal years.
The periods are typically labelled "6m17" and "6m18", etc.
Rolling12Months The reporting period is based on annualized data from rolling 12 month periods.
CalendarYears The reporting period is the calendar year (full years only).
CalendarYearsAndYTD The reporting period is the calendar year and includes the year-to-date period.

ReportingPeriodComparison

{
  "label": "string",
  "reportingPeriod": {
    "label": "string",
    "fromDate": "2019-08-24T14:15:22Z",
    "toDate": "2019-08-24T14:15:22Z"
  },
  "baselinePeriod": {
    "label": "string",
    "fromDate": "2019-08-24T14:15:22Z",
    "toDate": "2019-08-24T14:15:22Z"
  }
}

Models a reporting period being compared against a baseline period.

Property Type Required Restrictions Description
label string true none A label for the reporting periods being compared. For example, "FY19 to FY20".
reportingPeriod ReportingPeriodDescriptor true none Describes a reporting period including the start and end dates (inclusive).
baselinePeriod ReportingPeriodDescriptor true none Describes a reporting period including the start and end dates (inclusive).

ReportingPeriodDescriptor

{
  "label": "string",
  "fromDate": "2019-08-24T14:15:22Z",
  "toDate": "2019-08-24T14:15:22Z"
}

Describes a reporting period including the start and end dates (inclusive).

Property Type Required Restrictions Description
label string true none A friendly label for the reporting period. For example "FY 2021".
fromDate string(date-time) true none The start date of the reporting period for which the financial data was prepared (inclusive). May be null for point-in-time statements such as the Balance Sheet.
toDate string(date-time) false none The end date of the reporting period for which the financial data was prepared (inclusive).

StyleClasses

"Account"

Specifies styles for line items that can appear in a financial statement.

Enum Value Description
Account The line item represents an account from the business's Chart Of Accounts.
Subtotal The line item represents a subtotal.
GrandTotal The line item represents a grand total.
SectionHeader The line item represents a section header.
SectionFooter The line item represents a section footer.

SupplementalFieldDescriptor

{
  "id": "string",
  "dataType": "Numeric",
  "label": "string"
}

Models information about a supplemental field available as part of transactional data.

Property Type Required Restrictions Description
id string true none An identifier for the supplemental field.
dataType FieldDataType true none Defines possible data types for fields.

label string true none Specifies a user friendly label for the field.

SupplementalFieldValue

{
  "id": "string",
  "value": "string"
}

Models the value of a supplemental field included with transaction data.

Property Type Required Restrictions Description
id string true none An identifier for the supplemental field.
value string¦null false none The value of the supplemental field, represented as a string. Refer to the data type of the field to interpret the value.

Transaction

{
  "entries": [
    {
      "dimensionTags": [
        {
          "dimensionId": "string",
          "id": "string",
          "label": "string"
        }
      ],
      "accountId": "string",
      "entry": {
        "amount": 0,
        "type": "Zero"
      },
      "memo": "string",
      "number": 0,
      "docNo": "string",
      "refNo": "string",
      "supplementalFieldValues": [
        {
          "id": "string",
          "value": "string"
        }
      ]
    }
  ],
  "id": "string",
  "reportingDate": "2019-08-24T14:15:22Z",
  "lastModifiedDate": "2019-08-24T14:15:22Z",
  "creationDate": "2019-08-24T14:15:22Z",
  "type": "string"
}

Models an accounting transaction.

Property Type Required Restrictions Description
entries [TransactionEntry] true none The set of account entries that make up the transaction.
id string true none A unique identifier for this transaction within the scope of the Dataset.
reportingDate string(date-time) true none The date on which the transaction occurred for financial reporting purposes. This date is serialized to a string using the "YYYY-MM-DD" format as defined by ISO 8601-1:2019.
lastModifiedDate string(date-time)¦null false none The date on which the transaction was last modified, if known. This date is serialized to a string using the "YYYY-MM-DD" format as defined by ISO 8601-1:2019.
creationDate string(date-time)¦null false none The date on which the transaction was created, if known. This date is serialized to a string using the "YYYY-MM-DD" format as defined by ISO 8601-1:2019.
type string¦null false none The type of transaction as labeled by the source accounting system. May be null or empty.

TransactionDimension

{
  "id": "string",
  "label": "string"
}

Models additional accounting dimensions such as Business Relations, Products/Services, QuickBooks 'Classes', and Xero 'Tracking Categories' that can be associated with transactional data entries.

Property Type Required Restrictions Description
id string true none An identifier for the transaction dimension.
label string true none A label for the transaction dimension. For example, 'Department'.

TransactionDimensionTag

{
  "dimensionId": "string",
  "id": "string",
  "label": "string"
}

Models the value of a transaction dimension that was assigned to an individual transactional data entry.

Property Type Required Restrictions Description
dimensionId string true none An identifier for dimension associated with this tag.
id string¦null false none An identifier for the dimension tag.
label string¦null false none A label for the dimension tag.

TransactionEntry

{
  "dimensionTags": [
    {
      "dimensionId": "string",
      "id": "string",
      "label": "string"
    }
  ],
  "accountId": "string",
  "entry": {
    "amount": 0,
    "type": "Zero"
  },
  "memo": "string",
  "number": 0,
  "docNo": "string",
  "refNo": "string",
  "supplementalFieldValues": [
    {
      "id": "string",
      "value": "string"
    }
  ]
}

A transaction entry.

Property Type Required Restrictions Description
dimensionTags [TransactionDimensionTag] true none Values for any additional dimensions for the transaction entry that may be available depending on the accounting system and organization.
accountId string true none An identifier for the account affected by this transaction entry.
entry DoubleEntryAmount true none Models an amount credited or debited.
memo string¦null false none An optional memorandum for the entry. May be null or empty.
number integer(int32) true none Defines an ordering for the transaction entry and may be used as an identifier that is unique within the scope of the transaction. Please be aware that this does not necessarily correspond to the visual ordering of the entry as it would appear in the accounting system.
docNo string¦null false none An optional alpha-numeric number assigned to the entry by the user or accounting system to the transaction entry. This field is primarily used to identify/find the transaction in the accounting system where searching by transaction id may not be convenient.
refNo string¦null false none A secondary alpha-numeric number assigned to the entry by the user or accounting system to the transaction entry. This field is primarily used to identify/find the transaction in the accounting system where searching by transaction id may not be convenient.
supplementalFieldValues [SupplementalFieldValue] true none Additional data fields associated with the transaction entry.

TransactionImportOptions

{
  "reportingPeriod": "Months",
  "numberOfPeriods": 0
}

Used to configure the transactional data that is collected from the accounting system.

Property Type Required Restrictions Description
reportingPeriod ImportReportingPeriod false none Specifies the time period for which accounting and other financial data is prepared.

numberOfPeriods integer(int32) true none A natural number greater than or equal to zero used to specify the total number of months, quarters, or years for which financial data is desired. The month-to-date, quarter-to-date, or year-to-date period is included in this count. For example, setting 'reportingPeriod' to 'FiscalYears' and 'numberOfReportingPeriods' to 3 should be interpreted as '2 full fiscal years and fiscal YTD'. Setting 'numberOfPeriods' to zero disables data collection.

TransactionList

{
  "supplementalFields": [
    {
      "id": "string",
      "dataType": "Numeric",
      "label": "string"
    }
  ],
  "dimensions": [
    {
      "id": "string",
      "label": "string"
    }
  ],
  "fromDate": "2019-08-24T14:15:22Z",
  "toDate": "2019-08-24T14:15:22Z",
  "transactions": [
    {
      "entries": [
        {
          "dimensionTags": [
            {
              "dimensionId": "string",
              "id": "string",
              "label": "string"
            }
          ],
          "accountId": "string",
          "entry": {
            "amount": 0,
            "type": "Zero"
          },
          "memo": "string",
          "number": 0,
          "docNo": "string",
          "refNo": "string",
          "supplementalFieldValues": [
            {
              "id": "string",
              "value": "string"
            }
          ]
        }
      ],
      "id": "string",
      "reportingDate": "2019-08-24T14:15:22Z",
      "lastModifiedDate": "2019-08-24T14:15:22Z",
      "creationDate": "2019-08-24T14:15:22Z",
      "type": "string"
    }
  ]
}

Models the complete set of accounting transactions for a given time period.

Property Type Required Restrictions Description
supplementalFields [SupplementalFieldDescriptor] true none Defines the set of supplemental data fields included with the transactional data, if any.
dimensions [TransactionDimension] true none A list of the dimensions that are available as part of the transactional data. The set of dimensions may vary by accounting system and even by each organization.



Examples of dimensions are Business Relations, Products/Services, QuickBooks 'Classes', and Xero 'Tracking Categories'.
fromDate string(date-time) true none Transactions on or after this date are included.
toDate string(date-time) true none Transactions on or before this date are included.
transactions [Transaction] true none The complete set of accounting transactions for the specified time period.

VerticalAnalysis

{
  "reportingPeriods": [
    {
      "label": "string",
      "fromDate": "2019-08-24T14:15:22Z",
      "toDate": "2019-08-24T14:15:22Z"
    }
  ],
  "incomeStatement": {
    "baseFigures": "NetSales",
    "lineItems": [
      {
        "id": "string",
        "accountRef": {
          "accountId": "string"
        },
        "caption": "string",
        "lineItemType": "SourceCoA",
        "baselineFigureId": "string",
        "comparativeData": [
          {
            "value": 0,
            "comparandValue": 0,
            "percentageRatio": {
              "errorCode": "Unknown",
              "value": 0
            }
          }
        ],
        "subtotals": [
          {}
        ]
      }
    ]
  },
  "balanceSheet": {
    "baseFigures": "TotalAssets",
    "lineItems": [
      {
        "id": "string",
        "accountRef": {
          "accountId": "string"
        },
        "caption": "string",
        "lineItemType": "SourceCoA",
        "baselineFigureId": "string",
        "comparativeData": [
          {
            "value": 0,
            "comparandValue": 0,
            "percentageRatio": {
              "errorCode": "Unknown",
              "value": 0
            }
          }
        ],
        "subtotals": [
          {}
        ]
      }
    ]
  }
}

Models a Vertical Analysis

Property Type Required Restrictions Description
reportingPeriods [ReportingPeriodDescriptor] true none Information about the set of reporting periods included in the vertical analysis.
incomeStatement IncomeStatementVerticalAnalysis true none A Vertical Analysis of Income Statement line items.
balanceSheet BalanceSheetVerticalAnalysis true none A Vertical Analysis of Balance Sheet line items.

VerticalAnalysisLineItem

{
  "id": "string",
  "accountRef": {
    "accountId": "string"
  },
  "caption": "string",
  "lineItemType": "SourceCoA",
  "baselineFigureId": "string",
  "comparativeData": [
    {
      "value": 0,
      "comparandValue": 0,
      "percentageRatio": {
        "errorCode": "Unknown",
        "value": 0
      }
    }
  ],
  "subtotals": [
    {
      "id": "string",
      "accountRef": {
        "accountId": "string"
      },
      "caption": "string",
      "lineItemType": "SourceCoA",
      "baselineFigureId": "string",
      "comparativeData": [
        {
          "value": 0,
          "comparandValue": 0,
          "percentageRatio": {
            "errorCode": "Unknown",
            "value": 0
          }
        }
      ],
      "subtotals": []
    }
  ]
}

Comparative data representing a Vertical Analysis of a single line item appearing on a financial statement.

Property Type Required Restrictions Description
id string true none An identifier for the line item.
accountRef AccountReference false none A reference to an account for which full details can be found in the Chart Of Accounts.
caption string true none The line item caption, which is label for the line item as it would appear on the statement.
lineItemType LineItemType true none Models the types of line items appearing in financial statement analysis responses.

baselineFigureId string¦null false none An identifier for the line item to which this line item is being compared, if applicable.
comparativeData [VerticalComparison] true none The results of comparing this line item to the comparand line item, by reporting period.
subtotals [VerticalAnalysisLineItem] true none Each line item may contain a set of subtotal lines.

VerticalComparison

{
  "value": 0,
  "comparandValue": 0,
  "percentageRatio": {
    "errorCode": "Unknown",
    "value": 0
  }
}

Models a comparison between two values calculated as part of a vertical analysis.

Property Type Required Restrictions Description
value number(double) true none The value of the metric being compared to the comparandValue.
comparandValue number(double) true none The value is compared to the comparandValue.
percentageRatio PercentageValue true none Models a calculated percentage.

WebhookEndpoint

{
  "creationTime": "2019-08-24T14:15:22Z",
  "eventTypes": [
    "string"
  ],
  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "sharedSecret": "string",
  "url": "http://example.com"
}

Models a Webhook Endpoint that will be invoked whenever a configured event occurs within the Strongbox Platform.

Property Type Required Restrictions Description
creationTime string(date-time) true none The time at which the webhook was created.
eventTypes [string] true none The set of events for which the webhook will be invoked.
id string(uuid) true none An identifier for the Webhook Endpoint.
sharedSecret string true none A secret used in combination with HMAC SHA256 to sign requests that are sent to the webhook endpoint.
url string(uri) true none The absolute URL to the endpoint that will be called. The URL must use the https scheme.

WebhookEndpointList

{
  "webhookEndpoints": [
    {
      "creationTime": "2019-08-24T14:15:22Z",
      "eventTypes": [
        "string"
      ],
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "sharedSecret": "string",
      "url": "http://example.com"
    }
  ]
}

Models a list of Webhook Endpoints.

Property Type Required Restrictions Description
webhookEndpoints [WebhookEndpoint] true none The list of Webhook Endpoints.

WebhookEndpointParameters

{
  "events": [
    "string"
  ],
  "url": "http://example.com"
}

Models a webhook endpoint that will be invoked whenever a configured event occurs within the Strongbox Platform.

Property Type Required Restrictions Description
events [string] true none The set of events for which the webhook will be invoked.
url string(uri) true none The absolute URL to the endpoint that will be called. The URL must use the https scheme.

Website

{
  "url": "string"
}

Models information about a website.

Property Type Required Restrictions Description
url string true none The URL of the website without any implied formatting or validation.

YearEnd

{
  "month": 0
}

Represents the end of a fiscal, tax, or other year used for reporting.

Property Type Required Restrictions Description
month integer(int32) true none A number between 1-12 representing the month considered to be the end of the year for reporting purposes.

Glossary

Accounting Entity

The organization or individual on whose behalf the accounting and other financial data is prepared.

Accounting Period

See Reporting Period

App

An App represents access to a set of API resources within an environment. Each App comes with a Client Id and Client Secret that are used during authentication.

Base Currency

The base currency for an organization is the currency that is used to prepare their financial statements and typically corresponds to the country from which their operations are based.

Connection

An API resource that associates an Organization with an external Dataset including any credentials that may be required to access that dataset. Identified by a connectionId.

Dataset

A subset of resources made available from an external Datasource. For example, a QuickBooks Desktop company file, a QuickBooks Online company, or a Xero organisation. Identified by a datasetId.

Datasource

An external source of data, with an emphasis on Accounting Systems. Examples are QuickBooks Online and Xero. Identified by a datasourceNameId.

Environment

Environments provide a mechanism for you to isolate development and test resources from production resources. We provide two environments; PRODUCTION and SANDBOX, and there are no functional differences between those environments.

Financial Portal

The Strongbox Financial Portal is a website that we may optionally provision for you when you sign-up, allowing you to get started quickly without an API integration. It comes with a webpage for your customers to submit their financials and a Business Dashboard from which you can access those financials.

Financial Record

A Financial Record is a canonical representation of the accounting and other financial data that was imported from an Accounting System or other Datasource. Identified by a financialRecordId.

Financial Statement

A Financial Statement is a report prepared by an organization to communicate their financial position and activity for a reporting period. The four basic financial statements types are; the Balance Sheet, the Income Statement, the Cash Flow Statement, and the Statement Of Changes In Equity.

Organization

An Organization acts as a container for other API resources and will typically correspond to a customer, business, user, or other entity in your system. Connections are associated with an Organization as is imported financial data. Identified by an orgId.

Reporting Period

A reporting period, also known as an accounting period, is simply a discrete interval of time chosen for the reporting and analysis of a company's financial data. For example, Financial Statements are most often prepared monthly, quarterly, or annually.