curl --request POST \
--url https://api.meetcampfire.com/coa/api/transaction/merge \
--header 'Content-Type: application/json' \
--data '
{
"transaction_ids": [
12345,
67890
],
"transaction_match_id": 123
}
'import requests
url = "https://api.meetcampfire.com/coa/api/transaction/merge"
payload = {
"transaction_ids": [12345, 67890],
"transaction_match_id": 123
}
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({transaction_ids: [12345, 67890], transaction_match_id: 123})
};
fetch('https://api.meetcampfire.com/coa/api/transaction/merge', 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/transaction/merge",
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_ids' => [
12345,
67890
],
'transaction_match_id' => 123
]),
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/transaction/merge"
payload := strings.NewReader("{\n \"transaction_ids\": [\n 12345,\n 67890\n ],\n \"transaction_match_id\": 123\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/transaction/merge")
.header("Content-Type", "application/json")
.body("{\n \"transaction_ids\": [\n 12345,\n 67890\n ],\n \"transaction_match_id\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetcampfire.com/coa/api/transaction/merge")
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 \"transaction_ids\": [\n 12345,\n 67890\n ],\n \"transaction_match_id\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"is_deleted": false,
"deleted_at": "2023-11-07T05:31:56Z",
"transactions": [
{
"id": 123,
"is_deleted": false,
"deleted_at": "2023-11-07T05:31:56Z",
"entity_name": "<string>",
"entity_currency": "<string>",
"account_name": "<string>",
"account_number": "<string>",
"vendor_name": "<string>",
"vendor_id": "<string>",
"vendor_campfire_id": "<string>",
"department_name": "<string>",
"department_code": "<string>",
"parent_department_name": "<string>",
"parent_department": 123,
"tags": [
{
"id": 123,
"group_name": "<string>",
"parent_name": "<string>",
"is_deleted": false,
"deleted_at": "2023-11-07T05:31:56Z",
"name": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"last_modified_at": "2023-11-07T05:31:56Z",
"customer": 123,
"parent": 123,
"is_active": true,
"group": 123
}
],
"journal": 123,
"journal_order": "<string>",
"journal_memo": "<string>",
"journal_type": "<string>",
"intercompany_journal": 123,
"created_automatically": true,
"journal_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
}
],
"journal_type_name": "<string>",
"invoice": "<string>",
"bill": "<string>",
"date_month": "<string>",
"date_year": "<string>",
"balance_after_transaction": 123,
"bank_account": "<string>",
"bank_account_name": "<string>",
"last_modified_by_name": "<string>",
"account_type": "<string>",
"account_subtype": "<string>",
"parent_account_name": "<string>",
"files": "<string>",
"invoice_id": 123,
"invoice_number": "<string>",
"bill_id": 123,
"bill_number": "<string>",
"file_names": "<string>",
"has_matches": true,
"has_ai": true,
"has_rules": true,
"has_merges": true,
"has_fixed_asset_rule_matches": true,
"has_suggested_rule": true,
"suggested_rule_account_name": "<string>",
"primary_action_type": "<string>",
"suggested_account": 123,
"suggested_account_name": "<string>",
"suggested_account_number": "<string>",
"amount": 0,
"amount_native": 0,
"amount_book": 0,
"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
}
],
"linked_amortizations": [
{}
],
"created_fixed_assets": [
{}
],
"reconciliation_report": "<string>",
"opposing_account_name": "<string>",
"opposing_account_number": "<string>",
"transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"balance_before_transaction": 0,
"created_at": "2023-11-07T05:31:56Z",
"producer": "<string>",
"warehouse_row_key": "<string>",
"last_modified_at": "2023-11-07T05:31:56Z",
"source_group": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"customer": 123,
"entity": 123,
"counterparty_entity": 123,
"cost_allocation": 123,
"last_sync_run": 123,
"account": 123,
"debit_amount": 0,
"credit_amount": 0,
"debit_amount_book": 0,
"credit_amount_book": 0,
"debit_amount_native": 0,
"credit_amount_native": 0,
"currency": "<string>",
"exchange_rate": 0,
"exchange_rate_book": 0,
"posted_at": "2023-12-25",
"merchant_name": "<string>",
"bank_description": "<string>",
"tag_ids": [
0
],
"tag_group_ids": [
0
],
"note": "<string>",
"receipt_url": "<string>",
"external_id": "<string>",
"needs_review": true,
"draft_matches": null,
"last_lam_prediction_attempt": "2023-11-07T05:31:56Z",
"source_entity": 123,
"parent_bank_transaction": 123,
"vendor": 123,
"department": 123,
"last_modified_by": 123
}
],
"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
}
],
"invoice": 123,
"reversal_of_order": "<string>",
"reversals": [
{}
],
"entity_name": "<string>",
"entity_currency": "<string>",
"created_by": 123,
"created_by_name": "<string>",
"created_by_source": "<string>",
"credit_memos": [
{}
],
"debit_memos": [
{}
],
"ramp_use_sandbox": true,
"navan_region": "<string>",
"float_bill_id": "<string>",
"linked_source_documents": [
{}
],
"search_vector": "<string>",
"search_text": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"last_modified_at": "2023-11-07T05:31:56Z",
"customer": 123,
"last_draft": 123,
"order": "<string>",
"close_task_id": "<string>",
"type": "bill",
"journal_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"memo": "<string>",
"currency": "<string>",
"exchange_rate": 0,
"exchange_rate_book": 0,
"use_average_rate": true,
"created_automatically": true,
"date": "2023-12-25",
"ref_number": "<string>",
"source": "<string>",
"source_id": "<string>",
"recurrent_journal_entry": 123,
"entity": 123,
"reversal_of": 123,
"intercompany_journal": 123,
"source_file": 123,
"chat": 123
}"<unknown>"Merge Chart Transactions
Merge two offsetting chart transactions from different journals.
This endpoint consolidates journals containing offsetting transactions by removing the specified transactions and combining the remaining transactions into a single journal entry.
Request Body:
transaction_ids(array, required): Array of exactly two transaction IDs to mergetransaction_match_id(integer, optional): The AutoMergeSuggestion TransactionMatch the user explicitly accepted; when it names a suggestion over exactly this pair, the merge is recorded as a suggestion accept rather than a manual merge
Returns: The merged journal entry with all remaining transactions.
Requirements:
- Must provide exactly two transaction IDs
- Transactions must be from different journals
- Transactions must have matching amounts
- Transactions must belong to the same entity
Result:
- The two specified transactions are deleted
- Other transactions from both journals are consolidated into a single journal
- A draft queue record is created for audit purposes and auto-approved
curl --request POST \
--url https://api.meetcampfire.com/coa/api/transaction/merge \
--header 'Content-Type: application/json' \
--data '
{
"transaction_ids": [
12345,
67890
],
"transaction_match_id": 123
}
'import requests
url = "https://api.meetcampfire.com/coa/api/transaction/merge"
payload = {
"transaction_ids": [12345, 67890],
"transaction_match_id": 123
}
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({transaction_ids: [12345, 67890], transaction_match_id: 123})
};
fetch('https://api.meetcampfire.com/coa/api/transaction/merge', 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/transaction/merge",
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_ids' => [
12345,
67890
],
'transaction_match_id' => 123
]),
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/transaction/merge"
payload := strings.NewReader("{\n \"transaction_ids\": [\n 12345,\n 67890\n ],\n \"transaction_match_id\": 123\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/transaction/merge")
.header("Content-Type", "application/json")
.body("{\n \"transaction_ids\": [\n 12345,\n 67890\n ],\n \"transaction_match_id\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetcampfire.com/coa/api/transaction/merge")
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 \"transaction_ids\": [\n 12345,\n 67890\n ],\n \"transaction_match_id\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"is_deleted": false,
"deleted_at": "2023-11-07T05:31:56Z",
"transactions": [
{
"id": 123,
"is_deleted": false,
"deleted_at": "2023-11-07T05:31:56Z",
"entity_name": "<string>",
"entity_currency": "<string>",
"account_name": "<string>",
"account_number": "<string>",
"vendor_name": "<string>",
"vendor_id": "<string>",
"vendor_campfire_id": "<string>",
"department_name": "<string>",
"department_code": "<string>",
"parent_department_name": "<string>",
"parent_department": 123,
"tags": [
{
"id": 123,
"group_name": "<string>",
"parent_name": "<string>",
"is_deleted": false,
"deleted_at": "2023-11-07T05:31:56Z",
"name": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"last_modified_at": "2023-11-07T05:31:56Z",
"customer": 123,
"parent": 123,
"is_active": true,
"group": 123
}
],
"journal": 123,
"journal_order": "<string>",
"journal_memo": "<string>",
"journal_type": "<string>",
"intercompany_journal": 123,
"created_automatically": true,
"journal_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
}
],
"journal_type_name": "<string>",
"invoice": "<string>",
"bill": "<string>",
"date_month": "<string>",
"date_year": "<string>",
"balance_after_transaction": 123,
"bank_account": "<string>",
"bank_account_name": "<string>",
"last_modified_by_name": "<string>",
"account_type": "<string>",
"account_subtype": "<string>",
"parent_account_name": "<string>",
"files": "<string>",
"invoice_id": 123,
"invoice_number": "<string>",
"bill_id": 123,
"bill_number": "<string>",
"file_names": "<string>",
"has_matches": true,
"has_ai": true,
"has_rules": true,
"has_merges": true,
"has_fixed_asset_rule_matches": true,
"has_suggested_rule": true,
"suggested_rule_account_name": "<string>",
"primary_action_type": "<string>",
"suggested_account": 123,
"suggested_account_name": "<string>",
"suggested_account_number": "<string>",
"amount": 0,
"amount_native": 0,
"amount_book": 0,
"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
}
],
"linked_amortizations": [
{}
],
"created_fixed_assets": [
{}
],
"reconciliation_report": "<string>",
"opposing_account_name": "<string>",
"opposing_account_number": "<string>",
"transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"balance_before_transaction": 0,
"created_at": "2023-11-07T05:31:56Z",
"producer": "<string>",
"warehouse_row_key": "<string>",
"last_modified_at": "2023-11-07T05:31:56Z",
"source_group": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"customer": 123,
"entity": 123,
"counterparty_entity": 123,
"cost_allocation": 123,
"last_sync_run": 123,
"account": 123,
"debit_amount": 0,
"credit_amount": 0,
"debit_amount_book": 0,
"credit_amount_book": 0,
"debit_amount_native": 0,
"credit_amount_native": 0,
"currency": "<string>",
"exchange_rate": 0,
"exchange_rate_book": 0,
"posted_at": "2023-12-25",
"merchant_name": "<string>",
"bank_description": "<string>",
"tag_ids": [
0
],
"tag_group_ids": [
0
],
"note": "<string>",
"receipt_url": "<string>",
"external_id": "<string>",
"needs_review": true,
"draft_matches": null,
"last_lam_prediction_attempt": "2023-11-07T05:31:56Z",
"source_entity": 123,
"parent_bank_transaction": 123,
"vendor": 123,
"department": 123,
"last_modified_by": 123
}
],
"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
}
],
"invoice": 123,
"reversal_of_order": "<string>",
"reversals": [
{}
],
"entity_name": "<string>",
"entity_currency": "<string>",
"created_by": 123,
"created_by_name": "<string>",
"created_by_source": "<string>",
"credit_memos": [
{}
],
"debit_memos": [
{}
],
"ramp_use_sandbox": true,
"navan_region": "<string>",
"float_bill_id": "<string>",
"linked_source_documents": [
{}
],
"search_vector": "<string>",
"search_text": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"last_modified_at": "2023-11-07T05:31:56Z",
"customer": 123,
"last_draft": 123,
"order": "<string>",
"close_task_id": "<string>",
"type": "bill",
"journal_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"memo": "<string>",
"currency": "<string>",
"exchange_rate": 0,
"exchange_rate_book": 0,
"use_average_rate": true,
"created_automatically": true,
"date": "2023-12-25",
"ref_number": "<string>",
"source": "<string>",
"source_id": "<string>",
"recurrent_journal_entry": 123,
"entity": 123,
"reversal_of": 123,
"intercompany_journal": 123,
"source_file": 123,
"chat": 123
}"<unknown>"Body
Response
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Derived user ID of the journal entry creator. Check created_by_source before explaining provenance.
Derived name of the journal entry creator. Check created_by_source before explaining provenance.
Provenance for created_by and created_by_name: 'draft_queue_created_by', 'chart_transaction_last_modified_by_fallback', or null.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Navan data region (US/EU) for a Navan-sourced journal entry, 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 records carry no FK to
their connection, so the region is resolved per customer and memoized to
avoid an N+1 lookup across a transaction list.
Float id of the bill paid by a Float bill-payment journal entry, else None.
Payment journal entries store the Float payment id as source_id, which has
no page of its own in Float's web app — the frontend deep-links "View on Float"
to the paid bill instead.
Documents this journal is posted from; deleting it deletes them too.
Show child attributes
Show child attributes
bill- Billbill_payment- Bill Paymentbill_prepayment- Bill Prepaymentcheck- Checkcheck_cleared- Check Clearedcredit_card- Credit Cardcredit_memo- Credit Memocredit_memo_payment- Credit Memo Paymentdebit_memo- Debit Memodebit_memo_payment- Debit Memo Paymentdeposit- Depositexpense- Expenseinvoice- Invoiceintercompany_journal- Intercompany Journalinvoice_payment- Invoice Paymentjournal_entry- Journal Entrylease- Leasepayment- Paymentreceive_payment- Receive Paymentrefund- Refundrevenue_recognition- Revenue Recognitionsales_receipt- Sales Receipttransfer- Transfervendor_credit- Vendor Creditvoid_bill- Void Billvoid_bill_payment- Void Bill Paymentvoid_invoice_payment- Void Invoice Paymentvoid_credit_memo- Void Credit Memovoid_credit_memo_payment- Void Credit Memo Paymentvoid_debit_memo_payment- Void Debit Memo Paymentvoid_invoice- Void Invoiceelimination- Eliminationrevaluation- Revaluationasset_reclassification- Asset Reclassificationstatistical_allocation- Statistical Allocationallocation_true_up- Allocation True-Upasset_impairment- Asset Impairment
bill, bill_payment, bill_prepayment, check, check_cleared, credit_card, credit_memo, credit_memo_payment, debit_memo, debit_memo_payment, deposit, expense, invoice, intercompany_journal, invoice_payment, journal_entry, lease, payment, receive_payment, refund, revenue_recognition, sales_receipt, transfer, vendor_credit, void_bill, void_bill_payment, void_invoice_payment, void_credit_memo, void_credit_memo_payment, void_debit_memo_payment, void_invoice, elimination, revaluation, asset_reclassification, statistical_allocation, allocation_true_up, asset_impairment 3-100000000000000 < x < 100000000000000-100000000000000 < x < 100000000000000100250