Credit Notes
Credit Note Journal Entries
Every ledger posting that references a credit note — its Customer-Credit liability leg, any tax reversal, and refund or write-off legs — each with its debit and credit account.
GET
/
v1
/
credit-notes
/
{id}
/
journal-entries
Credit note journal entries (ledger drill)
curl --request GET \
--url https://billing.example.com/v1/credit-notes/{id}/journal-entries \
--header 'Authorization: Bearer <token>'import requests
url = "https://billing.example.com/v1/credit-notes/{id}/journal-entries"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://billing.example.com/v1/credit-notes/{id}/journal-entries', 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://billing.example.com/v1/credit-notes/{id}/journal-entries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://billing.example.com/v1/credit-notes/{id}/journal-entries"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://billing.example.com/v1/credit-notes/{id}/journal-entries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://billing.example.com/v1/credit-notes/{id}/journal-entries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"credit_note_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"entries": [
{
"transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z",
"code": 123,
"debit_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"debit_account_code": 123,
"debit_account_name": "<string>",
"credit_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"credit_account_code": 123,
"credit_account_name": "<string>",
"amount": 123,
"reference_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"description": "<string>",
"accounting_version": 123
}
]
}
}Returns every ledger posting that references this credit note: its
Customer-Credit liability leg, any tax reversal, and refund or write-off legs.
Each entry is one balanced transfer — a debit account and a credit account
(id, code, and name), an amount in minor units, its posting code, and a
timestamp. This is the finance-accounting side of the credit-note page, and the
same shape as Invoice Journal Entries.
Account ids deep-link each leg to its ledger account;
transaction_id links
to the journal entry itself. See
Explain any number for the wider picture.
Example Request
curl "https://api.recurso.dev/v1/credit-notes/8d1f3a6b-2c4e-4f70-9a1b-5c6d7e8f9a0b/journal-entries" \
-H "Authorization: Bearer $API_KEY"
Example Response
{
"data": {
"credit_note_id": "8d1f3a6b-2c4e-4f70-9a1b-5c6d7e8f9a0b",
"entries": [
{
"transaction_id": "5f8c2b96-1d4e-4a7c-9b3f-6e0a8d2c4f17",
"timestamp": "2026-08-01T09:00:00Z",
"code": 8,
"debit_account_id": "f6a4b0c3-8d5e-4ebf-a091-4c7d1e5f3a68",
"debit_account_code": 5100,
"debit_account_name": "Credits & Adjustments",
"credit_account_id": "a7b5c1d4-9e6f-4fc0-b1a2-5d8e2f6a4b79",
"credit_account_code": 2300,
"credit_account_name": "Customer Credit",
"amount": 5000,
"reference_id": "8d1f3a6b-2c4e-4f70-9a1b-5c6d7e8f9a0b",
"description": "Adjustment credit issued",
"accounting_version": 1
},
{
"transaction_id": "7d2b9f41-8c3e-4a5d-b6f0-1e4a7c9d2b58",
"timestamp": "2026-08-15T00:10:00Z",
"code": 7,
"debit_account_id": "a7b5c1d4-9e6f-4fc0-b1a2-5d8e2f6a4b79",
"debit_account_code": 2300,
"debit_account_name": "Customer Credit",
"credit_account_id": "b3a1c9e7-2f4d-4a8b-9c6e-1d5f7a2b8c30",
"credit_account_code": 1100,
"credit_account_name": "Accounts Receivable",
"amount": 500,
"reference_id": "8d1f3a6b-2c4e-4f70-9a1b-5c6d7e8f9a0b",
"description": "Credit applied to invoice",
"accounting_version": 1
}
]
}
}
Entry Fields
| Field | Type | Description |
|---|---|---|
transaction_id | string (uuid) | The posted transaction — fetch it with Get Journal Entry |
timestamp | string (date-time) | When the leg was posted |
code | integer | Posting code — see posting codes |
debit_account_id / debit_account_code / debit_account_name | uuid / integer / string | The debit side of the transfer; the id deep-links to the ledger account |
credit_account_id / credit_account_code / credit_account_name | uuid / integer / string | The credit side of the transfer |
amount | integer (int64) | Minor units |
reference_id | string (uuid) | The business object that caused the posting |
description | string | Human-readable posting description |
accounting_version | integer | Posting-semantics version the leg was written under |
Read-only. An existing credit note with no postings yet returns an empty
entries list. A missing or cross-tenant id returns 404.⌘I
Credit note journal entries (ledger drill)
curl --request GET \
--url https://billing.example.com/v1/credit-notes/{id}/journal-entries \
--header 'Authorization: Bearer <token>'import requests
url = "https://billing.example.com/v1/credit-notes/{id}/journal-entries"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://billing.example.com/v1/credit-notes/{id}/journal-entries', 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://billing.example.com/v1/credit-notes/{id}/journal-entries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://billing.example.com/v1/credit-notes/{id}/journal-entries"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://billing.example.com/v1/credit-notes/{id}/journal-entries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://billing.example.com/v1/credit-notes/{id}/journal-entries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"credit_note_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"entries": [
{
"transaction_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z",
"code": 123,
"debit_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"debit_account_code": 123,
"debit_account_name": "<string>",
"credit_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"credit_account_code": 123,
"credit_account_name": "<string>",
"amount": 123,
"reference_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"description": "<string>",
"accounting_version": 123
}
]
}
}