Credits and Parking
What happens when an upload costs more credits than your team has: files park instead of being rejected, and resume automatically.
Credits and Parking
Each ingested invoice costs one credit. When an upload costs more credits than your team currently has, Parseo parks the files it cannot fund rather than rejecting them.
What parking means
A parked file:
- is accepted. It has a real
job_...ID and holds its place in the queue. - has not been charged. Credits are consumed when a job runs, not when it is accepted.
- has not failed. It resumes on its own as soon as your balance rises.
The upload response tells you immediately, per file:
{
"results": [
{ "filename": "a.pdf", "jobId": "job_1a2b", "status": "processing" },
{ "filename": "b.pdf", "jobId": "job_3c4d", "status": "processing" },
{ "filename": "c.pdf", "jobId": "job_5e6f", "status": "awaiting_credits" }
],
"accepted": 3,
"rejected": 0,
"awaitingCredits": 1
}accepted counts parked files — they were accepted, just not yet fundable.
awaitingCredits is the subset that parked.
A partly or fully parked submission is still a 207 (batch) or 202
(single upload) — never a 402. Do not treat awaiting_credits as an
error and do not re-upload the file: the job already exists, and re-uploading
creates a second one that will also park.
Where you see it
| Surface | What you get |
|---|---|
POST /invoices | status: "awaiting_credits" on the 202 body |
POST /invoices/batch | Per-file status: "awaiting_credits", plus an awaitingCredits count |
GET /jobs/:jobId | status: "awaiting_credits" |
GET /jobs?status=awaiting_credits | Lists exactly your parked jobs |
GET /invoices?status=awaiting_credits | Same filter on the invoice list |
Webhook invoice.awaiting_credits | Fired once per parked job, at admission |
Parked jobs are deliberately not reported as processing. Queued work
drains on its own; parked work drains only when your balance rises — polling a
parked job on a fixed interval will never resolve it by itself.
Getting parked work moving
Top up your credit balance in the Parseo dashboard. Parked jobs resume
automatically, oldest first, up to whatever the new balance covers — you do not
re-upload and you do not call anything. invoice.processed (or
invoice.failed) then fires as it normally would.
Parked work can also be cancelled from the dashboard, and is swept after a retention window if it is never funded.
Backpressure is a different thing
awaiting_credits means "we cannot fund this yet". A 503 ingestion.queue_full means "you already have too much work queued" — that one
is a rejection, no job is created, and the correct response is to retry the
upload after a short delay. Parked jobs count toward that queue depth, since
they are backlog you have not drained.
Test mode never parks
parseo_test_* keys are never charged, so they can never be short. A test-mode
upload always comes back processing, no matter what your live balance is, and
invoice.awaiting_credits never fires for a test key. Test mode therefore
cannot be used to rehearse your parking-handling code — exercise that against a
live key with a low balance instead.
