Update an invoice template
curl --request PATCH \
--url https://app.orgo.space/api/v1/invoice_templates/{id} \
--header 'Api-Token: <api-key>' \
--header 'Content-Type: application/merge-patch+json' \
--data '
{
"tenant": "/api/v1/tenants/1",
"name": "Boston Chapter",
"taxName": "Boston Chapter",
"taxValue": 42,
"memo": "string",
"footer": "string",
"customFields": [
"string"
],
"internalNotes": "Joined via the Boston outreach drive on 2026-01-10.",
"isDefault": true
}
'import requests
url = "https://app.orgo.space/api/v1/invoice_templates/{id}"
payload = {
"tenant": "/api/v1/tenants/1",
"name": "Boston Chapter",
"taxName": "Boston Chapter",
"taxValue": 42,
"memo": "string",
"footer": "string",
"customFields": ["string"],
"internalNotes": "Joined via the Boston outreach drive on 2026-01-10.",
"isDefault": True
}
headers = {
"Api-Token": "<api-key>",
"Content-Type": "application/merge-patch+json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'Api-Token': '<api-key>', 'Content-Type': 'application/merge-patch+json'},
body: JSON.stringify({
tenant: '/api/v1/tenants/1',
name: 'Boston Chapter',
taxName: 'Boston Chapter',
taxValue: 42,
memo: 'string',
footer: 'string',
customFields: ['string'],
internalNotes: 'Joined via the Boston outreach drive on 2026-01-10.',
isDefault: true
})
};
fetch('https://app.orgo.space/api/v1/invoice_templates/{id}', 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://app.orgo.space/api/v1/invoice_templates/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'tenant' => '/api/v1/tenants/1',
'name' => 'Boston Chapter',
'taxName' => 'Boston Chapter',
'taxValue' => 42,
'memo' => 'string',
'footer' => 'string',
'customFields' => [
'string'
],
'internalNotes' => 'Joined via the Boston outreach drive on 2026-01-10.',
'isDefault' => true
]),
CURLOPT_HTTPHEADER => [
"Api-Token: <api-key>",
"Content-Type: application/merge-patch+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://app.orgo.space/api/v1/invoice_templates/{id}"
payload := strings.NewReader("{\n \"tenant\": \"/api/v1/tenants/1\",\n \"name\": \"Boston Chapter\",\n \"taxName\": \"Boston Chapter\",\n \"taxValue\": 42,\n \"memo\": \"string\",\n \"footer\": \"string\",\n \"customFields\": [\n \"string\"\n ],\n \"internalNotes\": \"Joined via the Boston outreach drive on 2026-01-10.\",\n \"isDefault\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Api-Token", "<api-key>")
req.Header.Add("Content-Type", "application/merge-patch+json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://app.orgo.space/api/v1/invoice_templates/{id}")
.header("Api-Token", "<api-key>")
.header("Content-Type", "application/merge-patch+json")
.body("{\n \"tenant\": \"/api/v1/tenants/1\",\n \"name\": \"Boston Chapter\",\n \"taxName\": \"Boston Chapter\",\n \"taxValue\": 42,\n \"memo\": \"string\",\n \"footer\": \"string\",\n \"customFields\": [\n \"string\"\n ],\n \"internalNotes\": \"Joined via the Boston outreach drive on 2026-01-10.\",\n \"isDefault\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.orgo.space/api/v1/invoice_templates/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Api-Token"] = '<api-key>'
request["Content-Type"] = 'application/merge-patch+json'
request.body = "{\n \"tenant\": \"/api/v1/tenants/1\",\n \"name\": \"Boston Chapter\",\n \"taxName\": \"Boston Chapter\",\n \"taxValue\": 42,\n \"memo\": \"string\",\n \"footer\": \"string\",\n \"customFields\": [\n \"string\"\n ],\n \"internalNotes\": \"Joined via the Boston outreach drive on 2026-01-10.\",\n \"isDefault\": true\n}"
response = http.request(request)
puts response.read_body{
"id": 42,
"name": "Boston Chapter",
"taxName": "Boston Chapter",
"taxValue": 42,
"memo": "string",
"footer": "string",
"customFields": [
"string"
],
"internalNotes": "Joined via the Boston outreach drive on 2026-01-10.",
"isDefault": true,
"dateCreated": "2026-01-15T10:30:00+00:00",
"dateUpdated": "2026-01-15T10:30:00+00:00"
}InvoiceTemplate
Update an invoice template
Updates an existing invoice template. If isDefault is set to true, all other templates for the tenant are unset as default. Enforces tenant isolation. Requires ADMIN_TENANT permission.
PATCH
/
api
/
v1
/
invoice_templates
/
{id}
Update an invoice template
curl --request PATCH \
--url https://app.orgo.space/api/v1/invoice_templates/{id} \
--header 'Api-Token: <api-key>' \
--header 'Content-Type: application/merge-patch+json' \
--data '
{
"tenant": "/api/v1/tenants/1",
"name": "Boston Chapter",
"taxName": "Boston Chapter",
"taxValue": 42,
"memo": "string",
"footer": "string",
"customFields": [
"string"
],
"internalNotes": "Joined via the Boston outreach drive on 2026-01-10.",
"isDefault": true
}
'import requests
url = "https://app.orgo.space/api/v1/invoice_templates/{id}"
payload = {
"tenant": "/api/v1/tenants/1",
"name": "Boston Chapter",
"taxName": "Boston Chapter",
"taxValue": 42,
"memo": "string",
"footer": "string",
"customFields": ["string"],
"internalNotes": "Joined via the Boston outreach drive on 2026-01-10.",
"isDefault": True
}
headers = {
"Api-Token": "<api-key>",
"Content-Type": "application/merge-patch+json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'Api-Token': '<api-key>', 'Content-Type': 'application/merge-patch+json'},
body: JSON.stringify({
tenant: '/api/v1/tenants/1',
name: 'Boston Chapter',
taxName: 'Boston Chapter',
taxValue: 42,
memo: 'string',
footer: 'string',
customFields: ['string'],
internalNotes: 'Joined via the Boston outreach drive on 2026-01-10.',
isDefault: true
})
};
fetch('https://app.orgo.space/api/v1/invoice_templates/{id}', 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://app.orgo.space/api/v1/invoice_templates/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'tenant' => '/api/v1/tenants/1',
'name' => 'Boston Chapter',
'taxName' => 'Boston Chapter',
'taxValue' => 42,
'memo' => 'string',
'footer' => 'string',
'customFields' => [
'string'
],
'internalNotes' => 'Joined via the Boston outreach drive on 2026-01-10.',
'isDefault' => true
]),
CURLOPT_HTTPHEADER => [
"Api-Token: <api-key>",
"Content-Type: application/merge-patch+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://app.orgo.space/api/v1/invoice_templates/{id}"
payload := strings.NewReader("{\n \"tenant\": \"/api/v1/tenants/1\",\n \"name\": \"Boston Chapter\",\n \"taxName\": \"Boston Chapter\",\n \"taxValue\": 42,\n \"memo\": \"string\",\n \"footer\": \"string\",\n \"customFields\": [\n \"string\"\n ],\n \"internalNotes\": \"Joined via the Boston outreach drive on 2026-01-10.\",\n \"isDefault\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Api-Token", "<api-key>")
req.Header.Add("Content-Type", "application/merge-patch+json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://app.orgo.space/api/v1/invoice_templates/{id}")
.header("Api-Token", "<api-key>")
.header("Content-Type", "application/merge-patch+json")
.body("{\n \"tenant\": \"/api/v1/tenants/1\",\n \"name\": \"Boston Chapter\",\n \"taxName\": \"Boston Chapter\",\n \"taxValue\": 42,\n \"memo\": \"string\",\n \"footer\": \"string\",\n \"customFields\": [\n \"string\"\n ],\n \"internalNotes\": \"Joined via the Boston outreach drive on 2026-01-10.\",\n \"isDefault\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.orgo.space/api/v1/invoice_templates/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Api-Token"] = '<api-key>'
request["Content-Type"] = 'application/merge-patch+json'
request.body = "{\n \"tenant\": \"/api/v1/tenants/1\",\n \"name\": \"Boston Chapter\",\n \"taxName\": \"Boston Chapter\",\n \"taxValue\": 42,\n \"memo\": \"string\",\n \"footer\": \"string\",\n \"customFields\": [\n \"string\"\n ],\n \"internalNotes\": \"Joined via the Boston outreach drive on 2026-01-10.\",\n \"isDefault\": true\n}"
response = http.request(request)
puts response.read_body{
"id": 42,
"name": "Boston Chapter",
"taxName": "Boston Chapter",
"taxValue": 42,
"memo": "string",
"footer": "string",
"customFields": [
"string"
],
"internalNotes": "Joined via the Boston outreach drive on 2026-01-10.",
"isDefault": true,
"dateCreated": "2026-01-15T10:30:00+00:00",
"dateUpdated": "2026-01-15T10:30:00+00:00"
}Authorizations
ApiTokenJWT
Server-to-server authentication. Generate a token in the admin UI at
Settings → Developers → API Access. Send the raw token in the
Api-Token header — there is no Bearer prefix.
Tokens can be marked read-only at creation time, in which case the API
rejects any non-GET request with 403 Forbidden.
Path Parameters
InvoiceTemplate identifier
Body
application/merge-patch+json
The updated InvoiceTemplate resource
Response
InvoiceTemplate resource updated
⌘I

