Pleo Chart of Accounts API
Chart of accounts management API for creating single and batch ledger accounts, searching, updating, and deleting nominal account records.
Chart of accounts management API for creating single and batch ledger accounts, searching, updating, and deleting nominal account records.
openapi: 3.0.1
info:
title: Chart of Accounts API
description: Bookkeeping Core OpenAPI definitions
termsOfService: https://pleo.io/terms/
contact:
email: [email protected]
license:
name: Apache 2.0
url: http://www.apache.org/licenses/LICENSE-2.0.html
version: 24.9.0
servers:
- url: https://external.pleo.io
description: Production server
- url: https://external.staging.pleo.io
description: Staging server
security:
- bearerAuth: []
- basicAuth: []
tags:
- name: BookkeepingCore
description: This resource is associated with the BookkeepingCore API
- name: Accounts
description: 'This API enables you to create an account in Pleo, search for an account
by its ID, update details of an account recorded in Pleo, delete an account from
Pleo, or apply specific filters to retrieve a list of accounts managed in Pleo.
💡**Note**
Please note that only response codes specific to the API behaviour are documented.
Otherwise, we follow HTTP response codes.
'
- name: Aggregated Bookkeeping Category Groups
description: 'This API enables you to read aggregated bookkeeping category groups.
💡**Note**
Please note that only response codes specific to the API behaviour are documented.
Otherwise, we follow HTTP response codes.'
- name: Aggregated Contra Accounts
description: 'This API enables you to read aggregated contra accounts.
💡**Note**
Please note that only response codes specific to the API behaviour are documented.
Otherwise, we follow HTTP response codes.'
- name: Bookkeeping Categories
description: 'This API enables you to perform operations on a bookkeeping category.
💡**Note**
Please note that only response codes specific to the API behaviour are documented.
Otherwise, we follow HTTP response codes..
'
- name: Bookkeeping Category Groups
description: 'This API enables you to perform operations on a bookkeeping category
group.
💡**Note**
Please note that only response codes specific to the API behaviour are documented.
Otherwise, we follow HTTP response codes.'
- name: Contra Accounts
description: 'This API enables you to manage contra accounts.
💡**Note**
Please note that only response codes specific to the API behaviour are documented.
Otherwise, we follow HTTP response codes..
'
- name: Bookkeeping Preferences Resource
paths:
/v1/chart-of-accounts:
post:
tags:
- Accounts
summary: Create a new account
description: '
The integration sends a request to this endpoint to create a corresponding
account in Pleo for any new record created in the external ERP/accounting
system.
The request will fail if an account with the same `externalId` and `companyId`
already exists in Pleo.
'
operationId: createAccountV1
requestBody:
content:
application/json;charset=UTF-8:
schema:
$ref: '#/components/schemas/BookkeepingAccountCreateRequestV1'
required: true
responses:
'200':
description: Request matched existing account.
content:
application/json:
schema:
$ref: '#/components/schemas/DataResponseBookkeepingAccountRestModelV1'
example:
data:
archived: false
code: '2001'
companyId: 123e4567-e89b-12d3-a456-426614174006
externalId: External Id
id: 123e4567-e89b-12d3-a456-426614174005
name: Bank Charges
taxCodeExternalId: IVA 20
'201':
description: Account created.
content:
application/json:
schema:
$ref: '#/components/schemas/DataResponseBookkeepingAccountRestModelV1'
example:
data:
archived: false
code: '2001'
companyId: 123e4567-e89b-12d3-a456-426614174006
externalId: External Id
id: 123e4567-e89b-12d3-a456-426614174005
name: Bank Charges
taxCodeExternalId: IVA 20
'400':
description: 'Bad request: for example, missing required fields.'
'409':
description: 'Conflict: account with the same `externalId` exists in Pleo.'
/v1/chart-of-accounts/batch:
post:
tags:
- Accounts
summary: Create multiple accounts in a single request
description: '
Creates multiple bookkeeping accounts in a single batch operation.
This endpoint validates each account in the batch and returns both successfully
created accounts and failed items with their failure reasons.
Accounts that pass validation will be created, while invalid accounts will
be returned in the failed list.
'
operationId: createAccountsBatchV1
requestBody:
content:
application/json;charset=UTF-8:
schema:
$ref: '#/components/schemas/BookkeepingAccountBatchCreateRequestV1'
required: true
responses:
'201':
description: Batch creation completed. Check the response for created and
failed items.
content:
application/json:
schema:
$ref: '#/components/schemas/DataResponseBookkeepingAccountBatchCreateResponseV1'
example:
data:
created:
- archived: false
code: '2001'
companyId: 123e4567-e89b-12d3-a456-426614174006
externalId: ext-001
id: 123e4567-e89b-12d3-a456-426614174005
name: Bank Charges
taxCodeExternalId: IVA 20
- archived: false
code: '2002'
companyId: 123e4567-e89b-12d3-a456-426614174006
externalId: ext-002
id: 123e4567-e89b-12d3-a456-426614174007
name: Office Supplies
taxCodeExternalId: IVA 20
failed:
- reasons:
- EXTERNAL_ID_ALREADY_EXISTS
- NAME_EMPTY
request:
archived: false
code: '2003'
externalId: ext-duplicate
name: ''
taxCodeExternalId: IVA 20
'400':
description: 'Bad request: for example, batch size outside allowed range,
missing required fields or contains invalid input.'
/v1/chart-of-accounts/{accountId}:
get:
tags:
- Accounts
summary: Retrieve an account in Pleo by its ID
description: Search for a specific account by its ID.
operationId: getAccountV1
parameters:
- name: accountId
in: path
description: ID of the account to retrieve.
required: true
style: simple
explode: false
schema:
type: string
format: uuid
example: 123e4567-e89b-12d3-a456-426614174015
responses:
'200':
description: Retrieval of account successful.
content:
application/json:
schema:
$ref: '#/components/schemas/DataResponseBookkeepingAccountRestModelV1'
example:
data:
archived: false
code: '2001'
companyId: 123e4567-e89b-12d3-a456-426614174006
externalId: External Id
id: 123e4567-e89b-12d3-a456-426614174005
name: Bank Charges
taxCodeExternalId: IVA 20
'404':
description: Account not found.
put:
tags:
- Accounts
summary: Update an account
description: '
Update details of an existing account in Pleo.
The integration must send a request to this endpoint when it is trying to
archive an account linked to accounting entries.
'
operationId: updateAccountV1
parameters:
- name: accountId
in: path
description: ID of the account to update.
required: true
style: simple
explode: false
schema:
type: string
format: uuid
example: 123e4567-e89b-12d3-a456-426614174015
requestBody:
content:
application/json;charset=UTF-8:
schema:
$ref: '#/components/schemas/BookkeepingAccountUpdateRequestV1'
required: true
responses:
'200':
description: Update of account successful.
content:
application/json:
schema:
$ref: '#/components/schemas/DataResponseBookkeepingAccountRestModelV1'
example:
data:
archived: false
code: '2001'
companyId: 123e4567-e89b-12d3-a456-426614174006
externalId: External Id
id: 123e4567-e89b-12d3-a456-426614174005
name: Bank Charges
taxCodeExternalId: IVA 20
'400':
description: 'Bad request: for example, missing required fields, tax code
does not exist in Pleo.'
'404':
description: Account not found.
delete:
tags:
- Accounts
summary: Delete an account
description: '
Deletes an existing account in Pleo.
Only accounts not linked to any accounting entries can be deleted. Trying
to delete an account linked to accounting entries will result in an error.
If an account is linked, it can only be archived. Use UPDATE endpoint to archive
an account.
'
operationId: deleteAccountV1
parameters:
- name: accountId
in: path
description: ID of the account to delete.
required: true
style: simple
explode: false
schema:
type: string
format: uuid
example: 123e4567-e89b-12d3-a456-426614174015
responses:
'204':
description: Deletion of account successful.
'404':
description: Account not found.
'409':
description: Account linked to accounting entries and cannot be deleted.
Use UPDATE endpoint to archive the account.
/v1/chart-of-accounts:search:
post:
tags:
- Accounts
summary: Fetch a list of accounts
description: Retrieves a list of accounts with companyId and other optional
filters. Results are paginated.
operationId: searchAccountsV1
parameters:
- name: before
in: query
description: Lower bound of the page of data to return (cannot be used together
with [after] or [offset]).
required: false
style: form
explode: true
schema:
pattern: ^[A-Z2-7=~]+$
type: string
- name: after
in: query
description: Upper bound of the page of data to return (cannot be used together
with [before] or [offset]).
required: false
style: form
explode: true
schema:
pattern: ^[A-Z2-7=~]+$
type: string
- name: offset
in: query
description: Offset of the page of data to return (cannot be used together
with [before] or [after]).
required: false
style: form
explode: true
schema:
type: integer
format: int64
- name: limit
in: query
description: The maximum amount of items to return.
required: false
style: form
explode: true
schema:
type: integer
format: int32
- name: sorting_keys
in: query
description: The keys to sort the results by.
required: false
style: form
explode: true
schema:
type: array
items:
type: string
- name: sorting_order
in: query
description: The order to sort the results by. Must be the same length as
[sortingKeys]; one order per key.
required: false
style: form
explode: true
schema:
type: array
items:
$ref: '#/components/schemas/PageOrder'
requestBody:
content:
application/json;charset=UTF-8:
schema:
$ref: '#/components/schemas/BookkeepingAccountSearchRequestV1'
required: true
responses:
'200':
description: Retrieval of accounts successful.
content:
application/json:
schema:
$ref: '#/components/schemas/CursorPaginatedResponseBookkeepingAccountRestModelV1'
example:
data:
- accountingSystem: xero
archived: false
code: '2001'
companyId: 123e4567-e89b-12d3-a456-426614174006
externalId: External Id
id: 123e4567-e89b-12d3-a456-426614174005
name: Bank Charges
taxCodeExternalId: IVA 20
pagination:
currentRequestPagination:
parameters: {}
endCursor: string
hasNextPage: true
hasPreviousPage: true
startCursor: string
total: 1
'400':
description: 'Bad request: for example, missing required fields, tax code
does not exist in Pleo.'
components:
schemas:
AggregatedBookkeepingCategoryGroupTypeRestModelV1:
type: string
description: Bookkeeping category group types supported by Pleo. Used to classify
category groups in frontend.
enum:
- ENTERTAINMENT
- EQUIPMENT_AND_HARDWARE
- MARKETING_AND_ADVERTISING
- MEALS_AND_DRINKS
- OFFICE_EXPENSES
- PHONE_AND_INTERNET
- SERVICES_AND_CONSULTANCY
- SOFTWARE
- SUPPLIES
- TRAVEL
- OTHER
- NO_SUITABLE_CATEGORY
BookkeepingAccountBatchCreateRequestV1:
required:
- companyId
- items
type: object
properties:
companyId:
type: string
description: Pleo's internal identifier for the company the accounts are
associated with.
format: uuid
items:
maxItems: 1000
minItems: 1
type: array
description: 'List of bookkeeping accounts to be created.
The number of accounts in the batch must be between 1 and 1000.'
items:
$ref: '#/components/schemas/BookkeepingAccountBatchRequestItemV1'
BookkeepingAccountBatchCreateResponseV1:
required:
- created
- failed
type: object
properties:
created:
type: array
description: List of successfully created accounts.
items:
$ref: '#/components/schemas/BookkeepingAccountRestModelV1'
failed:
type: array
description: List of accounts that failed to be created, including the reasons
for failure.
items:
$ref: '#/components/schemas/BookkeepingAccountBatchFailedItemV1'
description: Response for batch account creation operation.
BookkeepingAccountBatchFailedItemV1:
required:
- reasons
- request
type: object
properties:
reasons:
type: array
description: List of reasons why the account creation failed.
items:
type: string
description: Possible reasons for account creation failure in batch operations.
enum:
- EXTERNAL_ID_ALREADY_EXISTS
- EXTERNAL_ID_TOO_LONG
- EXTERNAL_ID_EMPTY
- NAME_TOO_LONG
- NAME_EMPTY
- CODE_TOO_LONG
- OTHER
request:
$ref: '#/components/schemas/BookkeepingAccountBatchRequestItemV1'
description: Represents a failed account creation in a batch operation.
BookkeepingAccountBatchRequestItemV1:
required:
- archived
- externalId
- name
type: object
properties:
archived:
type: boolean
description: Boolean flag used to determine if the account is archived.
code:
maxLength: 255
minLength: 0
type: string
description: 'Account code or number used in the accounting system''s chart
of accounts. Maximum length: 255 characters.'
nullable: true
externalId:
maxLength: 255
minLength: 1
type: string
description: 'Non empty unique external identifier of the account, assigned
in the external ERP/accounting system. Can be the same as code if no other
identifier is available. Maximum length: 255 characters.'
metadata:
type: object
additionalProperties:
type: object
description: Place for API users to store flexible data.
nullable: true
description: Place for API users to store flexible data.
nullable: true
name:
maxLength: 255
minLength: 0
type: string
description: 'Name of the account. Maximum length: 255 characters.'
taxCodeExternalId:
type: string
description: 'The identifier in **the target system** for the tax code the
account is associated with.
- This is NOT the tax percentage (e.g. 20%)
- This is NOT the Pleo UUID of the tax code'
nullable: true
description: 'List of bookkeeping accounts to be created.
The number of accounts in the batch must be between 1 and 1000.'
BookkeepingAccountCreateRequestV1:
required:
- archived
- companyId
- externalId
- name
type: object
properties:
archived:
type: boolean
description: Boolean flag used to determine if the account is archived.
code:
maxLength: 255
minLength: 0
type: string
description: 'Account code or number used in the accounting system''s chart
of accounts. Maximum length: 255 characters.'
nullable: true
companyId:
type: string
description: Pleo's internal identifier for the company the account is associated
with.
format: uuid
externalId:
maxLength: 255
minLength: 1
type: string
description: 'Non empty unique external identifier of the account, assigned
in the external ERP/accounting system. Can be the same as code if no other
identifier is available. Maximum length: 255 characters.'
metadata:
type: object
additionalProperties:
type: object
description: Place for API users to store flexible data.
nullable: true
description: Place for API users to store flexible data.
nullable: true
name:
maxLength: 255
minLength: 0
type: string
description: 'Name of the account. Maximum length: 255 characters.'
taxCodeExternalId:
type: string
description: 'The identifier in **the target system** for the tax code the
account is associated with.
- This is NOT the tax percentage (e.g. 20%)
- This is NOT the Pleo UUID of the tax code'
nullable: true
BookkeepingAccountRestModelV1:
required:
- archived
- companyId
- externalId
- id
- name
type: object
properties:
archived:
type: boolean
description: Boolean flag used to determine if the account is archived.
code:
type: string
description: Account code or number used in the accounting system's chart
of accounts.
nullable: true
companyId:
type: string
description: Pleo's internal identifier of the company the account is associated
with.
format: uuid
externalId:
type: string
description: Unique external identifier of the account, assigned in the
external ERP/accounting system. Can be the same as code if no other identifier
is available.
id:
type: string
description: Pleo's internal identifier of the account.
format: uuid
metadata:
type: object
additionalProperties:
type: object
description: Place for API users to store flexible data.
nullable: true
description: Place for API users to store flexible data.
nullable: true
name:
type: string
description: Name of the account.
taxCodeExternalId:
type: string
description: 'The identifier in **the target system** for the tax code the
account is associated with. '
nullable: true
description: Represents an account in Pleo.
BookkeepingAccountSearchRequestV1:
required:
- companyId
- excludeIfAssignedToCategory
- excludeIfAssignedToContraAccount
type: object
properties:
archived:
type: boolean
description: Filter by archived status.
nullable: true
example: false
code:
type: string
description: Search by code.
nullable: true
example: '2001'
deprecated: true
codes:
uniqueItems: true
type: array
description: Search by a list of codes.
nullable: true
items:
type: string
description: Search by a list of codes.
nullable: true
companyId:
type: string
description: Filter by company ID.
format: uuid
example: 123e4567-e89b-12d3-a456-426614174011
excludeIfAssignedToCategory:
type: boolean
description: Exclude bookkeeping accounts assigned to a bookkeeping category.
example: false
default: false
excludeIfAssignedToContraAccount:
type: boolean
description: Exclude bookkeeping accounts assigned to a contra account.
example: false
default: false
externalId:
type: string
description: Search by external id.
nullable: true
example: 123e4567-e89b-12d3-a456-426614174011
ids:
uniqueItems: true
type: array
description: Filter by a list of account IDs.
nullable: true
items:
type: string
description: Filter by a list of account IDs.
format: uuid
nullable: true
name:
type: string
description: Search by name.
nullable: true
example: Bank Charges
description: Represents a request to search for accounts.
BookkeepingAccountUpdateRequestV1:
required:
- archived
- name
type: object
properties:
archived:
type: boolean
description: Boolean flag used to determine if the account is archived.
code:
maxLength: 255
minLength: 0
type: string
description: 'Account code or number used in the accounting system''s chart
of accounts. Maximum length: 255 characters.'
nullable: true
metadata:
type: object
additionalProperties:
type: object
description: Place for API users to store flexible data.
nullable: true
description: Place for API users to store flexible data.
nullable: true
name:
maxLength: 255
minLength: 0
type: string
description: 'Name of the account. Maximum length: 255 characters.'
taxCodeExternalId:
type: string
description: 'The identifier in **the target system** for the tax code the
account is associated with.
- This is NOT the tax percentage (e.g. 20%)
- This is NOT the Pleo UUID of the tax code'
nullable: true
description: Represents a request to update an account.
BookkeepingCategoryGroupTypeRestModelV5:
type: string
description: Bookkeeping category group types supported by Pleo. Used to classify
category groups in frontend.
enum:
- ENTERTAINMENT
- EQUIPMENT_AND_HARDWARE
- MARKETING_AND_ADVERTISING
- MEALS_AND_DRINKS
- OFFICE_EXPENSES
- PHONE_AND_INTERNET
- SERVICES_AND_CONSULTANCY
- SOFTWARE
- SUPPLIES
- TRAVEL
- OTHER
- NO_SUITABLE_CATEGORY
BookkeepingMethod:
type: string
description: Bookkeeping method supported by target system for accounting entries.
NONE means there would be no bookkeeping method used.
enum:
- NONE
- JOURNAL
- ACCOUNTS_PAYABLE
CursorPageCurrentRequestInfo:
required:
- parameters
type: object
properties:
after:
type: string
before:
type: string
limit:
type: integer
format: int32
offset:
type: integer
format: int64
parameters:
type: object
additionalProperties:
type: array
items:
type: string
sortingKeys:
type: array
items:
type: string
sortingOrder:
type: array
items:
$ref: '#/components/schemas/PageOrder'
CursorPageInfo:
required:
- currentRequestPagination
- hasNextPage
- hasPreviousPage
type: object
properties:
currentRequestPagination:
$ref: '#/components/schemas/CursorPageCurrentRequestInfo'
endCursor:
type: string
hasNextPage:
type: boolean
hasPreviousPage:
type: boolean
startCursor:
type: string
total:
type: integer
format: int64
CursorPaginatedResponseBookkeepingAccountRestModelV1:
required:
- data
- pagination
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/BookkeepingAccountRestModelV1'
pagination:
$ref: '#/components/schemas/CursorPageInfo'
DataResponseBookkeepingAccountBatchCreateResponseV1:
required:
- data
type: object
properties:
data:
$ref: '#/components/schemas/BookkeepingAccountBatchCreateResponseV1'
DataResponseBookkeepingAccountRestModelV1:
required:
- data
type: object
properties:
data:
$ref: '#/components/schemas/BookkeepingAccountRestModelV1'
PageOrder:
type: string
enum:
- ASC
- ASC_NULLS_FIRST
- ASC_NULLS_LAST
- DESC
- DESC_NULLS_FIRST
- DESC_NULLS_LAST
securitySchemes:
bearerAuth:
type: http
description: 'JWT Bearer token authentication. Include the token in the Authorization
header as: `Bearer <token>`'
scheme: bearer
bearerFormat: JWT
basicAuth:
type: http
description: Basic HTTP authentication using API key. Use your API key as the
username and leave the password empty. The credentials will be Base64 encoded
automatically.
scheme: basic