Skip to main content
POST
/
coa
/
api
/
v1
/
bill
/
{bill_id}
/
pay
/
Mark Bill as Paid
curl --request POST \
  --url https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay/ \
  --header 'Authorization: <api-key>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "transaction_match_id": 123,
  "transactions": [
    {
      "amount": 0,
      "transaction_match_id": 123,
      "transaction_id": 123,
      "transaction_ids": [
        123
      ],
      "account_id": 123,
      "amount_payable": 0,
      "credit_account_id": 123,
      "writeoff_account_id": 123,
      "withholding_amount": 0,
      "withholding_tax_rate_id": 123
    }
  ],
  "credit_memos": [
    {
      "credit_memo_id": 123,
      "amount": 0,
      "posted_at": "2023-12-25"
    }
  ],
  "debit_memos": [
    {
      "debit_memo_id": 123,
      "amount": 0,
      "posted_at": "2023-12-25"
    }
  ],
  "empty_transactions": [
    {
      "account_id": 123,
      "account_name": "<string>",
      "amount": 0,
      "payment_date": "2023-12-25",
      "department_id": 123,
      "tag_ids": [
        123
      ],
      "memo": "<string>",
      "external_id": "<string>",
      "currency": "<string>",
      "amount_in_invoice_currency": 0,
      "amount_in_bill_currency": 0,
      "withholding_amount": 0,
      "withholding_tax_rate_id": 123
    }
  ]
}
'
import requests

url = "https://api.meetcampfire.com/coa/api/v1/bill/{bill_id}/pay/"

payload = {
"transaction_match_id": 123,
"transactions": [
{
"amount": 0,
"transaction_match_id": 123,
"transaction_id": 123,
"transaction_ids": [123],
"account_id": 123,
"amount_payable": 0,
"credit_account_id": 123,
"writeoff_account_id": 123,
"withholding_amount": 0,
"withholding_tax_rate_id": 123
}
],
"credit_memos": [
{
"credit_memo_id": 123,
"amount": 0,
"posted_at": "2023-12-25"
}
],
"debit_memos": [
{
"debit_memo_id": 123,
"amount": 0,
"posted_at": "2023-12-25"
}
],
"empty_transactions": [
{
"account_id": 123,
"account_name": "<string>",
"amount": 0,
"payment_date": "2023-12-25",
"department_id": 123,
"tag_ids": [123],
"memo": "<string>",
"external_id": "<string>",
"currency": "<string>",
"amount_in_invoice_currency": 0,
"amount_in_bill_currency": 0,
"withholding_amount": 0,
"withholding_tax_rate_id": 123
}
]
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
transaction_match_id: 123,
transactions: [
{
amount: 0,
transaction_match_id: 123,
transaction_id: 123,
transaction_ids: [123],
account_id: 123,
amount_payable: 0,
credit_account_id: 123,
writeoff_account_id: 123,
withholding_amount: 0,
withholding_tax_rate_id: 123
}
],
credit_memos: [{credit_memo_id: 123, amount: 0, posted_at: '2023-12-25'}],
debit_memos: [{debit_memo_id: 123, amount: 0, posted_at: '2023-12-25'}],
empty_transactions: [
{
account_id: 123,
account_name: '<string>',
amount: 0,
payment_date: '2023-12-25',
department_id: 123,
tag_ids: [123],
memo: '<string>',
external_id: '<string>',
currency: '<string>',
amount_in_invoice_currency: 0,
amount_in_bill_currency: 0,
withholding_amount: 0,
withholding_tax_rate_id: 123
}
]
})
};

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([
'transaction_match_id' => 123,
'transactions' => [
[
'amount' => 0,
'transaction_match_id' => 123,
'transaction_id' => 123,
'transaction_ids' => [
123
],
'account_id' => 123,
'amount_payable' => 0,
'credit_account_id' => 123,
'writeoff_account_id' => 123,
'withholding_amount' => 0,
'withholding_tax_rate_id' => 123
]
],
'credit_memos' => [
[
'credit_memo_id' => 123,
'amount' => 0,
'posted_at' => '2023-12-25'
]
],
'debit_memos' => [
[
'debit_memo_id' => 123,
'amount' => 0,
'posted_at' => '2023-12-25'
]
],
'empty_transactions' => [
[
'account_id' => 123,
'account_name' => '<string>',
'amount' => 0,
'payment_date' => '2023-12-25',
'department_id' => 123,
'tag_ids' => [
123
],
'memo' => '<string>',
'external_id' => '<string>',
'currency' => '<string>',
'amount_in_invoice_currency' => 0,
'amount_in_bill_currency' => 0,
'withholding_amount' => 0,
'withholding_tax_rate_id' => 123
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"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 \"transaction_match_id\": 123,\n \"transactions\": [\n {\n \"amount\": 0,\n \"transaction_match_id\": 123,\n \"transaction_id\": 123,\n \"transaction_ids\": [\n 123\n ],\n \"account_id\": 123,\n \"amount_payable\": 0,\n \"credit_account_id\": 123,\n \"writeoff_account_id\": 123,\n \"withholding_amount\": 0,\n \"withholding_tax_rate_id\": 123\n }\n ],\n \"credit_memos\": [\n {\n \"credit_memo_id\": 123,\n \"amount\": 0,\n \"posted_at\": \"2023-12-25\"\n }\n ],\n \"debit_memos\": [\n {\n \"debit_memo_id\": 123,\n \"amount\": 0,\n \"posted_at\": \"2023-12-25\"\n }\n ],\n \"empty_transactions\": [\n {\n \"account_id\": 123,\n \"account_name\": \"<string>\",\n \"amount\": 0,\n \"payment_date\": \"2023-12-25\",\n \"department_id\": 123,\n \"tag_ids\": [\n 123\n ],\n \"memo\": \"<string>\",\n \"external_id\": \"<string>\",\n \"currency\": \"<string>\",\n \"amount_in_invoice_currency\": 0,\n \"amount_in_bill_currency\": 0,\n \"withholding_amount\": 0,\n \"withholding_tax_rate_id\": 123\n }\n ]\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "<api-key>")
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("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"transaction_match_id\": 123,\n \"transactions\": [\n {\n \"amount\": 0,\n \"transaction_match_id\": 123,\n \"transaction_id\": 123,\n \"transaction_ids\": [\n 123\n ],\n \"account_id\": 123,\n \"amount_payable\": 0,\n \"credit_account_id\": 123,\n \"writeoff_account_id\": 123,\n \"withholding_amount\": 0,\n \"withholding_tax_rate_id\": 123\n }\n ],\n \"credit_memos\": [\n {\n \"credit_memo_id\": 123,\n \"amount\": 0,\n \"posted_at\": \"2023-12-25\"\n }\n ],\n \"debit_memos\": [\n {\n \"debit_memo_id\": 123,\n \"amount\": 0,\n \"posted_at\": \"2023-12-25\"\n }\n ],\n \"empty_transactions\": [\n {\n \"account_id\": 123,\n \"account_name\": \"<string>\",\n \"amount\": 0,\n \"payment_date\": \"2023-12-25\",\n \"department_id\": 123,\n \"tag_ids\": [\n 123\n ],\n \"memo\": \"<string>\",\n \"external_id\": \"<string>\",\n \"currency\": \"<string>\",\n \"amount_in_invoice_currency\": 0,\n \"amount_in_bill_currency\": 0,\n \"withholding_amount\": 0,\n \"withholding_tax_rate_id\": 123\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["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"transaction_match_id\": 123,\n \"transactions\": [\n {\n \"amount\": 0,\n \"transaction_match_id\": 123,\n \"transaction_id\": 123,\n \"transaction_ids\": [\n 123\n ],\n \"account_id\": 123,\n \"amount_payable\": 0,\n \"credit_account_id\": 123,\n \"writeoff_account_id\": 123,\n \"withholding_amount\": 0,\n \"withholding_tax_rate_id\": 123\n }\n ],\n \"credit_memos\": [\n {\n \"credit_memo_id\": 123,\n \"amount\": 0,\n \"posted_at\": \"2023-12-25\"\n }\n ],\n \"debit_memos\": [\n {\n \"debit_memo_id\": 123,\n \"amount\": 0,\n \"posted_at\": \"2023-12-25\"\n }\n ],\n \"empty_transactions\": [\n {\n \"account_id\": 123,\n \"account_name\": \"<string>\",\n \"amount\": 0,\n \"payment_date\": \"2023-12-25\",\n \"department_id\": 123,\n \"tag_ids\": [\n 123\n ],\n \"memo\": \"<string>\",\n \"external_id\": \"<string>\",\n \"currency\": \"<string>\",\n \"amount_in_invoice_currency\": 0,\n \"amount_in_bill_currency\": 0,\n \"withholding_amount\": 0,\n \"withholding_tax_rate_id\": 123\n }\n ]\n}"

response = http.request(request)
puts response.read_body
{
  "id": 123,
  "lines": [
    {
      "id": 123,
      "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,
          "journal_entry": 123
        }
      ],
      "tax_rate_name": "<string>",
      "tax_rate_value": 0,
      "created_at": "2023-11-07T05:31:56Z",
      "last_modified_at": "2023-11-07T05:31:56Z",
      "customer": 123,
      "account": 123,
      "description": "<string>",
      "amount": 0,
      "tax": 0,
      "tax_description": "<string>",
      "tag_ids": [
        0
      ],
      "tag_group_ids": [
        0
      ],
      "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,
      "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,
      "voided_journal_entry": 123
    }
  ],
  "payment_journal_entries": [
    123
  ],
  "status": "<string>",
  "past_due_days": 123,
  "entity_name": "<string>",
  "entity_currency": "<string>",
  "vendor_name": "<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>",
  "paid_date": "2023-12-25",
  "message_on_bill": "<string>",
  "ita_allocation_number": "<string>",
  "source_id": "<string>",
  "source": "<string>",
  "source_bill_data": null,
  "external_ramp_id": "<string>",
  "currency": "<string>",
  "exchange_rate": 0,
  "exchange_rate_book": 0,
  "chat_id": -1,
  "payment_term": 123,
  "journal_entry": 123,
  "source_file": 123,
  "tax_rate": 123,
  "ap_account": 123,
  "voided_journal_entry": 123
}

Authorizations

Authorization
string
header
required

Token-based authentication with required prefix "Token"

Path Parameters

bill_id
integer
required

ID of the bill to mark as paid

Body

transaction_match_id
integer | null
transactions
object[] | null
credit_memos
object[] | null
debit_memos
object[] | null
empty_transactions
object[] | null

Response

200 - application/json
id
integer
required
read-only
lines
object[]
required
payments
object[]
required
read-only
payment_journal_entries
integer[]
required
read-only
status
string
required
read-only
past_due_days
integer | null
required
read-only
entity_name
string
required
read-only
entity_currency
string
required
read-only
vendor_name
string
required
read-only
ap_account_name
string | null
required
read-only

Return AP account name with number in 'number - name' format, similar to name_and_number.

attachments
object[]
required
read-only
total_amount
number<double>
required
read-only
Required range: -1000000000000000000 < x < 1000000000000000000
amount_due
number<double>
required
read-only
amount_paid
number<double>
required
read-only
Required range: -1000000000000000000 < x < 1000000000000000000
voided_date
string<date>
required
read-only
voided_journal_entry_order
string
required
read-only
amortizations
string
required
read-only
last_modified_at
string<date-time>
required
read-only
ramp_use_sandbox
string
required
read-only
navan_region
string | null
required
read-only

Navan 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.

zip_metadata
string
required
read-only
is_deleted
boolean
default:false
required
read-only
deleted_at
string<date-time> | null
required
read-only
payment_term_name
string
required
read-only
withholding_info
object | null
required
read-only

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).

search_vector
string | null
required
read-only
search_text
string | null
required
read-only
bill_number
string
required
Maximum string length: 120
bill_date
string<date>
required
due_date
string<date>
required
created_at
string<date-time>
required
read-only
customer
integer
required
read-only
entity
integer
required
vendor
integer | null
required
item_date
string<date> | null
mailing_address
string | null
terms
  • custom - Custom
  • net_5 - Net 5
  • net_7 - Net 7
  • net_10 - Net 10
  • net_15 - Net 15
  • net_20 - Net 20
  • net_30 - Net 30
  • net_40 - Net 40
  • net_45 - Net 45
  • net_60 - Net 60
  • net_90 - Net 90
  • net_105 - Net 105
  • net_120 - Net 120
  • due_on_receipt - Due on Receipt
Available options:
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
paid_date
string<date> | null
message_on_bill
string | null
ita_allocation_number
string | null
Maximum string length: 9
Pattern: ^\d{9}$
ita_bill_type

Israel tax compliance: bill classification type

  • other - Other
  • equipment - Equipment
Available options:
other,
equipment
source_id
string | null
source
string | null
Maximum string length: 250
source_bill_data
unknown
external_ramp_id
string | null
payment_status
  • partial - Partially Paid
  • open - Open
  • paid - Paid
  • payment_not_found - Payment Not Found
  • payment_pending - Payment Pending
  • voided - Voided
Available options:
partial,
open,
paid,
payment_not_found,
payment_pending,
voided
currency
string
Maximum string length: 3
exchange_rate
number<double> | null
Required range: -100000000000000 < x < 100000000000000
exchange_rate_book
number<double> | null
Required range: -100000000000000 < x < 100000000000000
tax_behavior
  • inclusive - Inclusive
  • exclusive - Exclusive
Available options:
inclusive,
exclusive
bill_type
enum<string>
  • BILL - Bill
  • PAYROLL - Payroll
  • REIMBURSEMENT - Reimbursement
Available options:
BILL,
PAYROLL,
REIMBURSEMENT
chat_id
integer | null
Required range: -2147483648 <= x <= 2147483647
payment_term
integer | null

Payment term for this bill

journal_entry
integer | null
source_file
integer | null
tax_rate
integer | null
ap_account
integer | null

Accounts Payable account for this bill

voided_journal_entry
integer | null