Backroom extracts verified structured data from invoice PDFs: an assistant submits a PDF, polls the job, and fetches a one-time extraction proposal.
What you can do
Submit invoice PDFs from a local path for extraction, either fire-and-forget or waiting for the job to finish
Check an extraction job's state and terminal outcome, including reasons such as unreadable scans
Fetch the extraction proposal for a job, with unverifiable values marked unclear rather than guessed
Check the caller's monthly usage meter and remaining document allowance
Check the API's health and model-provider availability without a key
When to use it
Useful when an assistant needs to turn invoice PDFs into structured data for bookkeeping, expense or accounts-payable workflows, and you want unverifiable fields flagged instead of invented. Also handy for checking remaining monthly document quota before a batch.
Requirements
Runs locally as a Python package via uvx over stdio. Requires a Backroom API key in BACKROOM_API_KEY; a free test key can be minted from the service. Network access to the Backroom API, whose base URL can be overridden with BACKROOM_API_BASE. Desktop only.
Before you install
The API key is a secret sent to a third-party service, and usage is metered against a monthly document cap. Submitted PDFs are uploaded to Backroom, so invoice contents leave your machine. get_proposal is fetch-exactly-once: the result is purged after the first successful fetch and a second fetch returns 404, so the returned data must be kept.
Submit an invoice PDF for extraction.
Reads the local file at pdf_path and uploads it to Backroom.
Returns the intake receipt: job_id (null when the submission was
deduplicated against an earlier identical document), invoice_id,
the deduped flag, and the caller's updated usage meter. Poll the
job with get_job, then read the result with get_proposal.
Parameterspdf_pathrequired
submit_invoice_and_wait
Submit an invoice PDF and wait for the job to finish.
Submits the PDF, then polls the job with backoff until it reaches
a terminal state (done or failed) or timeout_seconds elapse.
Returns {"status", "intake", "job"}: on "completed", job carries
the terminal payload — its outcome ("proposal", "needs_human",
"failed", "duplicate"), its reason_code when the job ended
without a proposal, and proposal_id when one was issued. This
tool deliberately does NOT fetch the proposal itself: proposal
fetches are exactly-once, so the fetch is left as an explicit
get_proposal call whose result the caller keeps. On "timed_out",
job holds the last seen state; keep polling with get_job.
Get an extraction job's state and terminal payload.
While running, returns the job's state. When done, includes the
outcome ("proposal", "needs_human", "failed", "duplicate"), the
reason_code when the job ended without a proposal (for example
NO_EXTRACTABLE_TEXT for a scan with no readable text), and the
proposal_id when a proposal was issued.
Parametersjob_idrequired
get_proposal
Fetch an extraction proposal by id. FETCH EXACTLY ONCE.
WARNING: the API purges the result on the first successful fetch
(zero retention) — a second fetch of the same id returns 404.
Keep everything this call returns; you cannot fetch it again.
The proposal is returned exactly as the API serves it: every
field is an object {value, status, confidence, provenance,
reason} where status is "verified", "extracted", or "unclear".
An unclear field has a null value — it was not guessed.
Parametersproposal_idrequired
get_usage
Get the caller's usage meter for the current calendar month.
Returns documents_used, the monthly cap, remaining documents,
and the period covered, for the API key in BACKROOM_API_KEY.
Takes no parameters.
check_health
Check the Backroom API's health (no API key required).
Returns the service status object, including model-provider
availability, exactly as the API reports it.
Takes no parameters.
Version history
1
v0.1.1LatestOct 29, 2026
Score
65%
65% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Reached in the last 30 days25 pts
Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
Tools listedRequired15 pts
DescriptionRequired15 pts
Logo10 pts
Documentation15 pts
Declare a GitHub repository with a README, or serve resource_documentation in the OAuth protected-resource metadata.
License10 pts
Declare a license in the repository or the registry entry.