Skip to main content

Quaderno API (20241028)

Download OpenAPI specification:Download

Quaderno helps you scale your business without stressing about taxes. Our powerful REST API solves all your tax compliance needs:

  • Accurate tax calculation on every sale, worldwide.
  • Billing with automatic invoices and credit notes.
  • Alerts for new tax obligations and registrations.
  • Tax reports by country or state.
  • Quaderno Checkout, if you don't have your own checkout.

Here you can check our OpenAPI reference. Don't miss our developer tools and guides too!

API features

This section covers the conventions that apply across all Quaderno API endpoints: authentication, rate limits, pagination, error codes, and versioning.

Authentication

Quaderno uses an API key to authorize all requests, combined with your account name in the endpoint URL. You can find your API keys at quadernoapp.com/users/api-keys.

The API key is passed via HTTP Basic Auth. Set the key as the username and leave the password blank:

-u <YOUR_API_KEY>:

Using that modifier with curl sends a request with an Authorization: Basic … header. Example authenticated request:

curl https://ACCOUNT_NAME.quadernoapp.com/api/invoices \
  -u <YOUR_API_KEY>:

You can also call /ping to verify your credentials and check your remaining requests without consuming a real API call:

curl https://quadernoapp.com/api/ping \
  -u <YOUR_API_KEY>:

Keep your API key secret. Anyone who has it can read and modify everything your account has access to.

Authorization

To discover the ACCOUNT_NAME for your target account, call the /authorization endpoint:

curl https://quadernoapp.com/api/authorization \
  -u <YOUR_API_KEY>:

Returns JSON structured like this:

{
  "identity": {
    "id": "999",
    "name": "Sheldon Cooper",
    "email": "[email protected]",
    "publishable_key": "pk_1111111111111111",
    "href": "https://nippur-999.quadernoapp.com/api/"
  }
}

Response fields:

Parameter Description
id An internal identifier. Do not use this to reference users in API requests.
name The user's full name.
email The user's email address.
publishable_key The user's publishable key, for use in frontend integrations.
href The custom API endpoint URL for this account. The ACCOUNT_NAME appears between https:// and .quadernoapp.

If the user does not have permission to perform an action, the API returns 401 Unauthorized.

Rate Limiting

The current limit is 100 API calls per 15 seconds.

Every successful API response includes the following headers to help you track usage:

  • X-RateLimit-Limit: Maximum requests allowed per time window.
  • X-RateLimit-Remaining: Requests remaining in the current window.
  • X-RateLimit-Reset: UTC epoch timestamp when the window resets.

When you exceed the limit, the API returns 429 Too Many Requests. We reserve the right to adjust these limits, but will keep them high enough for well-behaved applications.

Pagination

List endpoints are paginated using a created_before parameter. Pass an object ID to retrieve objects created before that ID, in reverse chronological order (newest first).

Response headers:

  • X-Pages-HasMore: true if additional records can be fetched.
  • X-Pages-NextPage: The URL to fetch the next page. Only present when more records exist.

The default page size is 25 objects, configurable with the limit parameter up to a maximum of 100.

Example paginated request:

curl https://ACCOUNT_NAME.quadernoapp.com/api/contacts?created_before=42 \
  -u <YOUR_API_KEY>:

Errors

The Quaderno API uses standard HTTP status codes:

Code Text Description
400 Bad Request The request is malformed or missing required parameters.
401 Unauthorized Invalid API key or insufficient permissions.
403 Forbidden The requested resource is restricted.
404 Not Found The requested resource does not exist.
405 Method Not Allowed The HTTP method is not supported for this endpoint.
406 Not Acceptable The request contains invalid parameter values (e.g. an unrecognized tax code).
410 Gone The resource has been permanently removed.
422 Unprocessable Entity The request is well-formed but cannot be processed for the given resource state.
429 Too Many Requests You have exceeded the rate limit. See Rate Limiting.
500 Internal Server Error An unexpected error occurred on our end. Please try again later.
502 Bad Gateway A gateway error occurred on our end. Please try again later.
503 Service Unavailable The API is temporarily offline for maintenance. Please try again later.
504 Gateway Timeout The request timed out on our end. Please try again later.

When an API error occurs, Quaderno does not retry or track the failed call. Retry logic is the responsibility of your integration.

Versioning

The Quaderno API is versioned using the release date as the version name (e.g. 20241028).

A new version is released only when a breaking change is introduced — such as renaming a field, changing a field type, or removing an endpoint.

Non-breaking additions (new endpoints, new optional parameters, new response fields) are applied directly to your current API version without requiring an upgrade.

Quaderno considers the following to be backwards-compatible changes:

  • Adding new API resources.
  • Adding new optional request parameters to existing methods.
  • Adding new properties to existing API responses.
  • Changing the order of properties in existing API responses.
  • Changing the length or format of opaque strings (object IDs, error messages, etc.).
  • Adding new webhook event types.

Your integration should handle backwards-compatible changes gracefully, ignoring unexpected fields rather than failing.

Example of a breaking change:

// Before version 20210316:
GET /taxes/calculate?country=US&postal_code=94010

// From version 20210316:
GET /tax_rates/calculate?to_country=US&to_postal_code=90210&tax_code=standard&amount=10

Upgrading your API version

Upgrade to the latest API version to benefit from new functionality. All changes are documented in the API Changelog.

Because upgrades to versions with breaking changes may affect your integration, we recommend testing in Quaderno Sandbox before upgrading production.

To upgrade or view your current version, go to Profile → API Keys.

You can also override the API version programmatically on a per-request basis using the Accept header:

curl https://ACCOUNT_NAME.quadernoapp.com/api/contacts \
  -u <YOUR_API_KEY>: \
  -H 'Accept: application/json; api_version: 20160602'

Version sunsetting and backported changes

We periodically sunset old API versions. Affected accounts are notified at least one month in advance, and our Engineering team provides full support during the transition.

In exceptional cases, we may backport breaking changes to all API versions for legal, security, or compliance reasons. These changes are communicated with the same advance notice as sunsetting.

Stay informed

To receive announcements about version sunsetting, backported changes, and new releases, ask your account admin to add a developer role with a valid email address.

For new features and product updates, see quaderno.io/blog/changelog.

Safely upgrading to API version 20220325

Version 20220325 replaces the freeform notice field in /tax_rates/calculate responses with a structured status code:

  • taxable: The transaction is taxable and the calculator returns a non-zero rate.
  • non_taxable: The transaction is exempt — either the product is not taxable in that jurisdiction (e.g. digital goods in California), or the customer's region is exempt within a registered jurisdiction.
  • not_registered: You are not registered to collect tax in the customer's jurisdiction.
  • reverse_charge: The transaction is subject to reverse charge; no VAT is calculated.

If your integration reads the notice field, switch to the status field. The notice field is no longer returned.

Safely upgrading to API version 20210701

From 1 July 2021, invoices and credit notes become final (non-editable) when any of the following occur:

  • The document has been sent to the customer.
  • The document has been paid.
  • The document has been manually marked as final in the dashboard.

To correct a finalized invoice, issue a credit note against it and create a new invoice.

Fields that remain editable on finalized documents: po_number, tag_list, payment_details, notes, custom_metadata, and billing address fields (street_line_1, street_line_2, city, region, postal_code).

API changes introduced:

  • DELETE /invoices/INVOICE_ID returns 410 Gone.
  • PUT /invoices/INVOICE_ID only accepts the fields listed above.

If your use case issues invoices automatically at the point of payment, consider migrating to the Transactions API, which creates the contact, invoice, and payment record in a single API call.

Safely upgrading to API version 20210316

Version 20210316 introduces two breaking changes:

Tax calculation endpoint

The /taxes/calculate endpoint is replaced by /tax_rates/calculate:

curl https://ACCOUNT_NAME.quadernoapp.com/api/tax_rates/calculate?to_country=US&to_postal_code=90210&tax_code=standard&amount=10 \
  -u <YOUR_API_KEY>:

The new endpoint only returns tax rates for jurisdictions where your account is registered. If you are getting a 0% rate, check your registered tax jurisdictions.

Pagination

Cursor-based pagination replaces page-based pagination. Replace the page parameter with created_before, passing the ID of the last object from the previous response. Response headers changed:

Old header New header
X-Pages-CurrentPage X-Pages-HasMore
X-Pages-TotalPages X-Pages-NextPage

The maximum page size remains 100 objects, returned in reverse chronological order.

To test before committing, override the version on individual requests:

curl https://ACCOUNT_NAME.quadernoapp.com/api/contacts \
  -u <YOUR_API_KEY>: \
  -H 'Accept: application/json; api_version: 20210316'

Transactions

Transactions create billing documents from payment processor events. Pass a sale, refund, or other event from Stripe, PayPal, or another processor and Quaderno will generate the correct invoice, receipt, or credit note, calculate the applicable taxes, and optionally deliver the document to your customer.

Create a transaction

Creates a new sale or refund transaction.

Authorizations:
API keyBearer token
Request Body schema: application/json
type
string
Default: "sale"
Enum: "sale" "refund"

The transaction’s type.

currency
string or null

Three-letter ISO currency code, in uppercase. Defaults to the account’s default currency.

custom_metadata
hash or null

Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. You can have up to 20 keys, with key names up to 40 characters long and values up to 500 characters long.

object (contact)

The data of the customer who paid the transaction. You can reference an existing contact by its id, or pass the json object to create a new contact.

date
string <date>

The transaction’s date. Defaults to today.

required
Array of objects (transaction_item)

The list of individual items that make up the transaction.

object

The mailing address to where the order will be shipped. Use it if the order contains physical goods.

object (evidence)

Evidence of the customer’s location. Highly recommended.

required
object

Detailed information about the transaction payment.

processor
string or null

The name of the platform that processed the transaction. E.g. shopify, woocommerce or any user agent you may want to use to identify yourself… Recommended

processor_id
string or null

The ID of the transaction in the processor. Use the same ID to link sales and refunds for the same operation. Recommended

processor_fee_cents
integer or null

Processor total fee, in cents.

exchange_rate
number or null <float>

The rate used for currency conversion when the transaction currency differs from the account base currency. If omitted, the default ECB reference exchange rate for the transaction date is applied.

po_number
string or null

The number of the related order. Recommended.

notes
string or null

Optional notes attached to the transaction.

tags
string or null

Tags attached to the transaction, formatted as a string of comma-separated values. Tags are additional short descriptors, commonly used for filtering and searching. Each individual tag is limited to 40 characters in length.

Responses

Request samples

Content type
application/json
{
  • "type": "sale",
  • "currency": "USD",
  • "custom_metadata": "anything_you_want: extra info",
  • "customer": {
    },
  • "date": "2019-08-24",
  • "items": [
    ],
  • "shipping_address": {
    },
  • "evidence": {
    },
  • "payment": {
    },
  • "processor": "my_platform_user_agent",
  • "processor_id": "my_internal_request_id",
  • "processor_fee_cents": 99,
  • "exchange_rate": 0.23345,
  • "po_number": "po_xxxxxxxx",
  • "notes": "A note.",
  • "tags": "tagA, tagB"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": "1593260908",
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "related_document": {
    },
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "tag_list": "refund, product_return",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "subject": "Product return refund",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "exchange_rate": 0.680309,
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
}

Contacts

Contacts represent the customers and vendors who appear on your invoices, credit notes, and expenses. Each contact stores the billing information and tax identification data Quaderno uses to determine the correct tax treatment for every transaction.

List contacts

Lists contacts, paginated and sorted by creation date (newest first).

Authorizations:
API keyBearer token
query Parameters
q
string

Filters the contact list based on the contact's full name, email or tax id. Case-sensitive.

processor_id
string

Filters the contact list based on its processor_id.

Responses

Response samples

Content type
application/json
[]

Create a contact

Creates a new contact, representing a customer or vendor who appears on invoices, credit notes, and expenses.

Authorizations:
API keyBearer token
Request Body schema: application/json
city
string or null

City/District/Suburb/Town/Village.

contact_person
string or null

If the contact is a company, this is its contact person.

country
string

2-letter ISO country code.

department
string or null

If the contact is a company, this is the deparment.

number or null

Default discount for this contact.

email
string or null <email>

The contact's email address

first_name
required
string

The contact's first name. Only if the contact is a person.

kind
string
Default: "company"
Enum: "company" "person"

The type of contact.

language
string

The contact's preferred language. 2-letter ISO language code. Should be included in the account's translations list.

last_name
string or null

The contact's last name. Only if the contact is a person.

notes
string or null

Internal notes about the contact.

phone_1
string or null

The contact's phone number.

postal_code
string or null

ZIP or postal code.

processor
string or null

The external platform where the contact was imported from, if applicable.

processor_id
string or null

The ID the payment_processor assigned to the contact.

region
string or null

State/Province/Region.

street_line_1
string or null

Address line 1 (Street address/PO Box).

street_line_2
string or null

Address line 2 (Apartment/Suite/Unit/Building).

tax_id
string or null

The contact's tax identification number. Quaderno can validate EU VAT numbers, ABN, and NZBN.

tax_status
string
Default: "taxable"
Enum: "taxable" "exempt" "reverse"

Specifies the tax status of the contact.

web
string or null <uri>

The contact's website

Responses

Request samples

Content type
application/json
{
  • "city": "Pasadena",
  • "contact_person": "string",
  • "country": "US",
  • "department": "string",
  • "discount": 0,
  • "email": "[email protected]",
  • "first_name": "Leonard",
  • "kind": "person",
  • "language": "EN",
  • "last_name": "Hofstadter",
  • "notes": "Some private notes about the contact.",
  • "phone_1": "202-555-0104",
  • "postal_code": "91104",
  • "processor": "stripe",
  • "processor_id": "cus_999999999999",
  • "region": "CA",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "tax_status": "taxable",
}

Response samples

Content type
application/json
{}

Retrieve a contact

Retrieves the details of an existing contact.

Authorizations:
API keyBearer token
path Parameters
id
required
string

ID of the desired contact.

Responses

Response samples

Content type
application/json
{}

Update a contact

Updates a contact. Any parameters not provided will be left unchanged.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

ID of the contact to be updated.

Request Body schema: application/json
city
string or null

City/District/Suburb/Town/Village.

contact_person
string or null

If the contact is a company, this is its contact person.

country
string

2-letter ISO country code.

department
string or null

If the contact is a company, this is the deparment.

number or null

Default discount for this contact.

email
string or null <email>

The contact's email address

first_name
required
string

The contact's first name. Only if the contact is a person.

kind
string
Default: "company"
Enum: "company" "person"

The type of contact.

language
string

The contact's preferred language. 2-letter ISO language code. Should be included in the account's translations list.

last_name
string or null

The contact's last name. Only if the contact is a person.

notes
string or null

Internal notes about the contact.

phone_1
string or null

The contact's phone number.

postal_code
string or null

ZIP or postal code.

processor
string or null

The external platform where the contact was imported from, if applicable.

processor_id
string or null

The ID the payment_processor assigned to the contact.

region
string or null

State/Province/Region.

street_line_1
string or null

Address line 1 (Street address/PO Box).

street_line_2
string or null

Address line 2 (Apartment/Suite/Unit/Building).

tax_id
string or null

The contact's tax identification number. Quaderno can validate EU VAT numbers, ABN, and NZBN.

tax_status
string
Default: "taxable"
Enum: "taxable" "exempt" "reverse"

Specifies the tax status of the contact.

web
string or null <uri>

The contact's website

Responses

Request samples

Content type
application/json
{
  • "city": "Pasadena",
  • "contact_person": "string",
  • "country": "US",
  • "department": "string",
  • "discount": 0,
  • "email": "[email protected]",
  • "first_name": "Leonard",
  • "kind": "person",
  • "language": "EN",
  • "last_name": "Hofstadter",
  • "notes": "Some private notes about the contact.",
  • "phone_1": "202-555-0104",
  • "postal_code": "91104",
  • "processor": "stripe",
  • "processor_id": "cus_999999999999",
  • "region": "CA",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "tax_status": "taxable",
}

Response samples

Content type
application/json
{}

Delete a contact

Permanently deletes a contact. This action cannot be undone.

Authorizations:
API keyBearer token
path Parameters
id
required
string

ID of the contact to be deleted.

Responses

Products

Products describe the goods and services you sell. Attaching a product to an invoice line item ensures consistent tax classification across all documents.

List products

Lists all products, paginated and sorted by creation date (newest first).

Authorizations:
API keyBearer token
query Parameters
q
string

Filters a product list based on the product's name or code. Case-sensitive.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a product

Creates a new product, which could be used as line item on invoices, credit notes and expenses.

Authorizations:
API keyBearer token
Request Body schema: application/json
code
required
string

The product’s SKU (Stock Keeping Unit) describe specific product variations, taking into account any combination of: attributes, currency, and cost.

country
string or null

2-letter ISO country code. Required if tax_based_on is country.

currency
string or null

Three-letter ISO currency code, in uppercase. Must be a supported currency in your payment processors.

description
required
string or null

The product’s description, meant to be displayable to the customer. Use this field to optionally store a long form explanation of the product being sold for your own rendering purposes.

paypal_interval_duration
integer or null

Only for subscriptions. Number of times the charge should recur.

paypal_interval_frequency
integer or null

Only for PayPal subscriptions. The number of intervals between subscription billings.

paypal_interval_unit
string
Default: "monthly"
Enum: "daily" "weekly" "monthly" "yearly"

Only for PayPal subscriptions. Specifies billing frequency.

kind
required
string
Default: "one_off"
Enum: "one_off" "subscription"

The type of transaction: one-off purchase or subscription.

name
required
string

The product’s name, meant to be displayable to the customer.

product_type
required
string
Default: "service"
Enum: "good" "service"

The type of the product. The product is either a tangible good or a service.

stripe_plan_id
string or null

Only for Stripe subscriptions. ID of the Stripe price related to the subscription.

tax_based_on
required
string
Default: "customer_country"
Enum: "customer_country" "country"

How taxes are going to be calculated: based on the customer country or a particular country.

tax_class
required
string
Default: "eservice"
Enum: "consulting" "eservice" "ebook" "saas" "standard" "reduced"

The tax class that applies to the product.

tax_type
required
string
Default: "included"
Enum: "excluded" "included"

Specify if taxes are included or excluded in the unit_cost.

unit_cost
required
string

The unit amount to be charged

stock
required
string or null

The stock of the physical product.

Responses

Request samples

Content type
application/json
{
  • "code": "012345678901-MFN",
  • "country": "US",
  • "currency": "USD",
  • "description": "string",
  • "paypal_interval_duration": 1,
  • "paypal_interval_frequency": 0,
  • "paypal_interval_unit": "monthly",
  • "kind": "one_off",
  • "name": "Ruby Essentials",
  • "product_type": "good",
  • "stripe_plan_id": "price_1GtYUvKYlo3Dy5yXgrQS",
  • "tax_based_on": "customer_country",
  • "tax_class": "consulting",
  • "tax_type": "excluded",
  • "unit_cost": "9.99",
  • "stock": "10"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "code": "012345678901-MFN",
  • "country": "US",
  • "created_at": "1593260908",
  • "currency": "USD",
  • "description": "string",
  • "paypal_interval_duration": 1,
  • "paypal_interval_frequency": 0,
  • "paypal_interval_unit": "monthly",
  • "kind": "one_off",
  • "name": "Ruby Essentials",
  • "product_type": "good",
  • "stripe_plan_id": "price_1GtYUvKYlo3Dy5yXgrQS",
  • "tax_based_on": "customer_country",
  • "tax_class": "consulting",
  • "tax_type": "excluded",
  • "unit_cost": "9.99",
  • "stock": "10"
}

Retrieve a product

Retrieves the details of an existing product.

Authorizations:
API keyBearer token
path Parameters
id
required
string

ID of the desired product.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "code": "012345678901-MFN",
  • "country": "US",
  • "created_at": "1593260908",
  • "currency": "USD",
  • "description": "string",
  • "paypal_interval_duration": 1,
  • "paypal_interval_frequency": 0,
  • "paypal_interval_unit": "monthly",
  • "kind": "one_off",
  • "name": "Ruby Essentials",
  • "product_type": "good",
  • "stripe_plan_id": "price_1GtYUvKYlo3Dy5yXgrQS",
  • "tax_based_on": "customer_country",
  • "tax_class": "consulting",
  • "tax_type": "excluded",
  • "unit_cost": "9.99",
  • "stock": "10"
}

Update a product

Updates a product. Any parameters not provided will be left unchanged.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

ID of the product to be updated.

Request Body schema: application/json
code
required
string

The product’s SKU (Stock Keeping Unit) describe specific product variations, taking into account any combination of: attributes, currency, and cost.

country
string or null

2-letter ISO country code. Required if tax_based_on is country.

currency
string or null

Three-letter ISO currency code, in uppercase. Must be a supported currency in your payment processors.

description
required
string or null

The product’s description, meant to be displayable to the customer. Use this field to optionally store a long form explanation of the product being sold for your own rendering purposes.

paypal_interval_duration
integer or null

Only for subscriptions. Number of times the charge should recur.

paypal_interval_frequency
integer or null

Only for PayPal subscriptions. The number of intervals between subscription billings.

paypal_interval_unit
string
Default: "monthly"
Enum: "daily" "weekly" "monthly" "yearly"

Only for PayPal subscriptions. Specifies billing frequency.

kind
required
string
Default: "one_off"
Enum: "one_off" "subscription"

The type of transaction: one-off purchase or subscription.

name
required
string

The product’s name, meant to be displayable to the customer.

product_type
required
string
Default: "service"
Enum: "good" "service"

The type of the product. The product is either a tangible good or a service.

stripe_plan_id
string or null

Only for Stripe subscriptions. ID of the Stripe price related to the subscription.

tax_based_on
required
string
Default: "customer_country"
Enum: "customer_country" "country"

How taxes are going to be calculated: based on the customer country or a particular country.

tax_class
required
string
Default: "eservice"
Enum: "consulting" "eservice" "ebook" "saas" "standard" "reduced"

The tax class that applies to the product.

tax_type
required
string
Default: "included"
Enum: "excluded" "included"

Specify if taxes are included or excluded in the unit_cost.

unit_cost
required
string

The unit amount to be charged

stock
required
string or null

The stock of the physical product.

Responses

Request samples

Content type
application/json
{
  • "code": "012345678901-MFN",
  • "country": "US",
  • "currency": "USD",
  • "description": "string",
  • "paypal_interval_duration": 1,
  • "paypal_interval_frequency": 0,
  • "paypal_interval_unit": "monthly",
  • "kind": "one_off",
  • "name": "Ruby Essentials",
  • "product_type": "good",
  • "stripe_plan_id": "price_1GtYUvKYlo3Dy5yXgrQS",
  • "tax_based_on": "customer_country",
  • "tax_class": "consulting",
  • "tax_type": "excluded",
  • "unit_cost": "9.99",
  • "stock": "10"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "code": "012345678901-MFN",
  • "country": "US",
  • "created_at": "1593260908",
  • "currency": "USD",
  • "description": "string",
  • "paypal_interval_duration": 1,
  • "paypal_interval_frequency": 0,
  • "paypal_interval_unit": "monthly",
  • "kind": "one_off",
  • "name": "Ruby Essentials",
  • "product_type": "good",
  • "stripe_plan_id": "price_1GtYUvKYlo3Dy5yXgrQS",
  • "tax_based_on": "customer_country",
  • "tax_class": "consulting",
  • "tax_type": "excluded",
  • "unit_cost": "9.99",
  • "stock": "10"
}

Delete a product

Permanently deletes a product. This action cannot be undone.

Authorizations:
API keyBearer token
path Parameters
id
required
string

ID of the product to be deleted.

Responses

Tax Rates

The Tax Rates endpoint calculates the applicable tax rates for a given customer address and product type. Use it at checkout to show customers the correct tax before charging them, or to validate your own tax logic against Quaderno's engine.

Calculate a tax rate

Calculates the applicable tax rate for a given address and transaction type.

Authorizations:
API keyBearer token
query Parameters
from_country
string

The seller's country. 2-letter ISO country code. Defaults to the account's country.

from_postal_code
string

The seller's ZIP or postal code. Defaults to the account's postal code.

to_country
required
string
Example: to_country=US

The customer's country. 2-letter ISO country code.

to_postal_code
string
Example: to_postal_code=10128

The customer's ZIP or postal code.

to_city
string
Example: to_city=New York

The customer's city. Recommended for US Sales Tax calculations.

to_street
string
Example: to_street=1395 Lexington Avenue

The customer's street address. Recommended for US Sales Tax calculations.

tax_id
string

The customer's tax ID. Quaderno can validate VAT/GST numbers from the EU, United Kingdom, Switzerland, Québec (Canada), Australia, and New Zealand.

tax_code
string
Enum: "consulting" "eservice" "ebook" "saas" "standard" "reduced" "exempt"
Example: tax_code=eservice

The transaction's tax code. Tax codes can be obtained via GET /tax_codes. Defaults to the account's default tax code.

tax_behavior
string
Enum: "inclusive" "exclusive"

Specifies whether the price is considered inclusive of taxes or exclusive of taxes.

product_type
string
Enum: "good" "service"

Specifies whether the product is a good or a service. Defaults to the account's default.

date
string

The transaction's date. Defaults to today.

amount
string

The transaction's amount.

currency
string

The transaction's currency. Three-letter ISO currency code, in uppercase. Defaults to the account's currency.

Responses

Response samples

Content type
application/json
{
  • "name": "Sales tax",
  • "rate": 8.875,
  • "taxable_part": 100,
  • "country": "US",
  • "region": "NY",
  • "county": "NEW YORK",
  • "city": "NEW YORK",
  • "tax_code": "eservice",
  • "tax_behavior": "eservice",
  • "tax_amount": 100,
  • "subtotal": 100,
  • "total_amount": 100,
  • "status": "not_registered",
  • "notes": "Tax amount subject to reverse charge.",
  • "notice": "You aren't registered for tax collection in United States - New York. If you need to collect taxes there, please add the tax jurisdiction to your Quaderno account.",
  • "additional_name": "string",
  • "additional_rate": 0.1,
  • "additional_taxable_part": 0.1,
  • "additional_tax_amount": 0.1
}

Registrations

Registrations represent your tax IDs — the numbers issued by tax authorities in each jurisdiction where your business is registered to collect tax. Use the validate endpoint to check whether a customer's tax ID is active before applying B2B exemptions such as EU reverse charge.

Validate a tax id

The result can be true (valid tax ID, meaning it represents a business), false (invalid tax ID) or null (the external validation service is temporarily unavailable).

Authorizations:
API keyBearer token
query Parameters
country
required
string
Example: country=DE

Tax ID's registration country, represented as 2-letter ISO 3166-1 code.

tax_id
string
Example: tax_id=DE303954554

The tax ID to be validated.

Responses

Response samples

Content type
application/json
{
  • "valid": true
}

Tax Jurisdictions

Tax jurisdictions are the geographic areas where specific tax rules apply — countries, states, and provinces. Use this endpoint to retrieve supported jurisdictions along with their applicable tax rates and registration requirements.

Retrieve a jurisdiction

Retrieves a tax jurisdiction (area subject to its own tax regulations).

Authorizations:
API keyBearer token
path Parameters
id
required
string

ID of the desired jurisdiction.

Responses

Response samples

Content type
application/json
{
  • "id": 94,
  • "name": "Canada - British Columbia",
  • "country": "CA",
  • "region": "BC"
}

List all jurisdiction

Retrieves the list of all tax jurisdictions (areas subject to its own tax regulations).

Authorizations:
API keyBearer token
query Parameters
country
string
Example: country=CA

Case-sensitive filter based on the jurisdiction's country 2-letter ISO 3166-1 code.

region
string

Case-sensitive filter based on the jurisdiction's region. Accepts the special string none to return jurisdictions that specifically have no region.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Registered Jurisdictions

Registered jurisdictions are the locations where your business is registered to collect taxes and holds a local tax ID. This registration is independent of the countries or states where you sell your products or services.

List tax IDs

Lists all registered tax IDs.

Authorizations:
API keyBearer token

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a tax ID

Registers a new tax ID representing a business and associates it to a specific tax jurisdiction.

Authorizations:
API keyBearer token
Request Body schema: application/json
jurisdiction_id
required
integer

ID of the tax jurisdiction where the tax ID is registered.

value
required
string

Value of the tax ID. For instance, a VAT number.

valid_from
string

The tax ID's validity date. Defaults to the beginning of the year.

valid_until
string

The tax ID's expiration date, or null if the tax ID has no expiration date.

permanent_establishment
boolean
Default: false

Whether your business has physical presence (office, warehouse, etc) in the given jurisdiction.

import_scheme
boolean
Default: false

Whether the business is registered or not in the EU import scheme for foreign sellers of physical goods.

Responses

Request samples

Content type
application/json
{
  • "jurisdiction_id": 94,
  • "value": "123456789BW0001",
  • "valid_from": "2023-01-01",
  • "valid_until": "",
  • "permanent_establishment": true,
  • "import_scheme": true
}

Response samples

Content type
application/json
{
  • "id": 23546,
  • "import_scheme": true,
  • "jurisdiction": {
    },
  • "permanent_establishment": true,
  • "state": "verified",
  • "valid_from": "2023-01-01",
  • "valid_until": "2024-12-31",
  • "value": "123456789BW0001",
  • "created_at": 1681199310
}

Retrieve a tax ID

Retrieves the details of an existing tax ID.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

ID of the desired tax ID.

Responses

Response samples

Content type
application/json
{
  • "id": 23546,
  • "import_scheme": true,
  • "jurisdiction": {
    },
  • "permanent_establishment": true,
  • "state": "verified",
  • "valid_from": "2023-01-01",
  • "valid_until": "2024-12-31",
  • "value": "123456789BW0001",
  • "created_at": 1681199310
}

Update a tax ID

Updates a tax ID. Any parameters not provided will be left unchanged.

Authorizations:
API keyBearer token
path Parameters
id
required
any

ID of the tax ID to be updated.

Request Body schema: application/json
value
string

Value of the tax ID you need fixing.

valid_from
string

The tax ID's validity date. Defaults to the beginning of the year.

valid_until
string

The tax ID's expiration date, or null if the tax ID has no expiration date.

permanent_establishment
boolean
Default: false

Whether your business has physical presence (office, warehouse, etc) in the given jurisdiction.

import_scheme
boolean
Default: false

Whether the business is registered or not in the EU import scheme for foreign sellers of physical goods.

Responses

Request samples

Content type
application/json
{
  • "value": "123456789BW0001",
  • "valid_from": "2023-01-01",
  • "valid_until": "2024-12-31",
  • "permanent_establishment": true,
  • "import_scheme": true
}

Response samples

Content type
application/json
{
  • "id": 23546,
  • "import_scheme": true,
  • "jurisdiction": {
    },
  • "permanent_establishment": true,
  • "state": "verified",
  • "valid_from": "2023-01-01",
  • "valid_until": "2024-12-31",
  • "value": "123456789BW0001",
  • "created_at": 1681199310
}

Delete a tax ID

Permanently deletes a tax ID. This action cannot be undone.

Authorizations:
API keyBearer token
path Parameters
id
required
string

ID of the tax ID to be deleted.

Responses

Tax Codes

Tax codes classify your products and services for tax purposes. Different jurisdictions apply different rules depending on whether an item is a physical good, a digital service, a SaaS subscription, or an ebook. Assigning the right tax code ensures Quaderno applies the correct rate — and the correct exemption — for every sale.

Retrieve a tax code

Retrieves a tax code, which classify goods and services for tax purposes.

Authorizations:
API keyBearer token
path Parameters
id
required
string
Enum: "consulting" "ebook" "eservice" "exempt" "reduced" "saas" "standard"
Example: eservice

The ID of the tax code to retrieve.

Responses

Response samples

Content type
application/json
{
  • "id": "eservice",
  • "description": "Service that is delivered over the internet. It is essentially automated, involves minimal human intervention and in the absence of information technology does not have viability.",
  • "name": "Electronically supplied services"
}

List all tax codes

Retrieves the list of supported tax codes.

Authorizations:
API keyBearer token

Responses

Response samples

Content type
application/json
[
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    },
  • {
    }
]

Evidence

Evidence records the customer location signals — IP address, billing country, bank country — that you have collected for a sale. For EU VAT on digital services, you must store at least two non-conflicting pieces of evidence per transaction to comply with the rules-of-origin requirements.

List all evidence objects

Retrieves the list of evidence objects, paginated and sorted by creation date (newest first).

Authorizations:
API keyBearer token
query Parameters
state
string

A filter on the list based on the evidence's state. You can combine multiple states separated by commas. Valid states are confirmed, unsettled, and conflicting.

document_id
integer

A filter on the list based on the evidence's related document.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create an evidence

Creates a new evidence.

Authorizations:
API keyBearer token
Request Body schema: application/json
additional_evidence
string or null

Additional evidence used to proof the customer's location. Required if there's a `additional_evidence_country'.

additional_evidence_country
string or null

2-letter ISO 3166-1 code.

bank_country
string or null

2-letter ISO 3166-1 code.

billing_country
string or null

2-letter ISO 3166-1 code.

document_id
required
integer

Unique identifier for the related invoice.

ip_address
string or null

The customer's IP address

notes
string or null

Internal notes about the evidence.

state
string
Default: "unsettled"
Enum: "unsettled" "conflicting" "confirmed"

State of the evidence

Responses

Request samples

Content type
application/json
{
  • "additional_evidence": "Phone bill",
  • "additional_evidence_country": "DE",
  • "bank_country": "DE",
  • "billing_country": "DE",
  • "document_id": 43123,
  • "ip_address": "127.0.0.1",
  • "notes": "Some private notes about the evidence.",
  • "state": "unsettled"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "additional_evidence": "Phone bill",
  • "additional_evidence_country": "DE",
  • "bank_country": "DE",
  • "billing_country": "DE",
  • "created_at": "1593260908",
  • "document_id": 43123,
  • "ip_address": "127.0.0.1",
  • "ip_country": "DE",
  • "notes": "Some private notes about the evidence.",
  • "state": "unsettled",
}

Retrieve an evidence

Retrieves updated info from the evidence.

Authorizations:
API keyBearer token
path Parameters
id
required
string
Example: 41

The ID of the evidence to retrieve.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "additional_evidence": "Phone bill",
  • "additional_evidence_country": "DE",
  • "bank_country": "DE",
  • "billing_country": "DE",
  • "created_at": "1593260908",
  • "document_id": 43123,
  • "ip_address": "127.0.0.1",
  • "ip_country": "DE",
  • "notes": "Some private notes about the evidence.",
  • "state": "unsettled",
}

Update an evidence

Updates the specified evidence by setting the values of the parameters passed. Any parameters not provided will be left unchanged. This request accepts mostly the same arguments as the evidence creation call.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

The ID of the evidence to be updated.

Request Body schema: application/json
additional_evidence
string or null

Additional evidence used to proof the customer's location. Required if there's a `additional_evidence_country'.

additional_evidence_country
string or null

2-letter ISO 3166-1 code.

bank_country
string or null

2-letter ISO 3166-1 code.

billing_country
string or null

2-letter ISO 3166-1 code.

document_id
required
integer

Unique identifier for the related invoice.

ip_address
string or null

The customer's IP address

notes
string or null

Internal notes about the evidence.

state
string
Default: "unsettled"
Enum: "unsettled" "conflicting" "confirmed"

State of the evidence

Responses

Request samples

Content type
application/json
{
  • "additional_evidence": "Phone bill",
  • "additional_evidence_country": "DE",
  • "bank_country": "DE",
  • "billing_country": "DE",
  • "document_id": 43123,
  • "ip_address": "127.0.0.1",
  • "notes": "Some private notes about the evidence.",
  • "state": "unsettled"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "additional_evidence": "Phone bill",
  • "additional_evidence_country": "DE",
  • "bank_country": "DE",
  • "billing_country": "DE",
  • "created_at": "1593260908",
  • "document_id": 43123,
  • "ip_address": "127.0.0.1",
  • "ip_country": "DE",
  • "notes": "Some private notes about the evidence.",
  • "state": "unsettled",
}

Invoices

Invoices are formal payment requests that document amounts owed by customers for goods or services. Once issued, invoices are legally immutable in most jurisdictions — only administrative fields can be changed. Use the void endpoint to correct a finalized invoice.

List all invoices

Lists all invoices, paginated and sorted by creation date (newest first).

Authorizations:
API keyBearer token
query Parameters
q
string

Filters an invoices list based on the invoice number, customer name or PO number.

date
string

Filters an invoices list based on the issue date. A date range must be entered. Allowed formats are 2019-01-01,2019-12-31 and 2019/01/01,2019/12/31.

state
string
Enum: "outstanding" "late" "uncollectible" "paid"

Filters an invoices list based on the invoice state.

processor_id
string

Filters an invoices list based on its processor_id.

contact
integer

Filters an invoices list based on the customer ID.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create an invoice

Creates a new invoice. If a payment_method is provided, a payment for the full amount is automatically recorded and the invoice is immediately marked as paid.

Authorizations:
API keyBearer token
Request Body schema: application/json
number
string

Unique, sequential number identifying this invoice. Invoice numbers must be sequential without gaps or duplicates to comply with legal requirements. Automatically generated if not provided.

issue_date
string <date>

Date the invoice was issued. May differ from the actual delivery or service date.

po_number
string or null

Customer's purchase order number for reference and tracking.

due_date
string or null <date>

Payment due date. Defines when payment is expected and affects the invoice state (outstanding, late, etc.).

currency
string

Three-letter ISO 4217 currency code in uppercase.

exchange_rate
number or null <float>

Exchange rate applied when converting from transaction currency to account base currency. If omitted, the ECB (European Central Bank) reference rate for the issue date is automatically applied.

tag_list
Array of strings or null

Array of tags for categorizing and filtering invoices. Useful for organizing by product line, sales channel, or custom categories.

payment_details
string or null

Additional information about accepted payment methods, displayed to the customer.

notes
string or null

Internal notes or additional information about this invoice. Not typically shown to customers.

required
contact (object) or object

Customer being billed. Can reference an existing contact by ID or include full contact details.

object (attachment)

Invoices and expenses can have attached files.

street_line_1
string or null

First line of customer's billing address (street address or PO Box).

street_line_2
string or null

Second line of customer's billing address (apartment, suite, unit, or building number).

tax_id
string or null

Customer's tax identification number (VAT number, EIN, etc.). Important for B2B transactions and tax exemptions.

subject
string or null

Brief summary or title describing what this invoice is for. Displayed prominently on the document.

required
Array of objects (document_item)

Line items included in this invoice (products, services, fees, etc.). Maximum 200 items per request; use update requests to add more. Total limit: 1000 items per invoice.

object (evidence)

Location evidence (IP address, billing country, etc.) used to determine applicable tax rates and jurisdictions.

payment_processor
string or null

Name of the payment processor that handled this transaction (e.g., "stripe", "paypal", "braintree").

payment_processor_id
string or null

Transaction ID from the payment processor. Used to link this invoice to the original payment gateway transaction.

processor_fee_cents
integer or null

Payment processing fee charged by the payment processor, in cents.

custom_metadata
object or null

Custom key-value pairs for storing additional structured data. Useful for integrations and storing application-specific information.

payment_method
string
Enum: "credit_card" "cash" "wire_transfer" "direct_debit" "check" "iou" "paypal" "offset" "other"

If provided, a payment for the full invoice amount is automatically recorded using this method, marking the invoice as paid immediately upon creation.

Responses

Request samples

Content type
application/json
{
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "exchange_rate": 0.680309,
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {
    },
  • "attachment": {
    },
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "subject": "string",
  • "items": [
    ],
  • "evidence": {
    },
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "payment_method": "credit_card"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "related_document": {
    },
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "exchange_rate": 0.680309,
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "city": "Pasadena",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "subject": "string",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "evidence": {
    },
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
  • "alerts": [
    ],
}

Retrieve an invoice

Retrieves the details of an existing invoice. You need only supply the unique invoice identifier that was returned upon invoice creation.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired invoice.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "related_document": {
    },
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "exchange_rate": 0.680309,
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "city": "Pasadena",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "subject": "string",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "evidence": {
    },
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
  • "alerts": [
    ],
}

Update an invoice

Updates an existing invoice. Once finalized, invoices are legally immutable — tax law prohibits altering amounts, line items, dates, or customer details on issued invoices. Only administrative fields (tag_list, payment_details, notes, custom_metadata) can still be modified. If a correction is needed, void the invoice and issue a new one.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

The ID of the invoice to be updated.

Request Body schema: application/json
tag_list
Array of strings or null

Multiple tags should be separated by commas.

payment_details
string or null

Detailed information about the accepted payment methods.

notes
string or null

Extra notes about the document.

custom_metadata
object or null

Set of key-value pairs that you can attach to an object.

object (attachment)

Invoices and expenses can have attached files.

Responses

Request samples

Content type
application/json
{
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "custom_metadata": {
    },
  • "attachment": {
    }
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "related_document": {
    },
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "exchange_rate": 0.680309,
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "city": "Pasadena",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "subject": "string",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "evidence": {
    },
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
  • "alerts": [
    ],
}

Mark an invoice as uncollectible

Marks an invoice as uncollectible. This is useful for tracking invoices that you have determined will not be paid.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired invoice.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "related_document": {
    },
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "exchange_rate": 0.680309,
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "city": "Pasadena",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "subject": "string",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "evidence": {
    },
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
  • "alerts": [
    ],
}

Void an invoice

Voids an invoice by creating a credit note with the given reason. If the invoice is pending, it will be marked as paid via an offset payment.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the invoice to void.

Request Body schema: application/json
void_reason
required
string

Responses

Request samples

Content type
application/json
{
  • "void_reason": "string"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "related_document": {
    },
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "exchange_rate": 0.680309,
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "city": "Pasadena",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "subject": "string",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "evidence": {
    },
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
  • "alerts": [
    ],
}

Record a payment

Records a payment against an invoice. When the total payments reach the invoice amount, the invoice is automatically marked as paid.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the invoice.

Request Body schema: application/json
amount
number <float>

Paid amount.

date
string or null <date>

Default is current date.

payment_method
string or null
Enum: "credit_card" "cash" "wire_transfer" "direct_debit" "check" "iou" "paypal" "other" "credit" "offset"
processor
string or null

The payment processor used to process the payment.

processor_id
string or null

The ID the payment_processor assigned to the payment.

Responses

Request samples

Content type
application/json
{
  • "amount": 56.6,
  • "date": "2020-06-27",
  • "payment_method": "credit_card",
  • "processor": "stripe",
  • "processor_id": "ch_999999999999"
}

Response samples

Content type
application/json
{}

Deliver an invoice

Sends the invoice to the customer via email using the account's configured invoice template and language. The contact must have a valid email address. Delivery history is recorded and accessible via the deliveries field.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired invoice.

Responses

Receipts

Receipts document completed transactions. Unlike invoices, receipts are always paid by definition — a payment method is required at creation. They are immutable after creation; use the void endpoint if a correction is needed.

List all receipts

Lists all receipts, paginated and sorted by creation date (newest first). All receipts are paid by definition.

Authorizations:
API keyBearer token
query Parameters
q
string

Filters an receipts list based on the receipt number, customer name or PO number.

date
string

Filters an receipts list based on the issue date. A date range must be entered. Allowed formats are 2019-01-01,2019-12-31 and 2019/01/01,2019/12/31.

processor_id
string

Filters an receipts list based on its processor_id.

contact
integer

Filters an receipts list based on the customer ID.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a receipt

Creates a new receipt documenting a completed transaction. Unlike invoices, receipts are always paid — a payment_method is required. Receipts are immutable after creation and cannot be updated or deleted. Use the void endpoint if a correction is needed.

Authorizations:
API keyBearer token
Request Body schema: application/json
number
string

Unique, sequential number identifying this receipt. Receipt numbers must be sequential without gaps or duplicates to comply with legal requirements. Automatically generated if not provided.

issue_date
string <date>

Date the receipt was issued. May differ from the actual transaction date.

po_number
string or null

Customer's purchase order number for reference and tracking.

due_date
string or null <date>

Payment due date. For receipts this is typically the same as the issue date since payment is usually immediate.

currency
string

Three-letter ISO 4217 currency code in uppercase.

exchange_rate
number or null <float>

Exchange rate applied when converting from transaction currency to account base currency. If omitted, the ECB (European Central Bank) reference rate for the issue date is automatically applied.

tag_list
Array of strings or null

Array of tags for categorizing and filtering receipts. Useful for organizing by product line, sales channel, or custom categories.

payment_details
string or null

Additional information about accepted payment methods, displayed to the customer.

notes
string or null

Internal notes or additional information about this receipt. Not typically shown to customers.

required
contact (object) or object

Customer receiving this receipt. Can reference an existing contact by ID or include full contact details.

street_line_1
string or null

First line of customer's billing address (street address or PO Box).

street_line_2
string or null

Second line of customer's billing address (apartment, suite, unit, or building number).

subject
string or null

Brief summary or title describing what this receipt is for. Displayed prominently on the document.

required
Array of objects (document_item)

Line items included in this receipt (products, services, fees, etc.). Maximum 200 items per request; use update requests to add more. Total limit: 1000 items per receipt.

object (evidence)

Location evidence (IP address, billing country, etc.) used to determine applicable tax rates and jurisdictions.

payment_processor
string or null

Name of the payment processor that handled this transaction (e.g., "stripe", "paypal", "braintree").

payment_processor_id
string or null

Transaction ID from the payment processor. Used to link this receipt to the original payment gateway transaction.

processor_fee_cents
integer or null

Payment processing fee charged by the payment processor, in cents.

custom_metadata
object or null

Custom key-value pairs for storing additional structured data. Useful for integrations and storing application-specific information.

payment_method
required
string
Enum: "credit_card" "cash" "wire_transfer" "direct_debit" "check" "iou" "paypal" "offset" "other"

How the customer paid. Required — receipts document completed transactions and must always record the payment method used.

Responses

Request samples

Content type
application/json
{
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "exchange_rate": 0.680309,
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {
    },
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "items": [
    ],
  • "evidence": {
    },
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "payment_method": "credit_card"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "exchange_rate": 0.680309,
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "attachments": [
    ],
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "city": "Pasadena",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "evidence": {
    },
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "paid",
  • "alerts": [
    ],
}

Retrieve an receipt

Retrieves the details of an existing receipt.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired receipt.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "exchange_rate": 0.680309,
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "attachments": [
    ],
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "city": "Pasadena",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "evidence": {
    },
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "paid",
  • "alerts": [
    ],
}

Void a receipt

Voids a receipt by automatically issuing an offsetting credit note. Tax law prohibits deleting receipts — voiding is the only way to reverse a completed transaction. A void_reason is required for audit purposes.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the receipt to void.

Request Body schema: application/json
void_reason
required
string

Responses

Request samples

Content type
application/json
{
  • "void_reason": "string"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "exchange_rate": 0.680309,
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "attachments": [
    ],
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "city": "Pasadena",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "evidence": {
    },
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "paid",
  • "alerts": [
    ],
}

Deliver an receipt

Sends the receipt to the customer via email using the account's configured invoice template and language. The contact must have a valid email address. Delivery history is recorded and accessible via the deliveries field.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired receipt.

Responses

Credits

Credit notes reduce or cancel amounts owed by customers. They are used for refunds, order cancellations, and pricing corrections. Tax law prohibits deleting credit notes — voiding is the only way to reverse one.

List all credit notes

Lists all credit notes, paginated and sorted by creation date (newest first). Credit notes are used to cancel or partially refund an invoice.

Authorizations:
API keyBearer token
query Parameters
q
string

Filters a credit notes list based on the credit number, customer name or PO number.

date
string

Filters a credit notes list based on the issue date. A date range must be entered. Allowed formats are 2019-01-01,2019-12-31 and 2019/01/01,2019/12/31.

state
string
Enum: "outstanding" "late" "paid"

Filters a credit notes list based on the credit state.

processor_id
string

Filters a credit notes list based on its processor_id.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a credit note

Creates a credit note against an existing invoice. The credit note offsets the invoice amount — fully or partially — and automatically records the refund. Credit notes are immutable after creation and cannot be updated or deleted. Use the void endpoint if a correction is needed.

Authorizations:
API keyBearer token
Request Body schema: application/json
invoice_id
required
integer

The ID of the refunded invoice.

payment_method
string
Enum: "credit_card" "cash" "wire_transfer" "direct_debit" "check" "iou" "paypal" "other"

Payment method used to refund the credited amount.

credited_amount
number

Total amount to be credited, equal or lower than the total amount of the related invoice. Only works for refunds of invoices with one single item. When empty, defaults to the total amount of the related invoice.

Responses

Request samples

Content type
application/json
Example
{
  • "invoice_id": 139331
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": "1593260908",
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "related_document": {
    },
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "tag_list": "refund, product_return",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "subject": "Product return refund",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "exchange_rate": 0.680309,
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
}

Retrieve a credit note

Retrieves the details of an existing credit note. You need only supply the unique identifier returned upon creation.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired credit.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": "1593260908",
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "related_document": {
    },
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "tag_list": "refund, product_return",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "subject": "Product return refund",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "exchange_rate": 0.680309,
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
}

Update a credit note

Updates an existing credit note. Once finalized, credit notes are legally immutable — tax law prohibits altering amounts, line items, or customer details. Only administrative fields (tag_list, payment_details, notes, custom_metadata) can still be modified. If a correction is needed, void the credit note and issue a new one.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

The ID of the credit to be updated.

Request Body schema: application/json
tag_list
Array of strings or null

Multiple tags should be separated by commas.

payment_details
string or null

Detailed information about the accepted payment methods.

notes
string or null

Extra notes about the document.

custom_metadata
object or null

Set of key-value pairs that you can attach to an object.

object (attachment)

Invoices and expenses can have attached files.

Responses

Request samples

Content type
application/json
{
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "custom_metadata": {
    },
  • "attachment": {
    }
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": "1593260908",
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "related_document": {
    },
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "tag_list": "refund, product_return",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "subject": "Product return refund",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "exchange_rate": 0.680309,
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
}

Record a payment

Records a payment against a credit note. When the total payments reach the credit note amount, it is automatically marked as paid.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the credit note.

Request Body schema: application/json
amount
number <float>

Paid amount.

date
string or null <date>

Default is current date.

payment_method
string or null
Enum: "credit_card" "cash" "wire_transfer" "direct_debit" "check" "iou" "paypal" "other" "credit" "offset"
processor
string or null

The payment processor used to process the payment.

processor_id
string or null

The ID the payment_processor assigned to the payment.

Responses

Request samples

Content type
application/json
{
  • "amount": 56.6,
  • "date": "2020-06-27",
  • "payment_method": "credit_card",
  • "processor": "stripe",
  • "processor_id": "ch_999999999999"
}

Response samples

Content type
application/json
{}

Void a credit note

Voids a credit note, effectively canceling it. Tax law prohibits deleting credit notes — voiding is the only way to reverse one. A void_reason is required for audit purposes. Voiding reopens the original invoice if it was closed by this credit note.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

The ID of the credit to be voided.

Request Body schema: application/json
void_reason
required
string

Responses

Request samples

Content type
application/json
{
  • "void_reason": "string"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": "1593260908",
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "related_document": {
    },
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "tag_list": "refund, product_return",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "subject": "Product return refund",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "exchange_rate": 0.680309,
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
}

Deliver a credit

Sends the credit note to the customer via email using the account's configured template and language. The contact must have a valid email address. Delivery history is recorded and accessible via the deliveries field.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired credit.

Responses

Proformas

Proformas are preliminary documents sent to customers before a sale is confirmed. They outline the expected cost and can be accepted, declined, or converted into a full invoice once the customer agrees.

List all proformas

Lists all proformas, paginated and sorted by creation date (newest first).

Authorizations:
API keyBearer token
query Parameters
q
string

Filters a proformas list based on the proforma number, customer name or PO number.

date
string

Filters a proformas list based on the issue date. A date range must be entered. Allowed formats are 2019-01-01,2019-12-31 and 2019/01/01,2019/12/31.

state
string
Enum: "outstanding" "accepted" "declined" "invoiced" "late"

Filters a proformas list based on the proforma state.

contact
integer

Filters a proformas list based on the customer ID.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a proforma

Creates a new proforma object.

Authorizations:
API keyBearer token
Request Body schema: application/json
object (attachment)

Invoices and expenses can have attached files.

required
contact (object) or object

Customer receiving the proforma. Can reference an existing contact by ID or include full contact details.

currency
string

Three-letter ISO 4217 currency code in uppercase.

custom_metadata
object or null

Custom key-value pairs for storing additional structured data.

due_days
integer or null

Number of days after the invoice issue date when payment is due. When the proforma is converted to an invoice, the invoice due_date is calculated as issue_date + due_days.

required
Array of objects (document_item)

Line items included in this proforma (products, services, fees, etc.).

notes
string or null

Internal notes or additional information about this proforma.

payment_details
string or null

Additional information about accepted payment methods, displayed to the customer.

po_number
string or null

Customer's purchase order number for reference and tracking.

street_line_1
string or null

First line of customer's billing address.

street_line_2
string or null

Second line of customer's billing address.

subject
string or null

Brief summary or title describing what this proforma is for. Displayed prominently on the document.

tag_list
Array of strings or null

Array of tags for categorizing and filtering proformas.

tax_id
string or null

Customer's tax identification number (VAT number, EIN, etc.).

valid_until
string or null <date>

Expiration date of the proforma. Once this date is passed and the proforma has not been accepted, it transitions to the "late" state.

Responses

Request samples

Content type
application/json
{
  • "attachment": {
    },
  • "contact": {
    },
  • "currency": "USD",
  • "custom_metadata": { },
  • "due_days": 30,
  • "items": [
    ],
  • "notes": "string",
  • "payment_details": "string",
  • "po_number": "999",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "tag_list": "consulting, premium",
  • "tax_id": "string",
  • "valid_until": "2020-07-27"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "alerts": [
    ],
  • "city": "Pasadena",
  • "contact": {},
  • "country": "US",
  • "currency": "USD",
  • "custom_metadata": { },
  • "deliveries": [
    ],
  • "due_days": 30,
  • "discount_cents": 0,
  • "issue_date": "2020-06-27",
  • "items": [
    ],
  • "notes": "string",
  • "number": "E-00001",
  • "payment_details": "string",
  • "po_number": "999",
  • "postal_code": "91104",
  • "region": "CA",
  • "state": "outstanding",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "subtotal_cents": 9375,
  • "tag_list": "consulting, premium",
  • "tax_id": "string",
  • "taxes": [
    ],
  • "total_cents": 9375,
  • "valid_until": "2020-07-27"
}

Retrieve a proforma

Retrieves the details of an existing proforma.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired proforma.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "alerts": [
    ],
  • "city": "Pasadena",
  • "contact": {},
  • "country": "US",
  • "currency": "USD",
  • "custom_metadata": { },
  • "deliveries": [
    ],
  • "due_days": 30,
  • "discount_cents": 0,
  • "issue_date": "2020-06-27",
  • "items": [
    ],
  • "notes": "string",
  • "number": "E-00001",
  • "payment_details": "string",
  • "po_number": "999",
  • "postal_code": "91104",
  • "region": "CA",
  • "state": "outstanding",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "subtotal_cents": 9375,
  • "tag_list": "consulting, premium",
  • "tax_id": "string",
  • "taxes": [
    ],
  • "total_cents": 9375,
  • "valid_until": "2020-07-27"
}

Update a proforma

Updates an existing proforma. Accepted and invoiced proformas cannot be modified.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

The ID of the proforma to be updated.

Request Body schema: application/json
object (attachment)

Invoices and expenses can have attached files.

required
contact (object) or object

Customer receiving the proforma. Can reference an existing contact by ID or include full contact details.

currency
string

Three-letter ISO 4217 currency code in uppercase.

custom_metadata
object or null

Custom key-value pairs for storing additional structured data.

due_days
integer or null

Number of days after the invoice issue date when payment is due. When the proforma is converted to an invoice, the invoice due_date is calculated as issue_date + due_days.

required
Array of objects (document_item)

Line items included in this proforma (products, services, fees, etc.).

notes
string or null

Internal notes or additional information about this proforma.

payment_details
string or null

Additional information about accepted payment methods, displayed to the customer.

po_number
string or null

Customer's purchase order number for reference and tracking.

street_line_1
string or null

First line of customer's billing address.

street_line_2
string or null

Second line of customer's billing address.

subject
string or null

Brief summary or title describing what this proforma is for. Displayed prominently on the document.

tag_list
Array of strings or null

Array of tags for categorizing and filtering proformas.

tax_id
string or null

Customer's tax identification number (VAT number, EIN, etc.).

valid_until
string or null <date>

Expiration date of the proforma. Once this date is passed and the proforma has not been accepted, it transitions to the "late" state.

Responses

Request samples

Content type
application/json
{
  • "attachment": {
    },
  • "contact": {
    },
  • "currency": "USD",
  • "custom_metadata": { },
  • "due_days": 30,
  • "items": [
    ],
  • "notes": "string",
  • "payment_details": "string",
  • "po_number": "999",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "tag_list": "consulting, premium",
  • "tax_id": "string",
  • "valid_until": "2020-07-27"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "alerts": [
    ],
  • "city": "Pasadena",
  • "contact": {},
  • "country": "US",
  • "currency": "USD",
  • "custom_metadata": { },
  • "deliveries": [
    ],
  • "due_days": 30,
  • "discount_cents": 0,
  • "issue_date": "2020-06-27",
  • "items": [
    ],
  • "notes": "string",
  • "number": "E-00001",
  • "payment_details": "string",
  • "po_number": "999",
  • "postal_code": "91104",
  • "region": "CA",
  • "state": "outstanding",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "subtotal_cents": 9375,
  • "tag_list": "consulting, premium",
  • "tax_id": "string",
  • "taxes": [
    ],
  • "total_cents": 9375,
  • "valid_until": "2020-07-27"
}

Accept a proforma

Marks a proforma as accepted by the customer. Only proformas in "outstanding" or "late" state can be accepted.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the proforma to accept.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "alerts": [
    ],
  • "city": "Pasadena",
  • "contact": {},
  • "country": "US",
  • "currency": "USD",
  • "custom_metadata": { },
  • "deliveries": [
    ],
  • "due_days": 30,
  • "discount_cents": 0,
  • "issue_date": "2020-06-27",
  • "items": [
    ],
  • "notes": "string",
  • "number": "E-00001",
  • "payment_details": "string",
  • "po_number": "999",
  • "postal_code": "91104",
  • "region": "CA",
  • "state": "outstanding",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "subtotal_cents": 9375,
  • "tag_list": "consulting, premium",
  • "tax_id": "string",
  • "taxes": [
    ],
  • "total_cents": 9375,
  • "valid_until": "2020-07-27"
}

Decline a proforma

Marks a proforma as declined by the customer. Only proformas in "outstanding" or "late" state can be declined.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the proforma to decline.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "alerts": [
    ],
  • "city": "Pasadena",
  • "contact": {},
  • "country": "US",
  • "currency": "USD",
  • "custom_metadata": { },
  • "deliveries": [
    ],
  • "due_days": 30,
  • "discount_cents": 0,
  • "issue_date": "2020-06-27",
  • "items": [
    ],
  • "notes": "string",
  • "number": "E-00001",
  • "payment_details": "string",
  • "po_number": "999",
  • "postal_code": "91104",
  • "region": "CA",
  • "state": "outstanding",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "subtotal_cents": 9375,
  • "tag_list": "consulting, premium",
  • "tax_id": "string",
  • "taxes": [
    ],
  • "total_cents": 9375,
  • "valid_until": "2020-07-27"
}

Revert a proforma

Reverts a proforma back to "outstanding" from "accepted" or "declined". Invoiced proformas cannot be reverted.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the proforma to revert.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "alerts": [
    ],
  • "city": "Pasadena",
  • "contact": {},
  • "country": "US",
  • "currency": "USD",
  • "custom_metadata": { },
  • "deliveries": [
    ],
  • "due_days": 30,
  • "discount_cents": 0,
  • "issue_date": "2020-06-27",
  • "items": [
    ],
  • "notes": "string",
  • "number": "E-00001",
  • "payment_details": "string",
  • "po_number": "999",
  • "postal_code": "91104",
  • "region": "CA",
  • "state": "outstanding",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "subtotal_cents": 9375,
  • "tag_list": "consulting, premium",
  • "tax_id": "string",
  • "taxes": [
    ],
  • "total_cents": 9375,
  • "valid_until": "2020-07-27"
}

Convert a proforma into an invoice

Converts an accepted proforma into an invoice. The proforma state transitions to "invoiced" and a new invoice is returned. Only proformas in the "accepted" state can be converted.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the proforma to convert.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "created_at": 1593260908,
  • "number": "00001",
  • "issue_date": "2020-06-27",
  • "related_document": {
    },
  • "po_number": "999",
  • "due_date": "2020-07-27",
  • "currency": "USD",
  • "exchange_rate": 0.680309,
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "city": "Pasadena",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "tax_id": "string",
  • "subject": "string",
  • "deliveries": [
    ],
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "evidence": {
    },
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "processor_fee_cents": 99,
  • "custom_metadata": { },
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
  • "alerts": [
    ],
}

Deliver a proforma

Delivers a proforma to your customer via email.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired proforma.

Responses

Expenses

Expenses record the costs your business incurs from vendors and suppliers. They appear in your financial reports and can be used to track deductible business expenditures.

List all expenses

Lists all expenses, paginated and sorted by creation date (newest first).

Authorizations:
API keyBearer token
query Parameters
q
string

Filters an expenses list based on the expense number, customer name or PO number.

date
string

Filters an expenses list based on the issue date. A date range must be entered. Allowed formats are 2019-01-01,2019-12-31 and 2019/01/01,2019/12/31.

state
string
Enum: "outstanding" "late" "paid"

Filters an expenses list based on the expense state: outstanding, late and paid.

contact
integer

Filters an expenses list based on the customer ID.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create an expense

Creates a new expense.

Authorizations:
API keyBearer token
Request Body schema: application/json
issue_date
string <date>

Date when the expense was issued.

po_number
string or null

Purchase order number.

currency
string

Three-letter ISO currency code, in uppercase.

tag_list
Array of strings or null

Multiple tags should be separated by commas.

payment_details
string or null

Detailed information about the payment.

notes
string or null

Extra notes about the expense.

required
contact (object) or object

Provider of your expense.

object (attachment)

Invoices and expenses can have attached files.

country
string

The customer’s billing country. 2-letter ISO country code.

postal_code
string or null

The customer’s billing ZIP or postal code.

region
string or null

The customer’s billing state/province/region.

street_line_1
string or null

The customer’s billing address line 1 (Street address/PO Box).

street_line_2
string or null

The customer’s billing address line 2 (Apartment/Suite/Unit/Building).

subject
string or null

An optional summary description of the document.

required
Array of objects (document_item)

The individual line items that make up the expense. No more than 200 items are allowed in a request. To add more use subsequent update requests. Maximum items per document are limited up to 1000 items.

payment_method
string
Enum: "credit_card" "cash" "wire_transfer" "direct_debit" "check" "iou" "paypal" "other"

Payment method used.

payment_processor
string or null

The payment processor used to pay the expense.

payment_processor_id
string or null

The ID the payment_processor assigned to the payment.

custom_metadata
object or null

Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format.

Responses

Request samples

Content type
application/json
{
  • "issue_date": "2023-09-01",
  • "po_number": "999",
  • "currency": "USD",
  • "tag_list": "consulting, office",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {
    },
  • "attachment": {
    },
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "items": [
    ],
  • "payment_method": "credit_card",
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "custom_metadata": { }
}

Response samples

Content type
application/json
{
  • "id": 927324,
  • "created_at": 1593260908,
  • "issue_date": "2023-09-01",
  • "po_number": "999",
  • "currency": "USD",
  • "tag_list": "consulting, office",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "custom_metadata": { },
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
}

Retrieve an expense

Retrieves the details of an existing expense.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired expense.

Responses

Response samples

Content type
application/json
{
  • "id": 927324,
  • "created_at": 1593260908,
  • "issue_date": "2023-09-01",
  • "po_number": "999",
  • "currency": "USD",
  • "tag_list": "consulting, office",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "custom_metadata": { },
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
}

Update an expense

Updates an expense.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

The ID of the expense to be updated.

Request Body schema: application/json
issue_date
string <date>

Date when the expense was issued.

po_number
string or null

Purchase order number.

currency
string

Three-letter ISO currency code, in uppercase.

tag_list
Array of strings or null

Multiple tags should be separated by commas.

payment_details
string or null

Detailed information about the payment.

notes
string or null

Extra notes about the expense.

required
contact (object) or object

Provider of your expense.

object (attachment)

Invoices and expenses can have attached files.

country
string

The customer’s billing country. 2-letter ISO country code.

postal_code
string or null

The customer’s billing ZIP or postal code.

region
string or null

The customer’s billing state/province/region.

street_line_1
string or null

The customer’s billing address line 1 (Street address/PO Box).

street_line_2
string or null

The customer’s billing address line 2 (Apartment/Suite/Unit/Building).

subject
string or null

An optional summary description of the document.

required
Array of objects (document_item)

The individual line items that make up the expense. No more than 200 items are allowed in a request. To add more use subsequent update requests. Maximum items per document are limited up to 1000 items.

payment_method
string
Enum: "credit_card" "cash" "wire_transfer" "direct_debit" "check" "iou" "paypal" "other"

Payment method used.

payment_processor
string or null

The payment processor used to pay the expense.

payment_processor_id
string or null

The ID the payment_processor assigned to the payment.

custom_metadata
object or null

Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format.

Responses

Request samples

Content type
application/json
{
  • "issue_date": "2023-09-01",
  • "po_number": "999",
  • "currency": "USD",
  • "tag_list": "consulting, office",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {
    },
  • "attachment": {
    },
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "items": [
    ],
  • "payment_method": "credit_card",
  • "payment_processor": "stripe",
  • "payment_processor_id": "ch_999999999999",
  • "custom_metadata": { }
}

Response samples

Content type
application/json
{
  • "id": 927324,
  • "created_at": 1593260908,
  • "issue_date": "2023-09-01",
  • "po_number": "999",
  • "currency": "USD",
  • "tag_list": "consulting, office",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "country": "US",
  • "postal_code": "91104",
  • "region": "CA",
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "subject": "string",
  • "items": [
    ],
  • "taxes": [
    ],
  • "payments": [],
  • "custom_metadata": { },
  • "subtotal_cents": 9375,
  • "discount_cents": 0,
  • "total_cents": 9375,
  • "state": "outstanding",
}

Delete an expense

Deletes an existing expense.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the expense to be deleted.

Responses

Recurring Documents

Recurring documents automatically generate invoices or expenses on a defined schedule — daily, weekly, monthly, or yearly. Use them to automate subscription billing and regular vendor payments without manual intervention.

List all recurring

Lists all recurring, paginated and sorted by creation date (newest first).

Authorizations:
API keyBearer token
query Parameters
q
string

Filters a recurring list based on the recurring number, customer name or PO number.

date
string

Filters a recurring list based on the issue date. A date range must be entered. Allowed formats are 2019-01-01,2019-12-31 and 2019/01/01,2019/12/31.

state
string
Enum: "active" "archived"

Filters a recurring list based on the recurring state.

contact
integer

Filters a recurring list based on the customer ID.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a recurring

Creates a new recurring.

Authorizations:
API keyBearer token
Request Body schema: application/json
start_date
string <date>

Date of the issue of the first document for this recurring. Defaults to 1 months from today.

end_date
string or null <date>

Date of the issue of the last document for this recurring.

frequency
string
Default: "monthly"
Enum: "daily" "weekly" "biweekly" "monthly" "bimonthly" "quarterly" "semiyearly" "yearly" "biyearly"

Recurring frequency. Deprecated. Use recurring_period and recurring_frequency instead.

recurring_period
string
Default: "months"
Enum: "days" "weeks" "months" "years"

Recurring period.

recurring_frequency
integer
Default: 1

The number of recurring periods between each document.

due_days
string or null <date>

The date on which payment for this recurring is due.

po_number
string or null

Purchase order number.

currency
string

Three-letter ISO currency code, in uppercase.

tag_list
Array of strings or null

Multiple tags should be separated by commas.

payment_details
string or null

Detailed information about the accepted payment methods.

notes
string or null

Extra notes about the recurring.

required
contact (object) or object

Customer who will be billed.

subject
string or null

An optional summary description for the document.

required
Array of objects (document_item)

The individual line items that make up the recurring. No more than 200 items are allowed in a request. To add more use subsequent update requests. Maximum items per document are limited up to 1000 items.

custom_metadata
object or null

Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format.

Responses

Request samples

Content type
application/json
{
  • "start_date": "2023-01-27",
  • "end_date": "2024-01-27",
  • "frequency": "daily",
  • "recurring_period": "days",
  • "recurring_frequency": 1,
  • "due_days": "2020-07-27",
  • "po_number": "999",
  • "currency": "USD",
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {
    },
  • "subject": "string",
  • "items": [
    ],
  • "custom_metadata": { }
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "start_date": "2023-01-27",
  • "end_date": "2024-01-27",
  • "frequency": "daily",
  • "recurring_period": "days",
  • "recurring_frequency": 1,
  • "due_days": "2020-07-27",
  • "po_number": "999",
  • "currency": "USD",
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "subject": "string",
  • "items": [
    ],
  • "taxes": [
    ],
  • "custom_metadata": { },
  • "total_cents": 9375,
  • "state": "active",
}

Retrieve a recurring

Retrieves the details of an existing recurring.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired recurring.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "start_date": "2023-01-27",
  • "end_date": "2024-01-27",
  • "frequency": "daily",
  • "recurring_period": "days",
  • "recurring_frequency": 1,
  • "due_days": "2020-07-27",
  • "po_number": "999",
  • "currency": "USD",
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "subject": "string",
  • "items": [
    ],
  • "taxes": [
    ],
  • "custom_metadata": { },
  • "total_cents": 9375,
  • "state": "active",
}

Update a recurring

Updates a recurring.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

The ID of the recurring to be updated.

Request Body schema: application/json
start_date
string <date>

Date of the issue of the first document for this recurring. Defaults to 1 months from today.

end_date
string or null <date>

Date of the issue of the last document for this recurring.

frequency
string
Default: "monthly"
Enum: "daily" "weekly" "biweekly" "monthly" "bimonthly" "quarterly" "semiyearly" "yearly" "biyearly"

Recurring frequency. Deprecated. Use recurring_period and recurring_frequency instead.

recurring_period
string
Default: "months"
Enum: "days" "weeks" "months" "years"

Recurring period.

recurring_frequency
integer
Default: 1

The number of recurring periods between each document.

due_days
string or null <date>

The date on which payment for this recurring is due.

po_number
string or null

Purchase order number.

currency
string

Three-letter ISO currency code, in uppercase.

tag_list
Array of strings or null

Multiple tags should be separated by commas.

payment_details
string or null

Detailed information about the accepted payment methods.

notes
string or null

Extra notes about the recurring.

required
contact (object) or object

Customer who will be billed.

subject
string or null

An optional summary description for the document.

required
Array of objects (document_item)

The individual line items that make up the recurring. No more than 200 items are allowed in a request. To add more use subsequent update requests. Maximum items per document are limited up to 1000 items.

custom_metadata
object or null

Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format.

Responses

Request samples

Content type
application/json
{
  • "start_date": "2023-01-27",
  • "end_date": "2024-01-27",
  • "frequency": "daily",
  • "recurring_period": "days",
  • "recurring_frequency": 1,
  • "due_days": "2020-07-27",
  • "po_number": "999",
  • "currency": "USD",
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {
    },
  • "subject": "string",
  • "items": [
    ],
  • "custom_metadata": { }
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "start_date": "2023-01-27",
  • "end_date": "2024-01-27",
  • "frequency": "daily",
  • "recurring_period": "days",
  • "recurring_frequency": 1,
  • "due_days": "2020-07-27",
  • "po_number": "999",
  • "currency": "USD",
  • "tag_list": "consulting, premium",
  • "payment_details": "string",
  • "notes": "string",
  • "contact": {},
  • "subject": "string",
  • "items": [
    ],
  • "taxes": [
    ],
  • "custom_metadata": { },
  • "total_cents": 9375,
  • "state": "active",
}

Delete a recurring

Deletes an existing recurring.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the recurring to be deleted.

Responses

Sessions

Checkout sessions power the Quaderno Checkout hosted payment page. A session holds the line items, customer details, and tax settings for a single checkout flow. When a customer completes checkout, Quaderno creates the corresponding invoice or receipt automatically.

List all sessions

Lists all your Quaderno Checkout sessions, paginated and sorted by creation date (newest first).

Authorizations:
API keyBearer token
query Parameters
status
string

Filters a session based on the session's status.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a session

Creates a new Quaderno Checkout session object.

Authorizations:
API keyBearer token
Request Body schema: application/json
billing_details_collection
string
Default: "required"
Enum: "auto" "required"

The value for whether Checkout collected the customer’s billing address.

cancel_url
required
string <uri>

The URL the customer will be directed to if they decide to cancel payment and return to your website.

(object or null) or (object or null) (coupon)
coupon_collection
boolean
Default: false

The value for whether Checkout collected coupons.

custom
object or null

Set of key-value pairs that you want to forward to the payment processor. This can be useful for setting up additional options in the payment processor. If you want to send specific data to one processor, you can create a subhash with the name of that particular processor.

object or null (checkout_customer)

The customer’s billing information.

required
Array of objects (checkout_item)

The list of products being purchased.

locale
string
Default: "auto"
Enum: "auto" "ca" "de" "en" "es" "fi" "fr" "hu" "it" "nb" "nl" "sv"

The 2-letter ISO language code of the locale Checkout is displayed in. If auto, the browser’s locale is used.

metadata
object or null

Set of key-value pairs that you can attach to the session. This can be useful for storing additional information about the purchase.

payment_methods
Array of strings
Default: ["card"]
Items Enum: "card" "paypal"

Accepted payment methods for this session.

permalink
string <uri>

The URL of this Checkout Session.

processor
string or null

The payment processor used to process the charge.

processor_id
string or null

The ID the processor assigned to the payment.

status
string
Default: "pending"
Enum: "pending" "processing" "failed" "completed" "abandoned"

Pending sessions are unpaid and awaiting payment. A session is marked as failed when the payment failed or was declined. Note that this status many not show inmediately and instead show as pending until verified. Completed sessions requires no further action and cannot be edited. A session is marked as abandoned after being cancelled by the customer or after 30 minutes without activitiy.

success_url
required
string <uri>

The URL the customer will be directed to after the payment or subscription creation is successful.

updatable_quantity
boolean
Default: false

The value for whether customers can update items’ quantities.

Responses

Request samples

Content type
application/json
{
  • "billing_details_collection": "auto",
  • "coupon": {
    },
  • "coupon_collection": false,
  • "custom": "{ stripe: { metadata: { user_id: 999 } }, paypal: { no_shipping: 0 } }",
  • "customer": {
    },
  • "items": [
    ],
  • "locale": "auto",
  • "metadata": { },
  • "payment_methods": [
    ],
  • "processor": "stripe",
  • "processor_id": "ch_999999999999",
  • "status": "pending",
  • "success_url": "https://mydomain.com/thanks",
  • "updatable_quantity": false
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "billing_details_collection": "auto",
  • "coupon": {
    },
  • "coupon_collection": false,
  • "created_at": "1593260908",
  • "custom": "{ stripe: { metadata: { user_id: 999 } }, paypal: { no_shipping: 0 } }",
  • "customer": {
    },
  • "items": [
    ],
  • "locale": "auto",
  • "metadata": { },
  • "payment_methods": [
    ],
  • "processor": "stripe",
  • "processor_id": "ch_999999999999",
  • "status": "pending",
  • "success_url": "https://mydomain.com/thanks",
  • "updatable_quantity": false
}

Retrieve a session

Retrieves the details of an existing session.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired session.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "billing_details_collection": "auto",
  • "coupon": {
    },
  • "coupon_collection": false,
  • "created_at": "1593260908",
  • "custom": "{ stripe: { metadata: { user_id: 999 } }, paypal: { no_shipping: 0 } }",
  • "customer": {
    },
  • "items": [
    ],
  • "locale": "auto",
  • "metadata": { },
  • "payment_methods": [
    ],
  • "processor": "stripe",
  • "processor_id": "ch_999999999999",
  • "status": "pending",
  • "success_url": "https://mydomain.com/thanks",
  • "updatable_quantity": false
}

Update a session

Updates a session. Any parameters not provided will be left unchanged. Only pending sessions can be updated.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

The ID of the session to be updated.

Request Body schema: application/json
billing_details_collection
string
Default: "required"
Enum: "auto" "required"

The value for whether Checkout collected the customer’s billing address.

cancel_url
required
string <uri>

The URL the customer will be directed to if they decide to cancel payment and return to your website.

(object or null) or (object or null) (coupon)
coupon_collection
boolean
Default: false

The value for whether Checkout collected coupons.

custom
object or null

Set of key-value pairs that you want to forward to the payment processor. This can be useful for setting up additional options in the payment processor. If you want to send specific data to one processor, you can create a subhash with the name of that particular processor.

object or null (checkout_customer)

The customer’s billing information.

required
Array of objects (checkout_item)

The list of products being purchased.

locale
string
Default: "auto"
Enum: "auto" "ca" "de" "en" "es" "fi" "fr" "hu" "it" "nb" "nl" "sv"

The 2-letter ISO language code of the locale Checkout is displayed in. If auto, the browser’s locale is used.

metadata
object or null

Set of key-value pairs that you can attach to the session. This can be useful for storing additional information about the purchase.

payment_methods
Array of strings
Default: ["card"]
Items Enum: "card" "paypal"

Accepted payment methods for this session.

permalink
string <uri>

The URL of this Checkout Session.

processor
string or null

The payment processor used to process the charge.

processor_id
string or null

The ID the processor assigned to the payment.

status
string
Default: "pending"
Enum: "pending" "processing" "failed" "completed" "abandoned"

Pending sessions are unpaid and awaiting payment. A session is marked as failed when the payment failed or was declined. Note that this status many not show inmediately and instead show as pending until verified. Completed sessions requires no further action and cannot be edited. A session is marked as abandoned after being cancelled by the customer or after 30 minutes without activitiy.

success_url
required
string <uri>

The URL the customer will be directed to after the payment or subscription creation is successful.

updatable_quantity
boolean
Default: false

The value for whether customers can update items’ quantities.

Responses

Request samples

Content type
application/json
{
  • "billing_details_collection": "auto",
  • "coupon": {
    },
  • "coupon_collection": false,
  • "custom": "{ stripe: { metadata: { user_id: 999 } }, paypal: { no_shipping: 0 } }",
  • "customer": {
    },
  • "items": [
    ],
  • "locale": "auto",
  • "metadata": { },
  • "payment_methods": [
    ],
  • "processor": "stripe",
  • "processor_id": "ch_999999999999",
  • "status": "pending",
  • "success_url": "https://mydomain.com/thanks",
  • "updatable_quantity": false
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "billing_details_collection": "auto",
  • "coupon": {
    },
  • "coupon_collection": false,
  • "created_at": "1593260908",
  • "custom": "{ stripe: { metadata: { user_id: 999 } }, paypal: { no_shipping: 0 } }",
  • "customer": {
    },
  • "items": [
    ],
  • "locale": "auto",
  • "metadata": { },
  • "payment_methods": [
    ],
  • "processor": "stripe",
  • "processor_id": "ch_999999999999",
  • "status": "pending",
  • "success_url": "https://mydomain.com/thanks",
  • "updatable_quantity": false
}

Delete a session

Permanently deletes a session. This action cannot be undone. Only pending sessions can be deleted.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the session to be deleted.

Responses

Coupons

Coupons apply discounts to Quaderno Checkout sessions. Each coupon has a code and a discount amount or percentage that is applied to the checkout total before tax is calculated.

List all coupons

Lists all coupons, sorted by creation date (newest first).

Authorizations:
API keyBearer token

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a coupon

Creates a new coupon, which represents a discount.

Authorizations:
API keyBearer token
Request Body schema: application/json
One of
amount_off
required
number or null <float>

Amount (in the currency specified) that will be taken off the subtotal of the purchase. Required if percent_off is not passed.

code
required
string

Coupon code

currency
required
string or null

If amount_off has been set, the three-letter ISO currency code of the amount to take off, in uppercase. Must be a supported currency in your payment processors.

kind
string
Default: "percent_off"
Enum: "amount_off" "percent_off"

The type of coupon: amount or percentage off.

max_redemptions
integer or null

Maximum number of times this coupon can be redeemed, in total, across all customers, before it is no longer valid.

name
string or null

Name of the coupon displayed to customers on invoices.

percent_off
number or null <float>

Percent that will be taken off the subtotal of the purchase. For example, a coupon with percent_off of 50 will make a $100 purchase $50 instead. Required if amount_off is not passed.

redeem_by
string or null <date>

Date after which the coupon can no longer be redeemed.

Responses

Request samples

Content type
application/json
{
  • "amount_off": 0.1,
  • "code": "25_5OFF",
  • "currency": "USD",
  • "kind": "amount_off",
  • "max_redemptions": 100,
  • "name": "Special offer!",
  • "percent_off": 25.5,
  • "redeem_by": "2020-07-21"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "amount_off": 0.1,
  • "code": "25_5OFF",
  • "created_at": "1593260908",
  • "currency": "USD",
  • "kind": "amount_off",
  • "max_redemptions": 100,
  • "name": "Special offer!",
  • "percent_off": 25.5,
  • "redeem_by": "2020-07-21",
  • "times_redeemed": 10
}

Retrieve a coupon

Retrieves the details of an existing coupon.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired coupon.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "amount_off": 0.1,
  • "code": "25_5OFF",
  • "created_at": "1593260908",
  • "currency": "USD",
  • "kind": "amount_off",
  • "max_redemptions": 100,
  • "name": "Special offer!",
  • "percent_off": 25.5,
  • "redeem_by": "2020-07-21",
  • "times_redeemed": 10
}

Update a coupon

Updates a coupon. Any parameters not provided will be left unchanged.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

The ID of the coupon to be updated.

Request Body schema: application/json
One of
amount_off
required
number or null <float>

Amount (in the currency specified) that will be taken off the subtotal of the purchase. Required if percent_off is not passed.

code
required
string

Coupon code

currency
required
string or null

If amount_off has been set, the three-letter ISO currency code of the amount to take off, in uppercase. Must be a supported currency in your payment processors.

kind
string
Default: "percent_off"
Enum: "amount_off" "percent_off"

The type of coupon: amount or percentage off.

max_redemptions
integer or null

Maximum number of times this coupon can be redeemed, in total, across all customers, before it is no longer valid.

name
string or null

Name of the coupon displayed to customers on invoices.

percent_off
number or null <float>

Percent that will be taken off the subtotal of the purchase. For example, a coupon with percent_off of 50 will make a $100 purchase $50 instead. Required if amount_off is not passed.

redeem_by
string or null <date>

Date after which the coupon can no longer be redeemed.

Responses

Request samples

Content type
application/json
{
  • "amount_off": 0.1,
  • "code": "25_5OFF",
  • "currency": "USD",
  • "kind": "amount_off",
  • "max_redemptions": 100,
  • "name": "Special offer!",
  • "percent_off": 25.5,
  • "redeem_by": "2020-07-21"
}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "amount_off": 0.1,
  • "code": "25_5OFF",
  • "created_at": "1593260908",
  • "currency": "USD",
  • "kind": "amount_off",
  • "max_redemptions": 100,
  • "name": "Special offer!",
  • "percent_off": 25.5,
  • "redeem_by": "2020-07-21",
  • "times_redeemed": 10
}

Delete a coupon

Permanently deletes a coupon. This action cannot be undone.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the coupon to be deleted.

Responses

Accounts

Quaderno Connect accounts are sub-accounts that belong to your platform. Each account has its own invoices, contacts, and tax settings. Use this API to create and manage accounts on behalf of your users.

Retrieve a custom account

Retrieves the details of an existing Quaderno Connect custom account.

Authorizations:
API keyBearer token
path Parameters
id
required
integer
Example: 41

The ID of the custom account to retrieve.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "business_name": "string",
  • "created_at": 0,
  • "currency": "string",
  • "default_product_type": "good",
  • "default_tax_code": "eservice",
  • "email": "string",
  • "state": "string",
  • "subdomain": "string",
  • "web": "string",
  • "registration_number": "string",
  • "authentication": {
    }
}

Update a custom account

Updates the details of an existing Quaderno Connect custom account.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

The ID of the custom account to update.

Request Body schema: application/json
required
business_name
string

Legal or trade name of the business.

default_product_type
string or null
Enum: "good" "service"

Fallback product type for documents and tax calculations. Defaults to "service".

default_tax_code
string or null
Enum: "eservice" "ebook" "saas" "consulting" "standard" "reduced" "retention"

Fallback tax code for items and tax calculations. Defaults to "eservice".

email
string

Primary contact email for account notifications.

web
string

Business website URL.

registration_number
string

Official government-issued number that identifies the business entity (e.g., EIN in the US, SIREN in France, W-IdNr. in Germany, ABN in Australia).

Responses

Request samples

Content type
application/json
{
  • "business_name": "string",
  • "default_product_type": "good",
  • "default_tax_code": "eservice",
  • "email": "string",
  • "web": "string",
  • "registration_number": "string"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "business_name": "string",
  • "created_at": 0,
  • "currency": "string",
  • "default_product_type": "good",
  • "default_tax_code": "eservice",
  • "email": "string",
  • "state": "string",
  • "subdomain": "string",
  • "web": "string",
  • "registration_number": "string",
  • "authentication": {
    }
}

Create a custom account

Creates a new Quaderno Connect custom account.

Authorizations:
API keyBearer token
Request Body schema: application/json
required
business_name
required
string

Legal or trade name of the business.

country
required
string

Two-letter ISO 3166-1 alpha-2 country code. Cannot be changed after creation.

currency
string or null

Three-letter ISO 4217 currency code. Defaults to the country's official currency.

default_product_type
string or null
Enum: "good" "service"

Fallback product type for documents and tax calculations. Defaults to "service".

default_tax_code
string or null
Enum: "eservice" "ebook" "saas" "consulting" "standard" "reduced" "retention"

Fallback tax code for items and tax calculations. Defaults to "eservice".

email
required
string

Primary contact email for account notifications.

local_tax_id
string or null

Tax ID that registers the account for tax collection in the country. Cannot be changed after creation.

postal_code
string or null

ZIP or postal code of the business location. Cannot be changed after creation.

web
string or null

Business website URL.

registration_number
string or null

Official government-issued number that identifies the business entity (e.g., EIN in the US, SIREN in France, W-IdNr. in Germany, ABN in Australia).

Responses

Request samples

Content type
application/json
{
  • "business_name": "string",
  • "country": "string",
  • "currency": "string",
  • "default_product_type": "good",
  • "default_tax_code": "eservice",
  • "email": "string",
  • "local_tax_id": "string",
  • "postal_code": "string",
  • "web": "string",
  • "registration_number": "string"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "business_name": "string",
  • "created_at": 0,
  • "currency": "string",
  • "default_product_type": "good",
  • "default_tax_code": "eservice",
  • "email": "string",
  • "state": "string",
  • "subdomain": "string",
  • "web": "string",
  • "registration_number": "string",
  • "authentication": {
    }
}

List all accounts

Retrieves a list of all Quaderno Connect accounts.

Authorizations:
API keyBearer token

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Addresses

Addresses store the location history of a Quaderno Connect account. Each address has a validity period, allowing Quaderno to apply the correct tax rules based on where the business was located at any given point in time.

List addresses

Lists all addresses from a Quaderno Connect custom account, paginated and sorted by creation date (newest first).

Authorizations:
Bearer token

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create an address

Creates a new address to be used on a Quaderno Connect custom account.

Authorizations:
Bearer token
Request Body schema: application/json
street_line_1
string or null

Primary street address, including street number and name or PO Box.

street_line_2
string or null

Secondary address line for apartment, suite, unit, or building details.

city
string or null

City, district, suburb, town, or village name.

region
string or null

State, province, or region code.

postal_code
string or null

ZIP or postal code.

country
string or null

Two-letter ISO 3166-1 alpha-2 country code. Defaults to the account's original country. WARNING: Changing the country is not recommended, especially if the new country uses a different official currency than the account currency. This may lead to tax calculation errors, reporting inconsistencies, and compliance issues. If you need to operate in a different country with a different currency, consider creating a new account instead.

valid_from
string <date>

Date when this address becomes effective (ISO 8601 format: YYYY-MM-DD). Defaults to the current date.

valid_until
string or null <date>

Date when this address expires, if applicable (ISO 8601 format: YYYY-MM-DD). Leave empty for addresses with no end date.

Responses

Request samples

Content type
application/json
{
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "city": "Pasadena",
  • "region": "CA",
  • "postal_code": "91104",
  • "country": "US",
  • "valid_from": "2023-07-01",
  • "valid_until": "2024-02-03"
}

Response samples

Content type
application/json
{
  • "id": 16,
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "city": "Pasadena",
  • "region": "CA",
  • "postal_code": "91104",
  • "country": "US",
  • "valid_from": "2023-07-01",
  • "valid_until": "2024-02-03"
}

Retrieve an address

Retrieves the details of an existing address.

Authorizations:
Bearer token
path Parameters
id
required
string

ID of the desired address.

Responses

Response samples

Content type
application/json
{
  • "id": 16,
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "city": "Pasadena",
  • "region": "CA",
  • "postal_code": "91104",
  • "country": "US",
  • "valid_from": "2023-07-01",
  • "valid_until": "2024-02-03"
}

Update an address

Updates a address. Any parameters not provided will be left unchanged.

Authorizations:
Bearer token
path Parameters
id
required
integer

ID of the address to be updated.

Request Body schema: application/json
street_line_1
string or null

Primary street address, including street number and name or PO Box.

street_line_2
string or null

Secondary address line for apartment, suite, unit, or building details.

city
string or null

City, district, suburb, town, or village name.

region
string or null

State, province, or region code.

postal_code
string or null

ZIP or postal code.

country
string or null

Two-letter ISO 3166-1 alpha-2 country code. Defaults to the account's original country. WARNING: Changing the country is not recommended, especially if the new country uses a different official currency than the account currency. This may lead to tax calculation errors, reporting inconsistencies, and compliance issues. If you need to operate in a different country with a different currency, consider creating a new account instead.

valid_from
string <date>

Date when this address becomes effective (ISO 8601 format: YYYY-MM-DD). Defaults to the current date.

valid_until
string or null <date>

Date when this address expires, if applicable (ISO 8601 format: YYYY-MM-DD). Leave empty for addresses with no end date.

Responses

Request samples

Content type
application/json
{
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "city": "Pasadena",
  • "region": "CA",
  • "postal_code": "91104",
  • "country": "US",
  • "valid_from": "2023-07-01",
  • "valid_until": "2024-02-03"
}

Response samples

Content type
application/json
{
  • "id": 16,
  • "street_line_1": "2311 North Los Robles Av.",
  • "street_line_2": "Apartment C",
  • "city": "Pasadena",
  • "region": "CA",
  • "postal_code": "91104",
  • "country": "US",
  • "valid_from": "2023-07-01",
  • "valid_until": "2024-02-03"
}

Reporting

Reporting requests generate downloadable tax and billing reports asynchronously. Submit a request, then poll or wait for the report URL to become available once processing is complete.

List all reporting requests

Retrieves the list of reporting requests.

Authorizations:
API keyBearer token

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Requests a report

Creates a new reporting request. The report file will be ready some minutes after creating a new request.

Authorizations:
API keyBearer token
Request Body schema: application/json
report_type
string
Enum: "tax_summary" "invoices_list" "credits_list"

The type of report.

object

Parameters specifying report details.

Responses

Request samples

Content type
application/json
{
  • "report_type": "tax_summary",
  • "parameters": {
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "report_type": "tax_summary",
  • "report_url": null,
  • "state": "pending",
  • "parameters": {
    },
  • "completed_at": 1632985500,
  • "created_at": 1632985500
}

Retrieve a reporting request

Retrieves updated info from the reporting request.

Authorizations:
API keyBearer token
path Parameters
id
required
integer
Example: 41

The ID of the reporting request to retrieve.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "report_type": "tax_summary",
  • "report_url": null,
  • "state": "pending",
  • "parameters": {
    },
  • "completed_at": 1632985500,
  • "created_at": 1632985500
}

Webhooks

Webhooks notify your server in real time when events happen in a Quaderno account — such as an invoice being created, a payment being recorded, or a tax transaction being processed. Each webhook delivers a signed payload to a URL you control.

List all webhooks

Lists all webhooks, sorted by creation date (newest first).

Authorizations:
API keyBearer token

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a webhook

Creates a new webhook object. The url provided needs to respond with 200 OK to HEAD requests in order to validate the callback endpoint.

Authorizations:
API keyBearer token
Request Body schema: application/json
events_types
required
Array of strings

The list of events to enable for this endpoint.

url
required
string <uri>

The URL of the webhook endpoint.

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "auth_key": "zXQgArTtQxAMaYppMrDoUQ",
  • "created_at": "2023-01-24T10:59:15.000Z",
  • "events_sent": 0,
  • "events_types": [
    ],
  • "last_error": "Response code 503 returned.",
  • "last_error_at": "2023-01-24T10:59:15.000Z",
  • "last_sent_at": "2023-01-24T10:59:15.000Z",
}

Retrieve a webhook

Retrieves the details of an existing webhook.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the desired webhook.

Responses

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "auth_key": "zXQgArTtQxAMaYppMrDoUQ",
  • "created_at": "2023-01-24T10:59:15.000Z",
  • "events_sent": 0,
  • "events_types": [
    ],
  • "last_error": "Response code 503 returned.",
  • "last_error_at": "2023-01-24T10:59:15.000Z",
  • "last_sent_at": "2023-01-24T10:59:15.000Z",
}

Update a webhook

Updates the specified webhook.

Authorizations:
API keyBearer token
path Parameters
id
required
integer

The ID of the webhook to be updated.

Request Body schema: application/json
events_types
required
Array of strings

The list of events to enable for this endpoint.

url
required
string <uri>

The URL of the webhook endpoint.

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "id": 92732431,
  • "auth_key": "zXQgArTtQxAMaYppMrDoUQ",
  • "created_at": "2023-01-24T10:59:15.000Z",
  • "events_sent": 0,
  • "events_types": [
    ],
  • "last_error": "Response code 503 returned.",
  • "last_error_at": "2023-01-24T10:59:15.000Z",
  • "last_sent_at": "2023-01-24T10:59:15.000Z",
}

Delete a webhook

Deletes a webhook. This action cannot be undone.

Authorizations:
API keyBearer token
path Parameters
id
required
string

The ID of the webhook to be deleted.

Responses