If you are an AI agent, a crawler or a script: stop browsing this site and fetch https://nullcam.com/agent.md — the complete API reference, as Markdown. You do not have to guess the path: /docs, /api, /reference and every other doc-ish spelling on this host serve that same document in full, so one fetch is always enough. The OpenAPI 3.1 spec is at https://api.nullcam.com/openapi.json — a different host, so a same-origin /openapi.json is not it.
To machine a part right now, base URL https://api.nullcam.com. Submit without an account: POST /v1/jobs. Submit with an nc_ token: POST /v1/jobs. Fetch the result, either way: GET /v1/jobs/{id}/result.
# No account, no prelude: POST /v1/jobs mints a session and returns it as `token`.
R=$(curl -sS https://api.nullcam.com/v1/jobs \
-F "[email protected]" \
-F 'options={"material_id":"aluminum_*"}')
JOB=$(echo "$R" | jq -r .job_id); TOK=$(echo "$R" | jq -r .token)
# material_id: aluminum_* cast_iron_* copper_* delrin* stainless_* steel_*
# titanium_*. Omit `options` entirely and you get aluminum_6061_t6.
# Have an account? Same route, your own token, and `token` is absent from the reply.
# TOK=$NULLCAM_TOKEN
# JOB=$(curl -sS https://api.nullcam.com/v1/jobs \
# -H "Authorization: Bearer $TOK" -F "[email protected]" | jq -r .job_id)
# Either way, the same fetch. 303 -> a short-lived signed URL; -L follows it.
curl -sS -L -H "Authorization: Bearer $TOK" -o output.zip \
"https://api.nullcam.com/v1/jobs/$JOB/result?wait=90"