Rough Cut Manufacturing API
The public endpoints behind our quote page, the buyer status board and the invoice
portal. Every call is a JSON POST to https://roughcutmfg.com/api/.
There are no API keys: a board or an invoice is read with the private link we emailed
to the buyer.
Find it automatically
-
/.well-known/api-catalog: the API catalog (RFC 9727), served asapplication/linkset+json. -
/openapi.json: the OpenAPI 3.1 description of every endpoint below. -
/llms.txt: the shop, its products and how to order, in plain text. -
/status: where customers sign in and follow their jobs. The catalog names it as the API'sstatuslink.
Endpoints
Request a quote: POST /api/submit-proposal
Sends a request for a quote to the shop's quoting board and emails the requester a confirmation: name, email, phone and what to make. It needs a Cloudflare Turnstile check solved on our quote page, and drawings or CAD files are attached there, so an agent should send the person to roughcutmfg.com/quote.
Status board: POST /api/job-status
A buyer's board of their jobs and the stage each is at, read with the token from
the emailed link https://roughcutmfg.com/status?link=<token> (the
link parameter; a link sent before 2026-10-21 carries it after
# instead). peek says what a link is without using it up;
open uses the link up (it works once) and answers with a device token;
view reads the board with that device token; signout
deletes it; shop gives the shop's name and contacts. Open a board only
when the person asks to. The board never shows prices, rates or hours.
curl -X POST https://roughcutmfg.com/api/job-status \
-H 'Content-Type: application/json' \
-d '{"action":"view","token":"<device token>"}'
Email a board link: POST /api/job-status-signin
Emails a fresh board link to a buyer account's address. It answers the same
{"ok":true} whether or not the address has an account, and needs a
Turnstile check solved on roughcutmfg.com/status.
Read an invoice: POST /api/portal-invoice
The invoice behind a portal link we emailed,
https://roughcutmfg.com/portal/<token>: send
{"token":"<token>"}. Read only; it changes nothing.
Good to know
- Send a token in the request body, never in the URL.
-
Every endpoint is limited per IP address and answers
429when a client sends too many requests. Slow down and try again shortly. -
Errors come back as JSON with an
errormessage in words. A503from the status board means try the same request again in a moment. - Building something on these? Email [email protected] or call (661) 948-7111.