curl --request GET \
--url https://api.gigstack.io/v2/invoices/download/progress \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.gigstack.io/v2/invoices/download/progress', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.gigstack.io/v2/invoices/download/progress"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"success": true,
"data": {
"registered": true,
"provider": {
"percent": 34.7,
"covered_through": "2022-10-13",
"months_remaining": 46.5,
"current": false,
"stalled": false,
"enabled": true,
"eta_at": 1790000000000,
"updated_at": 1767225600000
},
"stored": {
"total": 18234
}
}
}Get SAT history sync progress
Availability: This operation has no configured public API gateway route and is not available through the documented base URL.
Reports how far the SAT has handed over your invoice history.
The SAT does not deliver a history all at once. It is backfilled forward from your sync start date in month-sized windows, and until that reaches the present, a query for a recent date range succeeds and returns nothing — identical to genuinely having no invoices. This endpoint is how you tell those apart.
Fields:
| Field | Meaning |
|---|---|
percent | How much of the requested history has arrived |
covered_through | Last date the backfill has reached |
months_remaining | Roughly how much history is still pending |
current | History is close enough to the present to be usable |
stalled | Backfill has not advanced in over two days |
enabled | Sync is active. When false it will not advance on its own |
eta_at | Projected completion, epoch ms. Omitted while stalled, since a stopped sync has no meaningful estimate |
Values are refreshed periodically in the background. Pass refresh=true to recompute against the provider, which takes a few seconds.
curl --request GET \
--url https://api.gigstack.io/v2/invoices/download/progress \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.gigstack.io/v2/invoices/download/progress', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.gigstack.io/v2/invoices/download/progress"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"success": true,
"data": {
"registered": true,
"provider": {
"percent": 34.7,
"covered_through": "2022-10-13",
"months_remaining": 46.5,
"current": false,
"stalled": false,
"enabled": true,
"eta_at": 1790000000000,
"updated_at": 1767225600000
},
"stored": {
"total": 18234
}
}
}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
Recompute against the provider instead of serving the cached snapshot