curl --request GET \
--url https://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/entriesimport requests
url = "https://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/entries"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/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://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/entries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/entries"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/entries")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/entries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"items": [
{
"id": "3f9a1c2e-7b4d-4e8a-9c1f-2d5b6a7c8e90",
"identifier": "MONTHLY_PLAN",
"invoice": "0b7c2a44-6f1e-4d3b-9a8e-5c2f1d0e9b7a",
"amount": 15000,
"chargeMethod": "LATER",
"productType": "RECURRENT",
"effectiveAt": "2026-10-01T09:00:00.000Z",
"external": {
"transaction": "6711b4c0d8e1a30012b7c9f2"
},
"description": "Mensalidade do plano Pro",
"status": "OPEN",
"createdBy": "5f0c2b1e-8a3d-4e6f-9b7c-2d1a0e9f8c7b",
"updatedBy": "5f0c2b1e-8a3d-4e6f-9b7c-2d1a0e9f8c7b",
"createdAt": "2026-10-01T09:00:00.000Z",
"updatedAt": "2026-10-01T09:00:00.000Z"
}
],
"next": "NjcxMWI0YzBkOGUxYTMwMDEyYjdjOWYy"
}{
"traceId": "1-68ee2a1b-3c4d5e6f7a8b9c0d1e2f3a4b",
"code": "INSUFFICIENT_PERMISSIONS",
"origin": "BILLING",
"message": "insufficient permissions"
}{
"traceId": "1-68ee2a1b-3c4d5e6f7a8b9c0d1e2f3a4b",
"code": "INVOICE_NOT_FOUND",
"origin": "BILLING",
"message": "invoice not found"
}{
"traceId": "1-68ee2a1b-3c4d5e6f7a8b9c0d1e2f3a4b",
"code": "BAD_REQUEST",
"origin": "BILLING",
"message": "Bad Request: Your request is invalid or incomplete. Please make sure you are requesting with the right fields.",
"fields": [
{
"field": "status",
"message": "Invalid option: expected one of \"OPEN\"|\"DELETED\"",
"code": "STATUS_ONE_OF"
}
]
}List an invoice's entries
Lists the entries of an invoice, newest first: the products and services the payer purchased, which add up to the invoice amount.
curl --request GET \
--url https://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/entriesimport requests
url = "https://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/entries"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/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://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/entries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/entries"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/entries")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.billing.v2.portao3.com.br/realms/{realmId}/organizations/{organizationId}/invoices/{invoiceId}/entries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"items": [
{
"id": "3f9a1c2e-7b4d-4e8a-9c1f-2d5b6a7c8e90",
"identifier": "MONTHLY_PLAN",
"invoice": "0b7c2a44-6f1e-4d3b-9a8e-5c2f1d0e9b7a",
"amount": 15000,
"chargeMethod": "LATER",
"productType": "RECURRENT",
"effectiveAt": "2026-10-01T09:00:00.000Z",
"external": {
"transaction": "6711b4c0d8e1a30012b7c9f2"
},
"description": "Mensalidade do plano Pro",
"status": "OPEN",
"createdBy": "5f0c2b1e-8a3d-4e6f-9b7c-2d1a0e9f8c7b",
"updatedBy": "5f0c2b1e-8a3d-4e6f-9b7c-2d1a0e9f8c7b",
"createdAt": "2026-10-01T09:00:00.000Z",
"updatedAt": "2026-10-01T09:00:00.000Z"
}
],
"next": "NjcxMWI0YzBkOGUxYTMwMDEyYjdjOWYy"
}{
"traceId": "1-68ee2a1b-3c4d5e6f7a8b9c0d1e2f3a4b",
"code": "INSUFFICIENT_PERMISSIONS",
"origin": "BILLING",
"message": "insufficient permissions"
}{
"traceId": "1-68ee2a1b-3c4d5e6f7a8b9c0d1e2f3a4b",
"code": "INVOICE_NOT_FOUND",
"origin": "BILLING",
"message": "invoice not found"
}{
"traceId": "1-68ee2a1b-3c4d5e6f7a8b9c0d1e2f3a4b",
"code": "BAD_REQUEST",
"origin": "BILLING",
"message": "Bad Request: Your request is invalid or incomplete. Please make sure you are requesting with the right fields.",
"fields": [
{
"field": "status",
"message": "Invalid option: expected one of \"OPEN\"|\"DELETED\"",
"code": "STATUS_ONE_OF"
}
]
}OPEN entries. Entries are created automatically from the products of the deal when the invoice is created, and POST .../entries adds more: an on-demand charge for that invoice’s period. Deleted entries stay in the list with status DELETED and no longer count; filter with status.
Read the invoice as its issuer (role=VENDOR, the default) or as its payer (role=BUYER, when your organization is the invoice’s payer). Any member of the organization, or an admin of the realm, can list them. Page with limit + next. With details=true the entries are grouped by identifier instead of listed one by one: see that parameter.Path Parameters
ID of your realm.
Format: UUID
ID of your organization: the one that issued the invoice, or the one that pays it when role is BUYER.
Format: UUID
ID of the invoice whose entries you want to list.
Format: UUID
Query Parameters
Only the entries in this status. OPEN: the ones that count toward the invoice amount. DELETED: the ones that were deleted. Omit it to list both.
OPEN, DELETED Send true (or the bare ?details) to group the entries by identifier, ignoring case, instead of listing each one. Each item then stands for one identifier: its amount is the sum of that identifier's OPEN entries and its createdAt the creation time of one of them. The other fields of a grouped item are placeholders, not the values of its entries, so don't read them.
Your side of the invoice. VENDOR (the default): your organization issued it. BUYER: your organization is the invoice's payer.
VENDOR, BUYER Page size, 1–1000. Defaults to 15.
1 <= x <= 1000Cursor returned as next by the previous page; it must be valid base64. Omit it for the first page. Use it with the same filters.
128^[A-Za-z0-9+/]+={0,2}$