curl --request PUT \
--url https://api.gigstack.io/v2/invoices/{id}/pdf-details \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"note": "Licencias para 7 colaboradores, vigencia 12 meses"
}
],
"pdf_fields": [
{
"label": "Número de compra",
"value": "OC-1042"
}
]
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
items: [{note: 'Licencias para 7 colaboradores, vigencia 12 meses'}],
pdf_fields: [{label: 'Número de compra', value: 'OC-1042'}]
})
};
fetch('https://api.gigstack.io/v2/invoices/{id}/pdf-details', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.gigstack.io/v2/invoices/{id}/pdf-details"
payload = {
"items": [{ "note": "Licencias para 7 colaboradores, vigencia 12 meses" }],
"pdf_fields": [
{
"label": "Número de compra",
"value": "OC-1042"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text){
"id": "<string>",
"items": [
{
"note": "<string>"
}
],
"pdf_fields": [
{
"label": "<string>",
"value": "<string>"
}
],
"pdf_regenerated": true,
"pdf_message": "<string>"
}Edit an invoice's PDF notes and fields (Colombia)
Colombia (DIAN) only. Edits what the PDF prints that is not fiscal: the note under each item and
the invoice’s pdf_fields (label/value pairs such as a purchase order number). The stamped document
is not touched: nothing is sent to Factus or the DIAN.
When the team uses the PDF gigstack draws, the stored PDF (the one emails and the portal serve) is
drawn again from the stamped XML and pdf_regenerated is true. Downloads always draw the current
details.
itemslines up with the invoice’s items by position and must have one entry per item. Anullor emptynoteremoves that item’s note.pdf_fieldsreplaces the invoice’s fields;nullor[]removes them. An entry with the same label as a team-wide field replaces its value, and an empty value hides it on this invoice.
Send items, pdf_fields, or both.
curl --request PUT \
--url https://api.gigstack.io/v2/invoices/{id}/pdf-details \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"note": "Licencias para 7 colaboradores, vigencia 12 meses"
}
],
"pdf_fields": [
{
"label": "Número de compra",
"value": "OC-1042"
}
]
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
items: [{note: 'Licencias para 7 colaboradores, vigencia 12 meses'}],
pdf_fields: [{label: 'Número de compra', value: 'OC-1042'}]
})
};
fetch('https://api.gigstack.io/v2/invoices/{id}/pdf-details', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.gigstack.io/v2/invoices/{id}/pdf-details"
payload = {
"items": [{ "note": "Licencias para 7 colaboradores, vigencia 12 meses" }],
"pdf_fields": [
{
"label": "Número de compra",
"value": "OC-1042"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text){
"id": "<string>",
"items": [
{
"note": "<string>"
}
],
"pdf_fields": [
{
"label": "<string>",
"value": "<string>"
}
],
"pdf_regenerated": true,
"pdf_message": "<string>"
}Authorizations
Authentication Method: HTTP Bearer token.
The runtime requires the literal Bearer prefix — a bare token in the
Authorization header is rejected with 401 unauthorized.
Header Format: Authorization: Bearer YOUR_API_KEY
Your API key is a JWT. Live keys operate on live data (livemode: true);
test keys operate on isolated test data (livemode: false).
Get your key at: app.gigstack.pro/settings?tab=api
Errors: credential failures are answered by the authentication layer with a raw
{ "message": … } body, not the standardized envelope — 401 for a missing, malformed or
expired token, 403 for a revoked key or a plan without API access. See the Unauthorized
and AuthForbidden responses.
Path Parameters
gigstack invoice ID
Query Parameters
gigstack Connect: Target team ID for multi-team access.
Requires gigstack Connect enabled on your team and shared billing account.
Also requires the multipleIssuerAccounts feature on your plan. Requests targeting a
team other than the one your API key belongs to return 403 without it.
Only API keys can use it: an OAuth access token sent with another team's id is rejected with
403 Team mismatch with OAuth token.
Optional — omit it entirely unless you are acting on another team. It deliberately
carries no example value so generated snippets do not emit ?team=undefined; when the
parameter is absent, the team is derived from your API key.
Example: ?team=team_xyz789