curl --request POST \
--url https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay \
--header 'Content-Type: application/json' \
--data '
{
"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"
}
]
}
'import requests
url = "https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay"
payload = {
"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"
}
]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
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'
}
]
})
};
fetch('https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'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'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay"
payload := strings.NewReader("{\n \"bill_id\": \"31894\",\n \"transactions\": [\n {\n \"transaction_id\": 21069178,\n \"transaction_description\": \"ScholarShare ACHCONTRIB 070825\",\n \"account_id\": \"2550\",\n \"account_name\": \"2010 - Accounts Payable\",\n \"amount\": 8999.99\n }\n ],\n \"debit_memos\": [\n {\n \"debit_memo_id\": 343,\n \"debit_memo_number\": \"DM-0000005\",\n \"amount\": 1000.01,\n \"posted_at\": \"2025-07-25\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay")
.header("Content-Type", "application/json")
.body("{\n \"bill_id\": \"31894\",\n \"transactions\": [\n {\n \"transaction_id\": 21069178,\n \"transaction_description\": \"ScholarShare ACHCONTRIB 070825\",\n \"account_id\": \"2550\",\n \"account_name\": \"2010 - Accounts Payable\",\n \"amount\": 8999.99\n }\n ],\n \"debit_memos\": [\n {\n \"debit_memo_id\": 343,\n \"debit_memo_number\": \"DM-0000005\",\n \"amount\": 1000.01,\n \"posted_at\": \"2025-07-25\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"bill_id\": \"31894\",\n \"transactions\": [\n {\n \"transaction_id\": 21069178,\n \"transaction_description\": \"ScholarShare ACHCONTRIB 070825\",\n \"account_id\": \"2550\",\n \"account_name\": \"2010 - Accounts Payable\",\n \"amount\": 8999.99\n }\n ],\n \"debit_memos\": [\n {\n \"debit_memo_id\": 343,\n \"debit_memo_number\": \"DM-0000005\",\n \"amount\": 1000.01,\n \"posted_at\": \"2025-07-25\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"lines": [
{
"account_number": "<string>",
"account_name": "<string>",
"department_name": "<string>",
"department_code": "<string>",
"bill_customer_name": "<string>",
"tags": [
{}
],
"amortization_schedule": [
{
"journal_entry_order": "<string>",
"date": "2023-12-25",
"amount": 0,
"customer": 123,
"id": 123,
"posted": true,
"transaction": 123,
"bill_line": 123,
"debit_memo_line": 123,
"journal_entry": 123
}
],
"tax_rate_name": "<string>",
"tax_rate_value": 0,
"tag_ids": [
0
],
"tag_group_ids": [
0
],
"created_at": "2023-11-07T05:31:56Z",
"last_modified_at": "2023-11-07T05:31:56Z",
"customer": 123,
"account": 123,
"id": 123,
"description": "<string>",
"amount": 0,
"tax": 0,
"tax_description": "<string>",
"source": "<string>",
"source_id": "<string>",
"currency": "<string>",
"tax_rate": 123,
"bill_customer": 123,
"department": 123
}
],
"payments": [
{
"id": 123,
"payment_transaction_bank_description": "<string>",
"payment_journal_entry_order": "<string>",
"voided_journal_entry_order": "<string>",
"withheld_amount": 123,
"applied_debit_memo": {},
"created_at": "2023-11-07T05:31:56Z",
"last_modified_at": "2023-11-07T05:31:56Z",
"customer": 123,
"bill": 123,
"payment_journal_entry": 123,
"currency": "<string>",
"amount": 0,
"payment_date": "2023-12-25",
"source": "<string>",
"source_id": "<string>",
"voided_date": "2023-12-25",
"payment_transaction": 123,
"check_payment": 123,
"voided_journal_entry": 123
}
],
"payment_journal_entries": [
123
],
"status": "<string>",
"past_due_days": 123,
"entity_name": "<string>",
"entity_currency": "<string>",
"vendor_name": "<string>",
"vendor_campfire_id": "<string>",
"ap_account_name": "<string>",
"attachments": [
{
"id": 123,
"customer": 123,
"created_at": "2023-11-07T05:31:56Z",
"created_by": 123,
"created_by_name": "<string>",
"created_by_email": "<string>",
"last_modified_at": "2023-11-07T05:31:56Z",
"name": "<string>",
"url": "<string>",
"s3_path": "<string>",
"app": "<string>",
"model": "<string>",
"is_deleted": false,
"deleted_at": "2023-11-07T05:31:56Z",
"s3_content_type": "<string>",
"s3_content_length": 1073741823,
"object_id": 1073741823
}
],
"total_amount": 0,
"amount_due": 123,
"amount_paid": 0,
"voided_date": "2023-12-25",
"voided_journal_entry_order": "<string>",
"amortizations": "<string>",
"last_modified_at": "2023-11-07T05:31:56Z",
"ramp_use_sandbox": "<string>",
"navan_region": "<string>",
"zip_metadata": "<string>",
"is_deleted": false,
"deleted_at": "2023-11-07T05:31:56Z",
"payment_term_name": "<string>",
"withholding_info": {},
"search_vector": "<string>",
"search_text": "<string>",
"bill_number": "<string>",
"bill_date": "2023-12-25",
"due_date": "2023-12-25",
"created_at": "2023-11-07T05:31:56Z",
"customer": 123,
"entity": 123,
"vendor": 123,
"item_date": "2023-12-25",
"mailing_address": "<string>",
"terms": "custom",
"paid_date": "2023-12-25",
"message_on_bill": "<string>",
"ita_allocation_number": "<string>",
"ita_bill_type": "other",
"source_id": "<string>",
"source": "<string>",
"source_bill_data": null,
"external_ramp_id": "<string>",
"payment_status": "partial",
"currency": "<string>",
"exchange_rate": 0,
"exchange_rate_book": 0,
"origin_settlement_amount": 0,
"origin_settlement_currency": "<string>",
"origin_fx_rate": 0,
"tax_behavior": "inclusive",
"bill_type": "BILL",
"chat_id": -1,
"payment_term": 123,
"journal_entry": 123,
"source_file": 123,
"tax_rate": 123,
"ap_account": 123,
"voided_journal_entry": 123
}Mark Bill as Paid
Mark a bill as paid, allowing partial payments.
This endpoint supports multiple payment methods:
- Apply existing transactions as payments
- Apply debit memos to reduce the bill balance
- Create manual payments without a transaction
The request body should contain at least one of:
- transactions: List of transaction payments to apply
- debit_memos: List of debit memos to apply
- empty_transactions: List of manual payments without transactions
curl --request POST \
--url https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay \
--header 'Content-Type: application/json' \
--data '
{
"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"
}
]
}
'import requests
url = "https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay"
payload = {
"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"
}
]
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
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'
}
]
})
};
fetch('https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'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'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay"
payload := strings.NewReader("{\n \"bill_id\": \"31894\",\n \"transactions\": [\n {\n \"transaction_id\": 21069178,\n \"transaction_description\": \"ScholarShare ACHCONTRIB 070825\",\n \"account_id\": \"2550\",\n \"account_name\": \"2010 - Accounts Payable\",\n \"amount\": 8999.99\n }\n ],\n \"debit_memos\": [\n {\n \"debit_memo_id\": 343,\n \"debit_memo_number\": \"DM-0000005\",\n \"amount\": 1000.01,\n \"posted_at\": \"2025-07-25\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay")
.header("Content-Type", "application/json")
.body("{\n \"bill_id\": \"31894\",\n \"transactions\": [\n {\n \"transaction_id\": 21069178,\n \"transaction_description\": \"ScholarShare ACHCONTRIB 070825\",\n \"account_id\": \"2550\",\n \"account_name\": \"2010 - Accounts Payable\",\n \"amount\": 8999.99\n }\n ],\n \"debit_memos\": [\n {\n \"debit_memo_id\": 343,\n \"debit_memo_number\": \"DM-0000005\",\n \"amount\": 1000.01,\n \"posted_at\": \"2025-07-25\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"bill_id\": \"31894\",\n \"transactions\": [\n {\n \"transaction_id\": 21069178,\n \"transaction_description\": \"ScholarShare ACHCONTRIB 070825\",\n \"account_id\": \"2550\",\n \"account_name\": \"2010 - Accounts Payable\",\n \"amount\": 8999.99\n }\n ],\n \"debit_memos\": [\n {\n \"debit_memo_id\": 343,\n \"debit_memo_number\": \"DM-0000005\",\n \"amount\": 1000.01,\n \"posted_at\": \"2025-07-25\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"lines": [
{
"account_number": "<string>",
"account_name": "<string>",
"department_name": "<string>",
"department_code": "<string>",
"bill_customer_name": "<string>",
"tags": [
{}
],
"amortization_schedule": [
{
"journal_entry_order": "<string>",
"date": "2023-12-25",
"amount": 0,
"customer": 123,
"id": 123,
"posted": true,
"transaction": 123,
"bill_line": 123,
"debit_memo_line": 123,
"journal_entry": 123
}
],
"tax_rate_name": "<string>",
"tax_rate_value": 0,
"tag_ids": [
0
],
"tag_group_ids": [
0
],
"created_at": "2023-11-07T05:31:56Z",
"last_modified_at": "2023-11-07T05:31:56Z",
"customer": 123,
"account": 123,
"id": 123,
"description": "<string>",
"amount": 0,
"tax": 0,
"tax_description": "<string>",
"source": "<string>",
"source_id": "<string>",
"currency": "<string>",
"tax_rate": 123,
"bill_customer": 123,
"department": 123
}
],
"payments": [
{
"id": 123,
"payment_transaction_bank_description": "<string>",
"payment_journal_entry_order": "<string>",
"voided_journal_entry_order": "<string>",
"withheld_amount": 123,
"applied_debit_memo": {},
"created_at": "2023-11-07T05:31:56Z",
"last_modified_at": "2023-11-07T05:31:56Z",
"customer": 123,
"bill": 123,
"payment_journal_entry": 123,
"currency": "<string>",
"amount": 0,
"payment_date": "2023-12-25",
"source": "<string>",
"source_id": "<string>",
"voided_date": "2023-12-25",
"payment_transaction": 123,
"check_payment": 123,
"voided_journal_entry": 123
}
],
"payment_journal_entries": [
123
],
"status": "<string>",
"past_due_days": 123,
"entity_name": "<string>",
"entity_currency": "<string>",
"vendor_name": "<string>",
"vendor_campfire_id": "<string>",
"ap_account_name": "<string>",
"attachments": [
{
"id": 123,
"customer": 123,
"created_at": "2023-11-07T05:31:56Z",
"created_by": 123,
"created_by_name": "<string>",
"created_by_email": "<string>",
"last_modified_at": "2023-11-07T05:31:56Z",
"name": "<string>",
"url": "<string>",
"s3_path": "<string>",
"app": "<string>",
"model": "<string>",
"is_deleted": false,
"deleted_at": "2023-11-07T05:31:56Z",
"s3_content_type": "<string>",
"s3_content_length": 1073741823,
"object_id": 1073741823
}
],
"total_amount": 0,
"amount_due": 123,
"amount_paid": 0,
"voided_date": "2023-12-25",
"voided_journal_entry_order": "<string>",
"amortizations": "<string>",
"last_modified_at": "2023-11-07T05:31:56Z",
"ramp_use_sandbox": "<string>",
"navan_region": "<string>",
"zip_metadata": "<string>",
"is_deleted": false,
"deleted_at": "2023-11-07T05:31:56Z",
"payment_term_name": "<string>",
"withholding_info": {},
"search_vector": "<string>",
"search_text": "<string>",
"bill_number": "<string>",
"bill_date": "2023-12-25",
"due_date": "2023-12-25",
"created_at": "2023-11-07T05:31:56Z",
"customer": 123,
"entity": 123,
"vendor": 123,
"item_date": "2023-12-25",
"mailing_address": "<string>",
"terms": "custom",
"paid_date": "2023-12-25",
"message_on_bill": "<string>",
"ita_allocation_number": "<string>",
"ita_bill_type": "other",
"source_id": "<string>",
"source": "<string>",
"source_bill_data": null,
"external_ramp_id": "<string>",
"payment_status": "partial",
"currency": "<string>",
"exchange_rate": 0,
"exchange_rate_book": 0,
"origin_settlement_amount": 0,
"origin_settlement_currency": "<string>",
"origin_fx_rate": 0,
"tax_behavior": "inclusive",
"bill_type": "BILL",
"chat_id": -1,
"payment_term": 123,
"journal_entry": 123,
"source_file": 123,
"tax_rate": 123,
"ap_account": 123,
"voided_journal_entry": 123
}Path Parameters
ID of the bill to mark as paid
Body
Response
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Return AP account name with number in 'number - name' format, similar to name_and_number.
Show child attributes
Show child attributes
-1000000000000000000 < x < 1000000000000000000-1000000000000000000 < x < 1000000000000000000Navan data region (US/EU) for a Navan-sourced bill, else None.
Mirrors ramp_use_sandbox: the frontend builds the "Open in Navan" deep
link from source_id and uses this to pick the web-app host
(US -> app.navan.com, EU -> app-fra.navan.com). Navan bills carry no FK to
their connection, so the region is resolved per customer and memoized to
avoid an N+1 lookup across a bill list.
Withholding context for the bill's entity (AP side).
estimated_withholding_amount covers only the remaining amount due (null once
fully paid); withheld_to_date is the signed sum of posted withholding (AP legs
are credits, reversals debits), so actuals replace the estimate as payments post.
Certificate-based schemes estimate from the vendor certificate's rate valid today
(falling back to the scheme default).
Show child attributes
Show child attributes
120custom- Customnet_5- Net 5net_7- Net 7net_10- Net 10net_15- Net 15net_20- Net 20net_30- Net 30net_40- Net 40net_45- Net 45net_60- Net 60net_90- Net 90net_105- Net 105net_120- Net 120due_on_receipt- Due on Receipt
custom, net_5, net_7, net_10, net_15, net_20, net_30, net_40, net_45, net_60, net_90, net_105, net_120, due_on_receipt 9^\d{9}$Israel tax compliance: bill classification type
other- Otherequipment- Equipment
other, equipment 250partial- Partially Paidopen- Openpaid- Paidpayment_not_found- Payment Not Foundpayment_pending- Payment Pendingvoided- Voided
partial, open, paid, payment_not_found, payment_pending, voided 3-100000000000000 < x < 100000000000000-100000000000000 < x < 100000000000000-1000000000000000000 < x < 10000000000000000003-100000000000000 < x < 100000000000000inclusive- Inclusiveexclusive- Exclusive
inclusive, exclusive BILL- BillPAYROLL- PayrollREIMBURSEMENT- Reimbursement
BILL, PAYROLL, REIMBURSEMENT -2147483648 <= x <= 2147483647Payment term for this bill
Accounts Payable account for this bill