← All guides · provider record →
AI Horde — free tier setup
What you get free
Truly free, forever: a crowdsourced inference commons (text + image) run by the Haidra non-profit, powered by anonymous volunteer workers running models on their own hardware. That structure is also the gotcha that matters most: your prompt is processed on some community member's machine, so assume prompts are readable by third-party volunteers — unsuitable for sensitive data. Throughput is governed by a priority queue, not quotas. Per the catalog: "Workers earn kudos for processing jobs, and users spend kudos for higher priority in the queue. Kudos never expire and cannot be sold (but they can be gifted to other users). Anonymous accounts have the lowest priority when there are too many concurrent requests."
Friction check
| Credit card | no |
| Phone verification | no |
| Org/membership | none |
| Est. time to first key | 0m anonymous (0000000000) / ~2m registered |
| Trains on your prompts | unknown — structurally, volunteer workers can see prompts regardless of policy |
Get a key
Path A — anonymous (zero signup): use the literal shared key 0000000000 (ten zeros) as your API key. Officially supported; lowest queue priority when the horde is busy.
Path B — registered (recommended): register a free account on aihorde.net — "register an account which will generate an API key" (official). Exact registration flow/OAuth options unconfirmed (unconfirmed — verify on first signup). Store the key like a password. A registered key accumulates kudos (earn by running a worker, receive gifts, or community participation), which buy queue priority.
First request
Native async job-queue API — NOT OpenAI-compatible. You submit a job, get an id, then poll for the result. Auth header is apikey: (not Authorization: Bearer). Endpoints confirmed against the official swagger: POST /v2/generate/text/async, GET /v2/generate/text/status/{id}. Expected shapes: submit returns {"id": "<job-uuid>", ...}; the status poll returns {"done": true, "generations": [{"text": "..."}]} when finished.
export AIHORDE_API_KEY="0000000000" # anonymous; or YOUR_KEY if registered
# 1. Submit (models[] optional — omit to let any worker pick it up)
curl https://aihorde.net/api/v2/generate/text/async \
-H "apikey: $AIHORDE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "ping",
"params": {"max_length": 16, "max_context_length": 1024}
}'
# -> {"id":"<job-uuid>", ...}
# 2. Poll until "done": true
curl -H "apikey: $AIHORDE_API_KEY" \
https://aihorde.net/api/v2/generate/text/status/JOB_UUID
Limits that will bite you
- No hard rate limits (catalog): throughput = kudos priority × current volunteer capacity. Expect high latency and long queue waits, especially anonymous — this is a batch/background provider, not an interactive one.
- Anonymous
0000000000sits at the bottom of the priority queue; under load your jobs wait behind every registered user. - The model pool is dynamic and worker-supplied — whatever volunteers currently host. The catalog intentionally records no model ids; enumerate live before submitting:
GET https://aihorde.net/api/v2/status/models?type=text. - Async-only shape: no synchronous completion, streaming unconfirmed. Budget for poll loops and job expiry handling.
- Privacy: generation happens on volunteer hardware; treat every prompt as potentially visible to a stranger.
Key rotation runbook
- Second key: the anonymous key
0000000000is always available as a zero-priority fallback; whether a registered account can hold multiple keys is unconfirmed (unconfirmed — verify on first signup). - Revoke/reset: via your account settings on
aihorde.net(unconfirmed — verify on first signup). - Note: rotation buys nothing here — priority follows the kudos balance of the key's account, and kudos are the scarce resource, not request quota.
- ModelHubby integration:
export AIHORDE_API_KEY_2="..."— the key pool picks it up automatically; state machine cools down rate-limited keys per-key.
ModelHubby usage
pnpm modelhubby show aihorde
pnpm modelhubby probe --live --provider aihorde --apply
