curl --request GET \
--url https://api.gigstack.io/v2/receipts \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.gigstack.io/v2/receipts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.gigstack.io/v2/receipts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"success": true,
"message": "Receipts retrieved successfully",
"data": [
{
"id": "receipt_1234567890",
"client": {
"id": "client_1234567890",
"name": "ESCUELA KEMPER URGATE",
"legal_name": "ESCUELA KEMPER URGATE",
"email": "contabilidad@ejemplo.com",
"bcc": [],
"phone": "+524421234567",
"tax_id": "EKU9003173C9",
"tax_system": "601",
"use": "G03",
"address": {
"street": "Av. Constituyentes",
"exterior": "1000",
"neighborhood": "Centro",
"city": "Querétaro",
"state": "QRO",
"zip": "76000",
"country": "MEX"
},
"is_valid": true,
"efos": {
"is_valid": true
},
"metadata": {},
"livemode": true,
"from": "api",
"owner": "user_1234567890",
"team": "team_1234567890",
"created_at": 1767225600000
},
"currency": "MXN",
"exchange_rate": 1,
"from": "api",
"url": "https://invoicing.gigstack.pro/autofactura?id=receipt_1234567890",
"created_at": 1767225600000,
"invoices": [],
"items": [
{
"id": "service_1234567890",
"description": "Servicios de consultoría profesional",
"quantity": 1,
"unit_price": 1000,
"product_key": "80141503",
"unit_key": "E48",
"unit_name": "Unidad de servicio",
"taxes": [
{
"type": "IVA",
"rate": 0.16,
"factor": "Tasa",
"withholding": false
}
],
"team": "team_1234567890",
"created_at": 1767225600000,
"from": "api"
}
],
"livemode": true,
"metadata": {
"order_id": "ORD-12345"
},
"owner": "user_1234567890",
"payments": [
"payment_1234567890"
],
"periodicity": "month",
"short_url": "https://gigstack.xyz/Rc8vQ2",
"status": "pending",
"team": "team_1234567890",
"valid_until": 1769817600000,
"automatic_invoice_error": null,
"payment_form": "03",
"total": 1160,
"total_refunded": 0,
"subtotal": 1000,
"taxes": 160,
"discount": 0,
"withholding_taxes": 0,
"idempotency_key": "receipt-key-12345"
}
],
"next": null,
"has_more": false,
"total_results": 1,
"timestamp": 1767225600000
}List receipts
Retrieve a paginated list of receipts.
gigstack Connect: View other teams’ receipts using the team parameter.
Filters: only client_id, tax_id and the created[...] range are applied. status, valid_until and
metadata are accepted but ignored — they do not narrow the results. Filter on those fields client-side.
curl --request GET \
--url https://api.gigstack.io/v2/receipts \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.gigstack.io/v2/receipts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.gigstack.io/v2/receipts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"success": true,
"message": "Receipts retrieved successfully",
"data": [
{
"id": "receipt_1234567890",
"client": {
"id": "client_1234567890",
"name": "ESCUELA KEMPER URGATE",
"legal_name": "ESCUELA KEMPER URGATE",
"email": "contabilidad@ejemplo.com",
"bcc": [],
"phone": "+524421234567",
"tax_id": "EKU9003173C9",
"tax_system": "601",
"use": "G03",
"address": {
"street": "Av. Constituyentes",
"exterior": "1000",
"neighborhood": "Centro",
"city": "Querétaro",
"state": "QRO",
"zip": "76000",
"country": "MEX"
},
"is_valid": true,
"efos": {
"is_valid": true
},
"metadata": {},
"livemode": true,
"from": "api",
"owner": "user_1234567890",
"team": "team_1234567890",
"created_at": 1767225600000
},
"currency": "MXN",
"exchange_rate": 1,
"from": "api",
"url": "https://invoicing.gigstack.pro/autofactura?id=receipt_1234567890",
"created_at": 1767225600000,
"invoices": [],
"items": [
{
"id": "service_1234567890",
"description": "Servicios de consultoría profesional",
"quantity": 1,
"unit_price": 1000,
"product_key": "80141503",
"unit_key": "E48",
"unit_name": "Unidad de servicio",
"taxes": [
{
"type": "IVA",
"rate": 0.16,
"factor": "Tasa",
"withholding": false
}
],
"team": "team_1234567890",
"created_at": 1767225600000,
"from": "api"
}
],
"livemode": true,
"metadata": {
"order_id": "ORD-12345"
},
"owner": "user_1234567890",
"payments": [
"payment_1234567890"
],
"periodicity": "month",
"short_url": "https://gigstack.xyz/Rc8vQ2",
"status": "pending",
"team": "team_1234567890",
"valid_until": 1769817600000,
"automatic_invoice_error": null,
"payment_form": "03",
"total": 1160,
"total_refunded": 0,
"subtotal": 1000,
"taxes": 160,
"discount": 0,
"withholding_taxes": 0,
"idempotency_key": "receipt-key-12345"
}
],
"next": null,
"has_more": false,
"total_results": 1,
"timestamp": 1767225600000
}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.
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
Maximum number of items to return (default 10, max 100)
1 <= x <= 100Pagination cursor for the next page of results
Field name to order results by
name, timestamp Sort direction for the results Sort direction for list queries
asc, desc Filter results created on or after this timestamp. Accepts Unix timestamp in seconds (e.g., 1733011200), milliseconds (e.g., 1733011200000), or ISO 8601 date string (e.g., 2024-12-01).
Filter results created on or before this timestamp. Accepts Unix timestamp in seconds (e.g., 1735689599), milliseconds (e.g., 1735689599000), or ISO 8601 date string (e.g., 2024-12-31).
Filter results created after this timestamp. Accepts Unix timestamp in seconds (e.g., 1733011200), milliseconds (e.g., 1733011200000), or ISO 8601 date string (e.g., 2024-12-01).
Filter results created before this timestamp. Accepts Unix timestamp in seconds (e.g., 1735689599), milliseconds (e.g., 1735689599000), or ISO 8601 date string (e.g., 2024-12-31).
Filter results by the gigstack client ID (e.g., client_xxx)
Filter results by the client's tax ID / RFC (e.g., PEGJ800101ABC)
Response
Receipts retrieved successfully
Response shape of the Firestore-backed list handlers. Note this is not the
standardized envelope: data sits at the top level alongside the pagination keys and
message/success/timestamp, rather than under a data wrapper.
A few modules (clients, payments) take a second code path when the request carries
metadata.* / metadata_* filters and the team has Typesense configured: Typesense
resolves the matching ids and the documents are then re-read from Firestore. That path
returns has_more, total_results, page and per_page instead of the cursor-style
next. Modules without a Typesense branch (invoices list, receipts, retentions, users)
only ever return the cursor form.
Full-text /search endpoints are different again — see SearchResponse.
true true
"Items retrieved successfully"
Server time in epoch milliseconds.
1767225600000
Cursor for the next page. Cursor-style (Firestore) path only.
"eyJjcmVhdGVkX2F0IjoxNjc3NjUxMjM0fQ=="
Metadata-filtered (Typesense-assisted) path only.
true
Metadata-filtered (Typesense-assisted) path only.
150
Metadata-filtered (Typesense-assisted) path only.
1
Metadata-filtered (Typesense-assisted) path only.
10