curl --request POST \
--url https://api.meetcampfire.com/coa/api/v1/invoice/{invoice_id}/payment/{payment_id}/void/ \
--header 'Content-Type: application/json' \
--data '
{
"void_date": "2023-12-25"
}
'import requests
url = "https://api.meetcampfire.com/coa/api/v1/invoice/{invoice_id}/payment/{payment_id}/void/"
payload = { "void_date": "2023-12-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({void_date: '2023-12-25'})
};
fetch('https://api.meetcampfire.com/coa/api/v1/invoice/{invoice_id}/payment/{payment_id}/void/', 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/invoice/{invoice_id}/payment/{payment_id}/void/",
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([
'void_date' => '2023-12-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/invoice/{invoice_id}/payment/{payment_id}/void/"
payload := strings.NewReader("{\n \"void_date\": \"2023-12-25\"\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/invoice/{invoice_id}/payment/{payment_id}/void/")
.header("Content-Type", "application/json")
.body("{\n \"void_date\": \"2023-12-25\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetcampfire.com/coa/api/v1/invoice/{invoice_id}/payment/{payment_id}/void/")
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 \"void_date\": \"2023-12-25\"\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"credit_memo": "<string>",
"payment_transaction_bank_description": "<string>",
"payment_journal_entry_order": "<string>",
"payment_intercompany_journal": "<string>",
"voided_journal_entry_order": "<string>",
"withheld_amount": 123,
"created_at": "2023-11-07T05:31:56Z",
"payment_type": "CREDIT_MEMO",
"external_id": "<string>",
"last_modified_at": "2023-11-07T05:31:56Z",
"customer": 123,
"invoice": 123,
"currency": "<string>",
"amount": 0,
"payment_date": "2023-12-25",
"voided_date": "2023-12-25",
"source": "STRIPE",
"payment_journal_entry": 123,
"payment_transaction": 123,
"fx_gain_loss_realized_transaction": 123,
"payment_term_discount_transaction": 123,
"voided_journal_entry": 123,
"payment_transactions": [
123
]
}Void Invoice Payment
Void an existing invoice payment.
This creates a reversing journal entry to void the payment and updates the invoice status. For Stripe payments, this will also process a refund through Stripe.
Optionally accepts a void_date in the request body to specify when the payment should be voided. If not provided, defaults to today’s date.
curl --request POST \
--url https://api.meetcampfire.com/coa/api/v1/invoice/{invoice_id}/payment/{payment_id}/void/ \
--header 'Content-Type: application/json' \
--data '
{
"void_date": "2023-12-25"
}
'import requests
url = "https://api.meetcampfire.com/coa/api/v1/invoice/{invoice_id}/payment/{payment_id}/void/"
payload = { "void_date": "2023-12-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({void_date: '2023-12-25'})
};
fetch('https://api.meetcampfire.com/coa/api/v1/invoice/{invoice_id}/payment/{payment_id}/void/', 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/invoice/{invoice_id}/payment/{payment_id}/void/",
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([
'void_date' => '2023-12-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/invoice/{invoice_id}/payment/{payment_id}/void/"
payload := strings.NewReader("{\n \"void_date\": \"2023-12-25\"\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/invoice/{invoice_id}/payment/{payment_id}/void/")
.header("Content-Type", "application/json")
.body("{\n \"void_date\": \"2023-12-25\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meetcampfire.com/coa/api/v1/invoice/{invoice_id}/payment/{payment_id}/void/")
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 \"void_date\": \"2023-12-25\"\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"credit_memo": "<string>",
"payment_transaction_bank_description": "<string>",
"payment_journal_entry_order": "<string>",
"payment_intercompany_journal": "<string>",
"voided_journal_entry_order": "<string>",
"withheld_amount": 123,
"created_at": "2023-11-07T05:31:56Z",
"payment_type": "CREDIT_MEMO",
"external_id": "<string>",
"last_modified_at": "2023-11-07T05:31:56Z",
"customer": 123,
"invoice": 123,
"currency": "<string>",
"amount": 0,
"payment_date": "2023-12-25",
"voided_date": "2023-12-25",
"source": "STRIPE",
"payment_journal_entry": 123,
"payment_transaction": 123,
"fx_gain_loss_realized_transaction": 123,
"payment_term_discount_transaction": 123,
"voided_journal_entry": 123,
"payment_transactions": [
123
]
}Path Parameters
ID of the invoice
ID of the payment to void
Body
Response
Tax withheld on this payment, or None when withholding was never recorded.
Read from the payment's own withholding records rather than the invoice's, so a voided payment still shows what it originally withheld. A 0% record posts no leg and contributes zero, which is distinct from no withholding at all.
Type of payment: credit memo application, bank transaction, or manual transaction
CREDIT_MEMO- Credit MemoBANK_TRANSACTION- Bank TransactionMANUAL_TRANSACTION- Manual Transaction
CREDIT_MEMO, BANK_TRANSACTION, MANUAL_TRANSACTION Stable upstream identifier for this payment (e.g. Stripe balance transaction 'btxn_...', Stripe credit note 'cn_...', or the mart's event external_id for customer-balance applications). Used as the natural dedup/idempotency key. Null for manually-entered payments.
2563-1000000000000000000 < x < 1000000000000000000STRIPE- StripeMANUAL- ManualNETSUITE- NetSuite
STRIPE, MANUAL, NETSUITE