Campfire Accounts Payable API
Operations related to billing and the AP subledger.
Operations related to billing and the AP subledger.
openapi: 3.0.3
info:
title: Campfire Developer APIs Accounts Payable API
version: 1.0.0
description: '## Introduction
Campfire''s developer APIs offer granular access to Campfire''s core accounting,
revenue recognition, and financial data features.
These APIs are designed to be used by developers to build custom integrations,
automate workflows, and perform any other programmatic operations.
'
servers:
- url: https://api.meetcampfire.com
description: Production server
tags:
- name: Accounts Payable
description: Operations related to billing and the AP subledger.
paths:
/coa/api/v1/bill/:
get:
operationId: coa_api_v1_bill_retrieve
description: "\n Retrieve a paginated list of accounting bills with comprehensive filtering, search, and sorting capabilities.\n\n This endpoint provides complete access to your bills data with:\n - Advanced filtering by date ranges, payment status, vendors, entities, and currency\n - Full-text search across bill numbers, vendor names, addresses, and bill messages\n - Flexible sorting by any field including calculated fields (totals, amounts due, etc.)\n - Comprehensive pagination with customizable page sizes\n - Aging calculations and payment status categorization\n - Automatic calculation of totals, amounts paid, and amounts due\n\n **Deleted Records Support:**\n - When include_deleted=true: Returns ONLY deleted bills with minimal data (id, is_deleted, deleted_at, last_modified_at)\n - When include_deleted=false or omitted: Returns ONLY active bills with full data\n - Timestamp filtering (last_modified_at__gte/lte) works with both active and deleted records\n "
summary: List Accounting Bills
parameters:
- in: query
name: currency
schema:
type: string
description: Filter by currency code (e.g., USD, EUR)
- in: query
name: download
schema:
type: boolean
default: false
description: If true, triggers async download workflow and sends bills via email
- in: query
name: end_date
schema:
type: string
description: Filter bills with bill_date on or before this date (YYYY-MM-DD)
- in: query
name: entity
schema:
type: integer
description: Filter by entity ID. Can be specified multiple times for multiple entities
explode: true
style: form
- in: query
name: include_deleted
schema:
type: boolean
default: false
description: 'When set to ''true'', returns ONLY deleted records instead of active records. Deleted records contain minimal data: ''id'', ''is_deleted=true'', ''deleted_at'' timestamp, and ''last_modified_at''. When ''false'' or omitted, returns ONLY active records. This provides clean separation between active and deleted data.'
- in: query
name: last_modified_at__gte
schema:
type: string
description: 'Filter for records modified on or after this timestamp. Format: ISO 8601 (e.g., ''2024-01-01T00:00:00Z'' or ''2024-01-01''). Works with both active records and deleted records (filters by deletion time for deleted records).'
- in: query
name: last_modified_at__lte
schema:
type: string
description: 'Filter for records modified on or before this timestamp. Format: ISO 8601 (e.g., ''2024-12-31T23:59:59Z'' or ''2024-12-31''). Works with both active records and deleted records (filters by deletion time for deleted records).'
- in: query
name: limit
schema:
type: integer
default: 50
description: 'Number of results to return per page (default: 50, max: 1000)'
- in: query
name: offset
schema:
type: integer
default: 0
description: The initial index from which to return the results
- in: query
name: q
schema:
type: string
description: Search query - searches by mailing address, bill number, message on bill, or vendor name
- in: query
name: sort
schema:
type: string
default: -bill_date
description: 'Sort order. Use field name for ascending, -field for descending. Special fields: vendor_name, total_amount, amount_paid, amount_due, payment. Default: -bill_date'
- in: query
name: start_date
schema:
type: string
description: Filter bills with bill_date on or after this date (YYYY-MM-DD)
- in: query
name: status
schema:
type: string
enum:
- '1_30'
- '31_60'
- '61_90'
- '91_120'
- current
- open
- over_120
- paid
- partially_paid
- past_due
- payment_not_found
- payment_pending
- unpaid
- voided
description: Filter by payment status
- in: query
name: vendor
schema:
type: integer
description: Filter by vendor ID. Can be specified multiple times for multiple vendors
explode: true
style: form
tags:
- Accounts Payable
security:
- knoxApiToken: []
responses:
'200':
description: No response body
post:
operationId: coa_api_v1_bill_create
description: "\n Creates a new accounting bill with line items and automatic journal entry generation.\n\n This endpoint allows for complex bill creation with:\n - Multiple line items with different accounts, departments, and vendor assignments\n - Automatic accounts payable journal entry creation\n - Tax calculations and tax account handling\n - Exchange rate support for multi-currency transactions\n - Custom field support for additional bill metadata\n\n Requirements:\n - All referenced accounts must exist and be active\n - Vendor must exist\n - Entity must exist\n - Line items must have valid amounts and descriptions\n - Currency must be valid for the entity\n - Accounting date must be before closed book date\n "
summary: Create Accounting Bill
tags:
- Accounts Payable
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/AccountingBill'
examples:
CreateBillRequest:
value:
payment_term: 1234
bill_date: '2025-08-01'
due_date: '2025-08-24'
lines:
- tags:
- id: '8355'
name: Project A
group: 727
account: '2622'
account_name: 6700 - Office Expenses
amount: 10000
description: 1x Large Expense Line
bill_customer: '34182'
bill_customer_name: ABC Bead Supply
department: '35'
department_name: Engineering
entity: '54'
entity_name: Top Level
entity_currency: USD
currency: USD
exchange_rate_book: 1
exchange_rate: 1
vendor: '34182'
vendor_name: ABC Bead Supply
bill_number: '1234567'
item_date: '2025-08-01'
message_on_bill: A really big expense
mailing_address: 1234 Campground Road. San Francisco CA 98765
summary: Standard bill creation with multiple line items
description: Example of creating a bill with multiple expense line items, vendor assignment, and payment terms
CreateBillResponse:
value:
id: 31894
lines:
- id: 298626
account_number: '6700'
account_name: 6700 - Office Expenses
department_name: Engineering
bill_customer_name: ABC Bead Supply
tags:
- id: 8355
group_name: Projects
parent_name: null
parent: null
name: Project A
created_at: 2025-07-17T16:21:02+0000
last_modified_at: 2025-07-17T16:21:02+0000
group: 727
amortization_schedule: []
description: 1x Large Expense Line
amount: 10000
tax: 0
tax_description: null
source: null
source_id: null
currency: USD
created_at: 2025-07-25T04:24:32+0000
last_modified_at: 2025-07-25T04:24:32+0000
account: 2622
bill_customer: 34182
department: 35
payments: []
payment_journal_entries: []
status: open
past_due_days: null
entity_name: Top Level
entity_currency: USD
vendor_name: ABC Bead Supply
attachments: []
total_amount: 10000
amount_due: 10000
amount_paid: 0
item_date: '2025-08-01'
voided_date: null
search_vector: null
search_text: null
mailing_address: 1234 Campground Road. San Francisco CA 98765
terms: null
bill_number: '1234567'
bill_date: '2025-08-01'
due_date: '2025-08-24'
paid_date: null
message_on_bill: A really big expense
source_id: null
source: null
payment_status: open
currency: USD
exchange_rate: 1
exchange_rate_book: 1
created_at: 2025-07-25T04:24:32+0000
last_modified_at: 2025-07-25T04:24:32+0000
entity: 54
vendor: 34182
payment_term: 1234
payment_term_name: Net 30
journal_entry: 7491951
source_file: null
tax_rate: null
voided_journal_entry: null
summary: Response after successfully creating a bill
description: Example response showing the created bill with generated IDs, calculated totals, and journal entry information
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/AccountingBill'
multipart/form-data:
schema:
$ref: '#/components/schemas/AccountingBill'
required: true
security:
- knoxApiToken: []
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/AccountingBill'
examples:
CreateBillResponse:
value:
id: 31894
lines:
- id: 298626
account_number: '6700'
account_name: 6700 - Office Expenses
department_name: Engineering
bill_customer_name: ABC Bead Supply
tags:
- id: 8355
group_name: Projects
parent_name: null
parent: null
name: Project A
created_at: 2025-07-17T16:21:02+0000
last_modified_at: 2025-07-17T16:21:02+0000
group: 727
amortization_schedule: []
description: 1x Large Expense Line
amount: 10000
tax: 0
tax_description: null
source: null
source_id: null
currency: USD
created_at: 2025-07-25T04:24:32+0000
last_modified_at: 2025-07-25T04:24:32+0000
account: 2622
bill_customer: 34182
department: 35
payments: []
payment_journal_entries: []
status: open
past_due_days: null
entity_name: Top Level
entity_currency: USD
vendor_name: ABC Bead Supply
attachments: []
total_amount: 10000
amount_due: 10000
amount_paid: 0
item_date: '2025-08-01'
voided_date: null
search_vector: null
search_text: null
mailing_address: 1234 Campground Road. San Francisco CA 98765
terms: null
bill_number: '1234567'
bill_date: '2025-08-01'
due_date: '2025-08-24'
paid_date: null
message_on_bill: A really big expense
source_id: null
source: null
payment_status: open
currency: USD
exchange_rate: 1
exchange_rate_book: 1
created_at: 2025-07-25T04:24:32+0000
last_modified_at: 2025-07-25T04:24:32+0000
entity: 54
vendor: 34182
payment_term: 1234
payment_term_name: Net 30
journal_entry: 7491951
source_file: null
tax_rate: null
voided_journal_entry: null
summary: Response after successfully creating a bill
description: Example response showing the created bill with generated IDs, calculated totals, and journal entry information
description: ''
/coa/api/v1/bill-draft:
get:
operationId: list_bill_drafts
description: GET list (customer-scoped, ``status`` / ``source`` filterable) + POST UI upload.
summary: List Bill Drafts
tags:
- Accounts Payable
security:
- knoxApiToken: []
responses:
'200':
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/BillDraftRead'
description: ''
post:
operationId: create_bill_draft
description: GET list (customer-scoped, ``status`` / ``source`` filterable) + POST UI upload.
summary: Create Bill Draft
tags:
- Accounts Payable
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/BillDraftCreate'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/BillDraftCreate'
multipart/form-data:
schema:
$ref: '#/components/schemas/BillDraftCreate'
required: true
security:
- knoxApiToken: []
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/BillDraftCreate'
description: ''
/coa/api/v1/bill-draft/{id}:
get:
operationId: get_bill_draft
description: GET detail + PATCH update on a single BillDraft.
summary: Retrieve Bill Draft
parameters:
- in: path
name: id
schema:
type: integer
required: true
tags:
- Accounts Payable
security:
- knoxApiToken: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/BillDraftRead'
description: ''
put:
operationId: update_bill_draft
description: GET detail + PATCH update on a single BillDraft.
summary: Update Bill Draft
parameters:
- in: path
name: id
schema:
type: integer
required: true
tags:
- Accounts Payable
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/BillDraftWrite'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/BillDraftWrite'
multipart/form-data:
schema:
$ref: '#/components/schemas/BillDraftWrite'
security:
- knoxApiToken: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/BillDraftWrite'
description: ''
patch:
operationId: partial_update_bill_draft
description: GET detail + PATCH update on a single BillDraft.
summary: Partial Update Bill Draft
parameters:
- in: path
name: id
schema:
type: integer
required: true
tags:
- Accounts Payable
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PatchedBillDraftWrite'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/PatchedBillDraftWrite'
multipart/form-data:
schema:
$ref: '#/components/schemas/PatchedBillDraftWrite'
security:
- knoxApiToken: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/BillDraftWrite'
description: ''
/coa/api/v1/bill-draft/{id}/abandon:
post:
operationId: abandon_bill_draft
description: POST /bill-draft/<pk>/abandon — hard-delete an unfinished UI upload draft.
summary: Abandon Bill Draft
parameters:
- in: path
name: id
schema:
type: integer
required: true
tags:
- Accounts Payable
security:
- knoxApiToken: []
responses:
'200':
description: No response body
/coa/api/v1/bill-draft/{id}/discard:
post:
operationId: discard_bill_draft
description: POST /bill-draft/<pk>/discard — terminal state with a required reason.
summary: Discard Bill Draft
parameters:
- in: path
name: id
schema:
type: integer
required: true
tags:
- Accounts Payable
security:
- knoxApiToken: []
responses:
'200':
description: No response body
/coa/api/v1/bill-draft/{id}/promote:
post:
operationId: promote_bill_draft
description: POST /bill-draft/<pk>/promote — routes through the promote service.
summary: Promote Bill Draft
parameters:
- in: path
name: id
schema:
type: integer
required: true
tags:
- Accounts Payable
security:
- knoxApiToken: []
responses:
'200':
description: No response body
/coa/api/v1/bill-payments:
get:
operationId: coa_api_v1_bill_payments_list
description: "\n Retrieve a paginated list of bill payments (payments applied against accounts\n payable bills), designed for syncing payment data into external systems.\n\n Results are ordered by (last_modified_at, id) ascending, so pages are stable and\n a sync can resume from where it left off.\n\n **Full sync (cursor pagination):**\n - Pass an empty cursor parameter (cursor=) on the first request\n - Follow the 'next' URL from each response until it is null\n\n **Incremental sync (time-based):**\n - Store the highest last_modified_at value you have processed\n - On the next run, pass it as last_modified_at__gte to fetch only new and updated payments\n\n **Voids:**\n - Voided payments are included by default with voided_date set, so integrators can\n detect payments that were reversed after a previous sync\n - Filter with voided=true or voided=false to fetch only one kind\n "
summary: List Bill Payments
parameters:
- in: query
name: cursor
schema:
type: string
description: Opts into cursor pagination. Pass an empty value (cursor=) on the first request, then follow the 'next' URL from each response until it is null. The cursor value is opaque - do not parse or construct it. Cursor pagination is recommended for full syncs as it avoids the performance penalty of deep offsets on large result sets.
- in: query
name: last_modified_at__gte
schema:
type: string
description: 'Filter for payments modified on or after this timestamp. Format: ISO 8601 (e.g., ''2024-01-01T00:00:00Z'' or ''2024-01-01''). Use this for incremental syncs: store the highest last_modified_at you have processed and pass it on the next sync run.'
- in: query
name: last_modified_at__lte
schema:
type: string
description: 'Filter for payments modified on or before this timestamp. Format: ISO 8601 (e.g., ''2024-12-31T23:59:59Z'' or ''2024-12-31''). Date-only values are inclusive of the entire day.'
- in: query
name: limit
schema:
type: integer
default: 100
description: Maximum number of records to return per page. Default 100, maximum 10000. Use with offset to paginate
- in: query
name: offset
schema:
type: integer
default: 0
description: Number of records to skip before collecting the result page. Use with limit to paginate
- in: query
name: skip_count
schema:
type: boolean
default: false
description: When 'true', skips the total COUNT query and returns a lower-bound 'count' instead. Recommended for large syncs where the exact total is not needed.
- in: query
name: voided
schema:
type: boolean
description: Filter by void status. When 'true', returns only voided payments (voided_date is set). When 'false', returns only active payments. When omitted, returns both so integrators can detect and propagate voids.
tags:
- Accounts Payable
security:
- knoxApiToken: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedBillPaymentSyncList'
description: ''
/coa/api/v1/bill/{bill_id}/empty-transaction-default-department-tags:
get:
operationId: coa_api_v1_bill_empty_transaction_default_department_tags_retrieve
description: "Get the default department and tags from the bill line with the largest total amount.\n\n This endpoint is used to provide default values when creating empty transactions (marking as paid without a transaction).\n The total amount is calculated as: amount + tax.\n If multiple lines have the same total amount, the line with the lowest ID (first created) is selected.\n The department and tags are retrieved directly from the bill line."
summary: Get Default Department and Tags for Empty Transaction
parameters:
- in: path
name: bill_id
schema:
type: integer
description: ID of the bill
required: true
tags:
- Accounts Payable
security:
- knoxApiToken: []
responses:
'200':
content:
application/json:
schema:
type: object
properties:
department:
type: object
nullable: true
properties:
id:
type: integer
name:
type: string
tags:
type: array
items:
type: object
properties:
id:
type: integer
name:
type: string
group:
type: integer
nullable: true
group_name:
type: string
nullable: true
description: ''
'404':
content:
application/json:
schema:
description: Bill not found
description: ''
/coa/api/v1/bill/{bill_id}/pay/:
post:
operationId: coa_api_v1_bill_pay_create
description: "Mark a bill as paid, allowing partial payments.\n\n This endpoint supports multiple payment methods:\n - Apply existing transactions as payments\n - Apply debit memos to reduce the bill balance\n - Create manual payments without a transaction\n\n The request body should contain at least one of:\n - transactions: List of transaction payments to apply\n - debit_memos: List of debit memos to apply\n - empty_transactions: List of manual payments without transactions"
summary: Mark Bill as Paid
parameters:
- in: path
name: bill_id
schema:
type: integer
description: ID of the bill to mark as paid
required: true
tags:
- Accounts Payable
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/MarkPaid'
examples:
MarkBillAsPaidRequest:
value:
bill_id: '31894'
transactions:
- transaction_id: 21069178
transaction_description: ScholarShare ACHCONTRIB 070825
account_id: '2550'
account_name: 2010 - Accounts Payable
amount: 8999.99
debit_memos:
- debit_memo_id: 343
debit_memo_number: DM-0000005
amount: 1000.01
posted_at: '2025-07-25'
summary: Mark Bill as Paid Request
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/MarkPaid'
multipart/form-data:
schema:
$ref: '#/components/schemas/MarkPaid'
security:
- knoxApiToken: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/AccountingBill'
description: ''
/coa/api/v1/bill/{bill_id}/payment/{payment_id}/void/:
post:
operationId: coa_api_v1_bill_payment_void_create
description: "Void an existing bill payment.\n\n This creates a reversing journal entry to void the payment and updates the bill status.\n\n Optionally accepts a void_date in the request body to specify when the payment should be voided.\n If not provided, defaults to today's date."
summary: Void Bill Payment
parameters:
- in: path
name: bill_id
schema:
type: integer
description: ID of the bill
required: true
- in: path
name: payment_id
schema:
type: integer
description: ID of the payment to void
required: true
tags:
- Accounts Payable
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/VoidPayment'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/VoidPayment'
multipart/form-data:
schema:
$ref: '#/components/schemas/VoidPayment'
security:
- knoxApiToken: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/AccountingBillPayment'
description: ''
delete:
operationId: coa_api_v1_bill_payment_void_destroy
description: "Delete a bill payment.\n\n This removes the payment record and updates the transaction to uncategorized."
summary: Delete Bill Payment
parameters:
- in: path
name: bill_id
schema:
type: integer
description: ID of the bill
required: true
- in: path
name: payment_id
schema:
type: integer
description: ID of the payment to delete
required: true
tags:
- Accounts Payable
security:
- knoxApiToken: []
responses:
'204':
description: No response body
/coa/api/v1/bill/{bill_id}/reopen/:
post:
operationId: coa_api_v1_bill_reopen_create
description: "Reopen a voided bill.\n\n This removes the void date and void journal entry, and sets the bill status back to open.\n The voiding journal entry will be deleted to reverse the void operation."
summary: Reopen Voided Bill
parameters:
- in: path
name: bill_id
schema:
type: integer
description: ID of the voided bill to reopen
required: true
tags:
- Accounts Payable
security:
- knoxApiToken: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/AccountingBill'
description: ''
/coa/api/v1/bill/{bill_id}/sync-to-ramp/:
post:
operationId: coa_api_v1_bill_sync_to_ramp_create
description: Sync a bill without a source to Ramp using the enabled Ramp connection
summary: Sync Bill to Ramp
parameters:
- in: path
name: bill_id
schema:
type: integer
required: true
tags:
- Accounts Payable
security:
- knoxApiToken: []
responses:
'200':
description: No response body
'400':
description: No response body
'404':
description: No response body
/coa/api/v1/bill/{bill_id}/void/:
post:
operationId: coa_api_v1_bill_void_create
description: "Void an existing bill.\n\n This creates a reversing journal entry to void the bill by reversing all debit and credit amounts.\n The bill status will be updated to reflect the void."
summary: Void Bill
parameters:
- in: path
name: bill_id
schema:
type: integer
description: ID of the bill to void
required: true
tags:
- Accounts Payable
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/VoidBillRequest'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/VoidBillRequest'
multipart/form-data:
schema:
$ref: '#/components/schemas/VoidBillRequest'
required: true
security:
- knoxApiToken: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/AccountingBill'
description: ''
/coa/api/v1/bill/{id}/:
get:
operationId: coa_api_v1_bill_retrieve_2
description: "\n Retrieve a single accounting bill by ID with complete detail including all line items, payments, and related data.\n\n This endpoint returns comprehensive bill information including:\n - Full bill details with vendor, entity, and customer information\n - All line items with account details, departments, tags, and amortization schedules\n - Complete payment history with journal entry references\n -
# --- truncated at 32 KB (131 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/campfire/refs/heads/main/openapi/campfire-accounts-payable-api-openapi.yml