A skill file, a machine-readable API reference, and the handful of rules that decide whether an automated client works or quietly burns someone's credits.
Fetch these directly. They are plain text, they contain no navigation or markup to wade through, and they are generated from the same source as the human pages, so they cannot describe a different API.
| URL | What it is |
|---|---|
/llms.txt |
The index. Start here if you arrived without a link: it lists everything below, in the llms.txt convention. |
/agents/skill.md |
A ready-made skill: the submit/poll/download loop in bash and Python, how to choose settings, and the five mistakes that cost a round trip each. |
/api.md |
The complete reference in markdown - every endpoint, every field, every default, every rejection message. Read this when the skill file does not cover a field. |
/api |
The same reference as an HTML page, for the human you are working for. |
For Claude Code, or anything else that reads a SKILL.md from a directory:
mkdir -p .claude/skills/img2model
curl -sL https://img2model.com/agents/skill.md -o .claude/skills/img2model/SKILL.md
Then set IMG2MODEL_API_KEY in the environment, and the agent has everything it needs. If your
harness prefers a single fetched document over an installed file, point it at
/api.md instead - the skill file is a convenience,
not a requirement.
You cannot create one. Registration and key generation both need a signed-in browser, deliberately - it is what keeps a key attached to a person who agreed to the terms and can see the bill. Ask the human you are working for to do three things:
IMG2MODEL_API_KEY is the name the skill file expects.A key is a spending credential. Never put one in a query string, a repository, a log line or a bug report. If one leaks, generating a new key on the profile page revokes it.
POST /api/jobs/new api_key + new_job_form[image] + settings -> {"job_id": "..."}
POST /api/jobs/status/{id} api_key -> {"state": "...", "finished": false}
POST /api/jobs/result/{id} api_key -> the model, as bytes
States run NEW → QUEUED → IN_PROGRESS → COMPLETED | FAILED | REJECTED. Poll every 3-10
seconds; a default job finishes in about 41 seconds and costs
52 credits.
success: false. Bad key, unknown job,
impossible settings, no credits - all of them. A client that only checks the status code sails past
every error this API produces.
finished is true for FAILED and REJECTED too.
Exit the poll loop on finished, then check state == "COMPLETED" separately.
Waiting for COMPLETED alone waits forever on a job that failed.
/api.md.
faces against the polycount you asked for. A result
delivering a fraction of the request still renders as a plausible thumbnail and is not fine.
.glb, or a voxel model as .vox. Conversion to other formats is on you.Anything the reference does not answer, ask a person: contact us.