Pollinations AI Free API Verified: Image Truly Keyless, Text Free Only When Anonymous
Verified 2026-08-31 00:35 CST (UTC+8) · 3 curls reproducible · Fixed "any string works" error
Pollinations AI offers image and text generation, but "keyless" means different things for the two endpoints. Every claim below is from live requests.
TL;DR Verified Result
| Endpoint | Truly Keyless? | Correct Way | Wrong Way | Live Result |
|---|---|---|---|---|
Image GET https://image.pollinations.ai/prompt/{prompt} |
✅ Yes | GET with no Authorization header |
— | 200 31KB JPEG 512x512 |
Text POST https://text.pollinations.ai/openai |
⚠️ Anonymous only | POST without Authorization |
With Authorization: Bearer not-needed / any string |
Anonymous 200 gpt-oss-20b; with key 402 PAYMENT_REQUIRED |
Critical pitfall: Any
Authorizationon text triggers402 API key budget too low ... costs ~0.0001 pollen, but this key has 0.0000with notelegacy text API is being deprecated for authenticated users. Anonymous requests are NOT affected. Please migrate to https://enter.pollinations.ai. For free text, do NOT send Authorization.
Reproducible Verification (3 curls)
Test 1: Image — No Auth Needed
curl -o image.jpg "https://image.pollinations.ai/prompt/A%20beautiful%20sunset%20over%20mountains?width=512&height=512&model=flux&seed=42&enhance=true" -i
# => HTTP/1.1 200 OK
# => Content-Type: image/jpeg
# => ~31KB JPEG 512x512
import requests
r = requests.get("https://image.pollinations.ai/prompt/A%20cute%20cat%20wearing%20spacesuit",
params={"width":1024,"height":1024,"model":"flux","seed":42}, timeout=30)
open("cat.jpg","wb").write(r.content)
print(r.status_code, len(r.content), r.headers.get("Content-Type")) # 200 31xxx image/jpeg
Test 2: Text — Anonymous POST = 200
curl -X POST https://text.pollinations.ai/openai \
-H "Content-Type: application/json" \
-d '{"model":"openai","messages":[{"role":"user","content":"Hello!"}],"stream":false}' -i
# => 200 {"model":"gpt-oss-20b","choices":[{"message":{"role":"assistant","content":"Hello!"}}]}
import requests
resp = requests.post("https://text.pollinations.ai/openai", json={
"model":"openai",
"messages":[{"role":"user","content":"Explain quantum computing in one sentence"}],
"stream": False
}, timeout=30)
print(resp.status_code) # 200
print(resp.json()["choices"][0]["message"]["content"])
# Do NOT add Authorization header
Test 3: Text — Dummy Key = 402 (Wrong)
curl -X POST https://text.pollinations.ai/openai \
-H "Content-Type: application/json" \
-H "Authorization: Bearer not-needed" \
-d '{"model":"openai","messages":[{"role":"user","content":"Hello!"}],"stream":false}' -i
# => 402 Payment Required
# => {"code":"PAYMENT_REQUIRED","message":"API key budget too low... Please go to https://enter.pollinations.ai ... legacy text API is being deprecated for authenticated users. Anonymous requests are NOT affected."}
Previous
api_key="not-needed"+OpenAI(base_url="https://text.pollinations.ai/openai")was wrong and removed. SDK only works withhttps://enter.pollinations.ai/api/v1+ realpk_...pollen key.
Correct vs Wrong Code
✅ Correct (anonymous, free):
import requests
resp = requests.post("https://text.pollinations.ai/openai", json={
"model":"openai",
"messages":[{"role":"user","content":"Write a short poem about spring"}]
})
❌ Wrong (402):
import openai
client = openai.OpenAI(base_url="https://text.pollinations.ai/openai", api_key="not-needed")
For SDK, use new domain with balance:
import openai
client = openai.OpenAI(base_url="https://enter.pollinations.ai/api/v1", api_key="pk_xxx")
// Node.js correct (anonymous)
fetch("https://text.pollinations.ai/openai", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ model: "mistral", messages: [{ role:"user", content:"Hello!" }] })
}).then(r=>r.json()).then(console.log);
Free Tier & Models (Verified)
| Resource | Free Quota | Notes |
|---|---|---|
| Image | Unlimited* | Fair use, verified 200 repeatedly |
| Text (anonymous) | Unlimited* | Anonymous 200, with key 402 |
| Rate | Generous | Recommend 1-2 req/s |
| Validity | Permanent | No signup |
*Fair use for personal/small-medium traffic.
Image models: flux, turbo, sdxl via ?model=flux.
Text models: openai (returns gpt-oss-20b), mistral (32K), llama via {"model":"openai"}. OpenAI Chat Completions compatible.
Comparison (Corrected)
| Platform | Free Image | Free Text | Key Required | OpenAI Compat | Verified |
|---|---|---|---|---|---|
| Pollinations Image | Unlimited* | — | No | — | GET 200 |
| Pollinations Text Anonymous | — | Unlimited* | No (must be anonymous) | Yes | POST anon 200 |
| Pollinations Text with Key | — | Pollen | Yes | Yes | 402 on legacy, migrate |
| Hugging Face | Rate-limited | Rate-limited | Yes | No | Token required |
| Together AI | $5 trial | $5 trial | Yes | Yes | Card required |
Use Cases & Limits
Good for: Personal prototypes, teaching, bots, frontend-direct image. Not for: Mission-critical SLA, high concurrency.
Tips:
- Never send
Authorizationfor free text; buy pollen atenter.pollinations.aiif you need billing. - Cache identical image prompts locally.
- Wrap with retry + Apishare fallback for prod.
Conclusion
Pollinations "keyless" is real with a caveat: image unconditional; text only when anonymous — any key triggers 402. Use the 3 verified curls above for zero-cost integration; migrate to enter.pollinations.ai for SDK/billing. Verified and copy-paste ready.
🚀 Get Started: One-Click Free API Access
Want to call all the free models above with a single API key, no need to sign up for each provider? Apishare.cc provides a unified API Key — one key, 100+ models, free models at zero cost.
👉 Register on Apishare.cc → Get your unified API Key
📊 Want to see more free model rankings? Check out the Sep 2026 Free LLM API Rankings →
About the Free API Aggregator
The models covered in this guide are all served through the APIShare free API aggregator, which gives you one key for the whole catalog.
- Full model catalog: APIShare free API directory
- Sign up for a free trial key: Register and claim your API key