curl --request POST \
--url https://api.gigstack.io/v2/clients/{id}/stamp-pending-receipts \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.gigstack.io/v2/clients/{id}/stamp-pending-receipts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.gigstack.io/v2/clients/{id}/stamp-pending-receipts"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text){
"success": true,
"message": "Stamped 2 receipt(s), 1 failed",
"timestamp": 1767225600000,
"data": {
"stamped": 2,
"failed": 1,
"remaining": 0,
"results": [
{
"id": "receipt_1234567890",
"status": "stamped"
},
{
"id": "receipt_2345678901",
"status": "stamped"
},
{
"id": "receipt_3456789012",
"status": "failed",
"error": "CFDI40147 - El campo UsoCFDI no es válido"
}
]
}
}Stamp pending receipts
Stamp the client’s pending receipts into CFDI invoices.
Batch cap: at most 100 receipts are stamped per call. Receipts are processed
five at a time. If the client has more than 100 pending receipts, call the endpoint
repeatedly until data.remaining reaches 0.
data.remaining is re-counted from Firestore after stamping, so it includes both
receipts beyond the 100-item cap and receipts that failed in this run (they stay
pending).
Fiscal prerequisites. Before stamping anything the handler checks that the client
has an RFC (rfc, falling back to tax_id), a legal name (legal_name, falling back
to name), address.zip, and tax_system. If any is missing it returns 400 with
error.code: client_fiscal_data_incomplete and stamps nothing. email and
address.country are not checked (country defaults to MEX).
gigstack Connect: Stamp other teams’ client receipts using the team parameter.
curl --request POST \
--url https://api.gigstack.io/v2/clients/{id}/stamp-pending-receipts \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.gigstack.io/v2/clients/{id}/stamp-pending-receipts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.gigstack.io/v2/clients/{id}/stamp-pending-receipts"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text){
"success": true,
"message": "Stamped 2 receipt(s), 1 failed",
"timestamp": 1767225600000,
"data": {
"stamped": 2,
"failed": 1,
"remaining": 0,
"results": [
{
"id": "receipt_1234567890",
"status": "stamped"
},
{
"id": "receipt_2345678901",
"status": "stamped"
},
{
"id": "receipt_3456789012",
"status": "failed",
"error": "CFDI40147 - El campo UsoCFDI no es válido"
}
]
}
}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
Client 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
Response
Batch processed. A 200 does not mean every receipt was stamped — inspect
data.failed and data.results. When the client has no pending receipts the
response is still 200, with all counters at 0 and the message
No pending receipts found.
Standardized success envelope emitted by sendSuccessResponse.
true true
The operation payload.
Show child attributes
Show child attributes
Server time in epoch milliseconds (Luxon.now().toMillis()).
1767225600000
Stamped N receipt(s), Stamped N receipt(s), M failed, or No pending receipts found.
"Stamped 2 receipt(s), 1 failed"