openapi: 3.1.0 info: title: Embat AccountingAccounts ReconcilingSources API description: Embat API enables connections between any third party application and Embat. Is organized around REST principles, using HTTP responses code and returning data in JSON format. While testing the API, you have to request **sandbox credentials**. contact: name: API Support url: https://embat.io/ email: tech@embat.io version: 2.120.3 x-logo: url: https://storage.googleapis.com/embat-production.appspot.com/assets/embat_dark.svg tags: - name: ReconcilingSources description: "
ReconcilingSource represents the origin of financial records that need to be matched against product transactions — for example a point-of-sale system, an internal financial system, or a CRM. customId is the unique identifier of a reconciling source: set your own value to use as your internal source ID.\n\nA reconciling source is the parent of one or more ReconcilingItems: each item references its source through reconcilingSourceCustomId. The source's matchingMetadataKey names the field within its items' metadata that Embat uses to associate each item with a product transaction. A reconciling source does not carry financial data itself — amounts, currencies and dates live on its ReconcilingItems.\n\n**Typical flow:**\n\n1. **Register a reconciling source.** Create one for each origin system you want to reconcile from, defining the metadata key used to match its items to transactions:\n\n```json\nPOST /reconcilingsources/{companyId}\n{\n \"customId\": \"stripe-orders\",\n \"name\": \"Stripe orders feed\",\n \"matchingMetadataKey\": \"orderId\"\n}\n```\n\nCalling this again with the same `customId` updates the existing source instead of creating a duplicate.\n\n2. **Create the reconciling items** for that source (see ReconcilingItems), each carrying the metadata value that will later be matched against product transactions.\n3. **Retrieve or list sources** with `GET /reconcilingsources/{companyId}/{customId}` or `GET /reconcilingsources/{companyId}`.\n4. **Update or delete a source** as your origin systems change: use `PATCH`/`DELETE /reconcilingsources/{companyId}/{customId}`, or resend the source with `POST` — creation is an upsert, so an existing `customId` is updated instead of duplicated.\n"
paths:
/reconcilingsources/{companyId}:
get:
tags:
- ReconcilingSources
summary: List reconciling sources
description: Returns all reconciling sources configured for the company. This endpoint is not paginated.
operationId: list_reconciling_sources_reconcilingsources__companyId__get
security:
- HTTPBearer: []
parameters:
- name: companyId
in: path
required: true
schema:
type: string
title: Companyid
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ListReconcilingSourcesResponseSchema'
'401':
description: Unauthorized. The bearer token is missing, invalid or expired.
content:
application/json:
example:
detail: user not authorized
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Not found. The requested resource or `companyId` does not exist.
content:
application/json:
example:
detail: 0021 companyId not found
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
post:
tags:
- ReconcilingSources
summary: Create reconciling source
description: Creates a reconciling source identified by `customId`. Calling this endpoint again with a `customId` that already exists **updates** the existing reconciling source instead of creating a duplicate or raising a conflict error; only the fields sent are applied, and any field previously stored is kept unless a new value is sent.
operationId: create_reconciling_source_reconcilingsources__companyId__post
security:
- HTTPBearer: []
parameters:
- name: companyId
in: path
required: true
schema:
type: string
title: Companyid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PostReconcilingSourceSchema'
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ModifyReconcilingSourceResponseSchema'
'401':
description: Unauthorized. The bearer token is missing, invalid or expired.
content:
application/json:
example:
detail: user not authorized
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Not found. The requested resource or `companyId` does not exist.
content:
application/json:
example:
detail: 0021 companyId not found
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/reconcilingsources/{companyId}/{customId}:
get:
tags:
- ReconcilingSources
summary: Retrieve reconciling source
description: Returns a single reconciling source by `customId`.
operationId: retrieve_reconciling_source_reconcilingsources__companyId___customId__get
security:
- HTTPBearer: []
parameters:
- name: customId
in: path
required: true
schema:
type: string
title: Customid
- name: companyId
in: path
required: true
schema:
type: string
title: Companyid
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/GetReconcilingSourceResponseSchema'
'401':
description: Unauthorized. The bearer token is missing, invalid or expired.
content:
application/json:
example:
detail: user not authorized
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Company not found, or no reconciling source matches the given `customId`.
content:
application/json:
example:
detail: 0021 companyId not found
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
patch:
tags:
- ReconcilingSources
summary: Update reconciling source
description: Updates a reconciling source identified by `customId`. Only the fields sent are changed. Note that updating a `customId` that does not match any reconciling source also returns `200` without applying any change — no `404` is raised.
operationId: update_reconciling_source_reconcilingsources__companyId___customId__patch
security:
- HTTPBearer: []
parameters:
- name: customId
in: path
required: true
schema:
type: string
title: Customid
- name: companyId
in: path
required: true
schema:
type: string
title: Companyid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PatchReconcilingSourceSchema'
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ModifyReconcilingSourceResponseSchema'
'401':
description: Unauthorized. The bearer token is missing, invalid or expired.
content:
application/json:
example:
detail: user not authorized
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Not found. The requested resource or `companyId` does not exist.
content:
application/json:
example:
detail: 0021 companyId not found
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
delete:
tags:
- ReconcilingSources
summary: Delete reconciling source
description: Deletes a reconciling source by `customId`. If `customId` does not match any reconciling source, no error is raised — the call still returns `200`.
operationId: delete_reconciling_source_reconcilingsources__companyId___customId__delete
security:
- HTTPBearer: []
parameters:
- name: customId
in: path
required: true
schema:
type: string
title: Customid
- name: companyId
in: path
required: true
schema:
type: string
title: Companyid
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ModifyReconcilingSourceResponseSchema'
'401':
description: Unauthorized. The bearer token is missing, invalid or expired.
content:
application/json:
example:
detail: user not authorized
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Not found. The requested resource or `companyId` does not exist.
content:
application/json:
example:
detail: 0021 companyId not found
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
components:
schemas:
PostReconcilingSourceSchema:
properties:
name:
type: string
title: Name
description: Name of the reconciling source.
examples:
- Stripe orders feed
additionalInfo:
anyOf:
- additionalProperties: true
type: object
- type: 'null'
title: Additionalinfo
description: Free-form key/value metadata to attach to the reconciling source. Replaces the previously stored value entirely (not merged). Omitted or `null` values leave the current metadata unchanged.
matchingMetadataKey:
anyOf:
- type: string
- type: 'null'
title: Matchingmetadatakey
description: Key within a reconciling item's `metadata` used to associate it with a product transaction. Omitted or `null` values leave the current key unchanged.
examples:
- orderId
customId:
type: string
title: Customid
description: Your own unique ID for the reconciling source. You can use it as your internal reconciling source ID.
examples:
- stripe-orders
type: object
required:
- name
- customId
title: PostReconcilingSourceSchema
ModifyReconcilingSourceResponseSchema:
properties:
id:
type: string
title: Id
description: Embat resource ID
type: object
required:
- id
title: ModifyReconcilingSourceResponseSchema
ErrorResponse:
properties:
detail:
type: string
title: Detail
description: Human-readable explanation of the error.
examples:
- user not authorized
type: object
required:
- detail
title: ErrorResponse
description: Error payload returned by the API (FastAPI `detail` convention).
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
input:
title: Input
ctx:
type: object
title: Context
type: object
required:
- loc
- msg
- type
title: ValidationError
GetReconcilingSourceResponseSchema:
properties:
name:
type: string
title: Name
description: Name of the reconciling source.
examples:
- Stripe orders feed
additionalInfo:
anyOf:
- additionalProperties: true
type: object
- type: 'null'
title: Additionalinfo
description: Free-form key/value metadata to attach to the reconciling source. Replaces the previously stored value entirely (not merged). Omitted or `null` values leave the current metadata unchanged.
matchingMetadataKey:
anyOf:
- type: string
- type: 'null'
title: Matchingmetadatakey
description: Key within a reconciling item's `metadata` used to associate it with a product transaction. Omitted or `null` values leave the current key unchanged.
examples:
- orderId
customId:
type: string
title: Customid
description: Your own unique ID for the reconciling source. You can use it as your internal reconciling source ID.
examples:
- stripe-orders
id:
type: string
title: Id
description: Embat ID of the reconciling source.
companyId:
type: string
title: Companyid
description: Embat company ID. You can get them from "companies" endpoints
updatedAt:
type: string
format: date-time
title: Updatedat
description: Last updated date of the entity in the database
createdAt:
type: string
format: date-time
title: Createdat
description: Created date of the entity in the database
type: object
required:
- name
- customId
- id
- companyId
- updatedAt
- createdAt
title: GetReconcilingSourceResponseSchema
ListReconcilingSourcesResponseSchema:
properties:
data:
items:
$ref: '#/components/schemas/GetReconcilingSourceResponseSchema'
type: array
title: Data
description: Reconciling sources configured for the company.
type: object
required:
- data
title: ListReconcilingSourcesResponseSchema
PatchReconcilingSourceSchema:
properties:
name:
anyOf:
- type: string
- type: 'null'
title: Name
description: Name of the reconciling source. Omitted or `null` values leave the current name unchanged.
examples:
- Stripe orders feed
additionalInfo:
anyOf:
- additionalProperties: true
type: object
- type: 'null'
title: Additionalinfo
description: Free-form key/value metadata to attach to the reconciling source. Replaces the previously stored value entirely (not merged). Omitted or `null` values leave the current metadata unchanged.
matchingMetadataKey:
anyOf:
- type: string
- type: 'null'
title: Matchingmetadatakey
description: Key within a reconciling item's `metadata` used to associate it with a product transaction. Omitted or `null` values leave the current key unchanged.
examples:
- orderId
type: object
title: PatchReconcilingSourceSchema
securitySchemes:
HTTPBearer:
type: http
scheme: bearer