curl --request POST \
--url https://api.anhome.tuanle.dev/api/v1/invoices/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"room_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"period": "<string>",
"issue": true,
"issue_date": "2023-12-25",
"due_date": "2023-12-25"
}
'import requests
url = "https://api.anhome.tuanle.dev/api/v1/invoices/generate"
payload = {
"room_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"period": "<string>",
"issue": True,
"issue_date": "2023-12-25",
"due_date": "2023-12-25"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
room_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
period: '<string>',
issue: true,
issue_date: '2023-12-25',
due_date: '2023-12-25'
})
};
fetch('https://api.anhome.tuanle.dev/api/v1/invoices/generate', 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.anhome.tuanle.dev/api/v1/invoices/generate",
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([
'room_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'period' => '<string>',
'issue' => true,
'issue_date' => '2023-12-25',
'due_date' => '2023-12-25'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.anhome.tuanle.dev/api/v1/invoices/generate"
payload := strings.NewReader("{\n \"room_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"period\": \"<string>\",\n \"issue\": true,\n \"issue_date\": \"2023-12-25\",\n \"due_date\": \"2023-12-25\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.anhome.tuanle.dev/api/v1/invoices/generate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"room_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"period\": \"<string>\",\n \"issue\": true,\n \"issue_date\": \"2023-12-25\",\n \"due_date\": \"2023-12-25\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.anhome.tuanle.dev/api/v1/invoices/generate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"room_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"period\": \"<string>\",\n \"issue\": true,\n \"issue_date\": \"2023-12-25\",\n \"due_date\": \"2023-12-25\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"property_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"room_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"renter_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"lease_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"period": "<string>",
"invoice_number": "<string>",
"display": {
"status": {
"value": "PARTIALLY_PAID",
"label": "Thanh toán một phần"
}
},
"effective_display": {
"status": {
"value": "PARTIALLY_PAID",
"label": "Thanh toán một phần"
}
},
"due_date": "2023-12-25",
"total_amount": "1500000",
"paid_amount": "0",
"payment_reference": "<string>",
"payment_code": "<string>",
"lines": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"description": "<string>",
"quantity": "1",
"unit_price": "1500000",
"amount": "1500000",
"metadata": "<unknown>",
"display": {
"line_type": {
"value": "PARTIALLY_PAID",
"label": "Thanh toán một phần"
}
}
}
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"already_existed": true,
"issue_date": "2023-12-25",
"cancel_reason": "<string>"
},
"request_id": "<string>",
"meta": {}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}Generate invoice
Generates an invoice for one room and period using rent, utility readings, and configured recurring fees. Idempotent on room and period: a repeated call returns the existing non-cancelled invoice with already_existed = true instead of a conflict.
curl --request POST \
--url https://api.anhome.tuanle.dev/api/v1/invoices/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"room_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"period": "<string>",
"issue": true,
"issue_date": "2023-12-25",
"due_date": "2023-12-25"
}
'import requests
url = "https://api.anhome.tuanle.dev/api/v1/invoices/generate"
payload = {
"room_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"period": "<string>",
"issue": True,
"issue_date": "2023-12-25",
"due_date": "2023-12-25"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
room_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
period: '<string>',
issue: true,
issue_date: '2023-12-25',
due_date: '2023-12-25'
})
};
fetch('https://api.anhome.tuanle.dev/api/v1/invoices/generate', 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.anhome.tuanle.dev/api/v1/invoices/generate",
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([
'room_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'period' => '<string>',
'issue' => true,
'issue_date' => '2023-12-25',
'due_date' => '2023-12-25'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.anhome.tuanle.dev/api/v1/invoices/generate"
payload := strings.NewReader("{\n \"room_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"period\": \"<string>\",\n \"issue\": true,\n \"issue_date\": \"2023-12-25\",\n \"due_date\": \"2023-12-25\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.anhome.tuanle.dev/api/v1/invoices/generate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"room_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"period\": \"<string>\",\n \"issue\": true,\n \"issue_date\": \"2023-12-25\",\n \"due_date\": \"2023-12-25\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.anhome.tuanle.dev/api/v1/invoices/generate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"room_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"period\": \"<string>\",\n \"issue\": true,\n \"issue_date\": \"2023-12-25\",\n \"due_date\": \"2023-12-25\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"property_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"room_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"renter_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"lease_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"period": "<string>",
"invoice_number": "<string>",
"display": {
"status": {
"value": "PARTIALLY_PAID",
"label": "Thanh toán một phần"
}
},
"effective_display": {
"status": {
"value": "PARTIALLY_PAID",
"label": "Thanh toán một phần"
}
},
"due_date": "2023-12-25",
"total_amount": "1500000",
"paid_amount": "0",
"payment_reference": "<string>",
"payment_code": "<string>",
"lines": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"description": "<string>",
"quantity": "1",
"unit_price": "1500000",
"amount": "1500000",
"metadata": "<unknown>",
"display": {
"line_type": {
"value": "PARTIALLY_PAID",
"label": "Thanh toán một phần"
}
}
}
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"already_existed": true,
"issue_date": "2023-12-25",
"cancel_reason": "<string>"
},
"request_id": "<string>",
"meta": {}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}{
"error": {
"message": "<string>",
"request_id": "<string>",
"fields": [
{
"path": "<string>",
"code": "<string>",
"message": "<string>"
}
],
"details": "<unknown>"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Invoice lifecycle or line-item fields used to update invoice totals and status.
Request payload for generate invoice.
UUID identifier for room.
Billing period in YYYY-MM format.
7^\d{4}-\d{2}$When true, generate and issue the invoice in one operation. When false or omitted, the invoice remains DRAFT and issue_date must be omitted.
Optional operational issue date used only when issue is true. If omitted while issuing, the date defaults from billing_settings.billing_day for the billing period.
Optional payment due date for a newly generated invoice. It may be earlier than the lease start date for advance payments, reservations, or deposits. This is not the invoice issue date, legal tax invoice date, or revenue-recognition date.
Response
Generated or existing invoice (idempotent on room and period)
Endpoint-specific response payload. See the referenced schema for the resource fields.
Show child attributes
Show child attributes
Request correlation identifier returned from X-Request-Id or generated by the API.
Optional response metadata such as pagination limits, counts, or export context.