Puzzle Journal Entries API
Double-entry journal entries against the general ledger.
Double-entry journal entries against the general ledger.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/puzzle-journal-entries-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Puzzle Accounting Journal Entries API
description: RESTful, JSON API for Puzzle's real-time financial data hub and general ledger.
version: 0.19.0
termsOfService: https://puzzle.io/terms
contact:
name: Puzzle API Support
email: support@puzzle.io
url: https://puzzle-api.readme.io/docs/welcome
servers:
- url: https://staging.southparkdata.com
description: Documented Puzzle API server (Puzzle's underlying data platform is named South Park Data). Confirmed from the public API reference.
security:
- oauth2: []
- apiKey: []
tags:
- name: Journal Entries
description: Double-entry journal entries against the general ledger.
paths:
/rest/v0/company/{id}/journal-entries:
get:
operationId: listJournalEntries
tags:
- Journal Entries
summary: List journal entries
description: Read double-entry journal entries posted to a company's general ledger.
x-puzzle-unverified: true
parameters:
- $ref: '#/components/parameters/CompanyId'
responses:
'200':
description: A list of journal entries.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/JournalEntry'
'401':
$ref: '#/components/responses/Unauthorized'
/company/{id}/journalEntries:
get:
operationId: journalEntries
summary: Get Journal Entries
description: 'Required scope: read:company'
tags:
- Journal Entries
parameters:
- name: id
in: path
required: true
description: The company ID
schema:
type: string
minLength: 1
description: Partner-facing external identifier
- name: limit
in: query
required: false
schema:
type: integer
- name: cursor
in: query
required: false
schema:
type: string
- name: basis
in: query
required: false
schema:
type: string
enum:
- cash
- accrual
- name: createdAfter
in: query
required: false
schema:
type: string
minLength: 1
description: ISO 8601 timestamp
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
journalEntries:
type: array
items:
type: object
properties:
id:
type: string
minLength: 1
description: Partner-facing external identifier
manualJournalEntryId:
type:
- string
- 'null'
minLength: 1
description: Partner-facing external identifier
description:
type:
- string
- 'null'
memo:
type:
- string
- 'null'
postingDate:
type: string
effectiveAt:
type: string
minLength: 1
description: ISO 8601 timestamp
basis:
type:
- string
- 'null'
enum:
- cash
- accrual
type:
type: string
enum:
- Partner
lines:
type: array
items:
type: object
properties:
description:
type:
- string
- 'null'
amount:
type: string
minLength: 1
description: Arbitrary-precision decimal, serialized as a string
currency:
type: string
minLength: 3
maxLength: 3
description: ISO 4217 currency code
accountId:
type: string
minLength: 1
description: Partner-facing external identifier
required:
- description
- amount
- currency
- accountId
required:
- id
- manualJournalEntryId
- description
- memo
- postingDate
- effectiveAt
- basis
- type
- lines
pageInfo:
type: object
properties:
nextCursor:
type:
- string
- 'null'
minLength: 1
description: Partner-facing external identifier
required:
- nextCursor
required:
- journalEntries
- pageInfo
post:
operationId: upsertJournalEntries
summary: Create Journal Entry
description: 'Required scope: write:journal
Journal entries are the entries made in a company''s ledger accounts as a way of recording financial impact. The line items for each journal entry should balance to 0.
Create Journal Entries endpoint creates a Journal Entry into our Gateway and not on our Ledger. Once the Gateway receives a Journal Entry, you get an OK response. Ledger Journal Entries are created async and can be retrieved through the Get Journal Entries endpoint.
Puzzle journal entries are immutable. This means that when an update is made, 2 additional journal entries get created - one to reverse the original journal entry and another to reflect the updates. Reversal journal entries can be identified by their description field - they will have descriptions matching "Reversal of {{journal entry id}}".
All Puzzle companies have both cash and accrual journal entries; they are distinct populations.'
tags:
- Journal Entries
parameters:
- name: id
in: path
required: true
description: The company ID
schema:
type: string
minLength: 1
description: Partner-facing external identifier
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
entries:
type: array
items:
type: object
properties:
basis:
type: array
items:
type: string
memo:
type: string
postingDate:
type: string
minLength: 1
description: Calendar date, YYYY-MM-DD
type:
type: string
enum:
- Journal
- Transaction
nativeTransactionId:
type: string
createdFor:
type: string
lines:
type: array
items:
type: object
properties:
id:
type: string
minLength: 1
description: Partner-facing external identifier
amount:
type: string
minLength: 1
description: Arbitrary-precision decimal, serialized as a string
coaKey:
type: string
minLength: 1
description: Chart-of-accounts key
description:
type: string
manualJournalEntryId:
type: string
minLength: 1
description: Partner-facing external identifier
classifications:
type: array
items:
type: object
properties:
class:
type: string
minLength: 1
segment:
type: string
minLength: 1
required:
- class
- segment
userDefinedMetadata:
type:
- object
- 'null'
additionalProperties: {}
vendorId:
type: string
minLength: 1
description: Partner-facing external identifier
vendorName:
type: string
customerId:
type: string
minLength: 1
description: Partner-facing external identifier
customerName:
type: string
required:
- amount
- coaKey
- description
document:
type: object
properties:
documentType:
type: string
enum:
- Receipt
- Bill
- Invoice
fileName:
type: string
minLength: 1
contentType:
type: string
minLength: 1
base64File:
type: string
minLength: 1
nativeDocumentId:
type: string
minLength: 1
required:
- documentType
- fileName
- contentType
- base64File
- nativeDocumentId
required:
- basis
- memo
- postingDate
- lines
required:
- entries
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
summary:
type: object
properties:
requested:
type: integer
success:
type: integer
error:
type: integer
required:
- requested
- success
- error
results:
type: array
items:
type: object
properties:
index:
type: integer
status:
type: string
enum:
- success
- error
id:
type: string
minLength: 1
description: Partner-facing external identifier
nativeId:
type: string
error:
type: object
properties:
message:
type: string
code:
type: string
required:
- message
- code
required:
- index
- status
required:
- summary
- results
/company/{id}/journalEntries/{journalEntryId}/document:
post:
operationId: createJournalEntryDocument
summary: Create Document
description: 'Create a document for a given journal entry.
Required scope: write:journal'
tags:
- Journal Entries
parameters:
- name: id
in: path
required: true
description: The company ID
schema:
type: string
minLength: 1
description: Partner-facing external identifier
- name: journalEntryId
in: path
required: true
description: The journal entry ID
schema:
type: string
minLength: 1
description: Partner-facing external identifier
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
documentType:
type: string
enum:
- Receipt
- Bill
- Invoice
fileName:
type: string
minLength: 1
contentType:
type: string
minLength: 1
base64File:
type: string
minLength: 1
nativeDocumentId:
type: string
minLength: 1
required:
- documentType
- fileName
- contentType
- base64File
- nativeDocumentId
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
transactionId:
type:
- string
- 'null'
minLength: 1
description: Partner-facing external identifier
manualJournalEntryId:
type:
- string
- 'null'
minLength: 1
description: Partner-facing external identifier
journalEntryId:
type:
- string
- 'null'
minLength: 1
description: Partner-facing external identifier
billId:
type:
- string
- 'null'
minLength: 1
description: Partner-facing external identifier
invoiceId:
type:
- string
- 'null'
minLength: 1
description: Partner-facing external identifier
document:
type: object
properties:
id:
type: string
documentType:
type: string
enum:
- Receipt
- Bill
- Invoice
contentType:
type: string
downloadInfo:
type: object
properties:
signedUrl:
type: string
urlExpiresAt:
type: string
minLength: 1
description: ISO 8601 timestamp
required:
- signedUrl
- urlExpiresAt
required:
- id
- documentType
- contentType
- downloadInfo
required:
- transactionId
- manualJournalEntryId
- journalEntryId
- billId
- invoiceId
- document
components:
schemas:
JournalEntry:
type: object
properties:
id:
type: string
date:
type: string
format: date
memo:
type: string
lines:
type: array
items:
type: object
properties:
accountId:
type: string
debit:
type: number
credit:
type: number
Error:
type: object
properties:
error:
type: string
message:
type: string
responses:
Unauthorized:
description: Missing or invalid credentials.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
parameters:
CompanyId:
name: id
in: path
required: true
description: The company ID.
schema:
type: string
securitySchemes:
oauth2:
type: oauth2
description: OAuth 2.0 with scoped access (for example read:company, read:transactions, read:report). Partner credentials are issued after the Puzzle partner technical review.
flows:
clientCredentials:
tokenUrl: https://puzzle-api.readme.io/reference
scopes:
read:company: Read company data
read:transactions: Read transactions
read:accounts: Read ledger accounts
read:report: Read financial statements
apiKey:
type: apiKey
in: header
name: Authorization
description: API key authentication via the Authorization header, as described in the Puzzle developer docs.