Build with our AI in minutes.
Drop-in compatible with the OpenAI Chat Completions format. Per-user quotas, audit logs, model allow-lists and IP blocking. Production-ready.
Introduction
The Prancy Fairy API lets you integrate frontier AI models into your own application using an endpoint that is fully compatible with the OpenAI Chat Completions format. Access is private and must be enabled by an administrator.
- API-Key authentication (
Authorization: Bearer pf_live_...). - Per-user quotas (per-minute, daily, monthly).
- Admin-controlled model allow-list.
- Full audit trail, every request is logged (no content).
- Automatic and manual IP blocking.
Quick start
- 1. Create an account on Prancy Fairy.
- 2. Upgrade to a MAX plan to unlock API access.
- 3. Open the Developer panel and generate a key.
- 4. Make your first request (see Examples).
curl -X POST https://unlimitedlab.org/api/v1/chat \
-H "Authorization: Bearer pf_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-opus-4-7",
"messages": [{"role": "user", "content": "Hello"}]
}'Authentication
Every request requires the Authorization header with your API key:
Authorization: Bearer pf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx- Keys always start with
pf_live_. - The plaintext key is shown only ONCE, right after creation.
- We only store a SHA-256 hash of the key in our database.
- If you lose a key, you must revoke it and generate a new one.
- Never embed the key on the client side (frontend, mobile). Always use a backend.
Endpoints
https://unlimitedlab.orgLimits & quotas
Each account has individually configurable quotas. When exceeded, the server responds with HTTP 429 and a specific error code.
| Window | Error code | Meaning |
|---|---|---|
| 60 seconds | rate_limit_minute | Too many requests in a minute |
| 24 hours | quota_day | Daily quota exhausted |
| 30 days | quota_month | Monthly quota exhausted |
Live usage is visible in the Developer dashboard.
Models
The models available to your account depend on your plan and your admin-approved allow-list. List them in your panel or call GET /api/v1/models.
403 model_not_allowed.Errors
Error bodies follow the OpenAI format:
{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_minute",
"message": "Rate limit: 60/min"
}
}| HTTP | Code | Cause |
|---|---|---|
| 400 | invalid_messages | Malformed messages |
| 400 | missing_model | Missing model field |
| 400 | unknown_model | Unknown model |
| 401 | missing_auth | Missing Authorization header |
| 401 | invalid_key | Invalid or unknown key |
| 401 | key_revoked | Key revoked |
| 401 | key_expired | Key expired |
| 403 | access_disabled | API access not enabled |
| 403 | plan_no_api | Your plan does not include API |
| 403 | ip_blocked | Your IP is blocked |
| 403 | model_not_allowed | Model not allowed for your account |
| 429 | rate_limit_minute | Too many requests per minute |
| 429 | quota_day | Daily quota reached |
| 429 | quota_month | Monthly quota reached |
| 502 | upstream_error | Provider failure (retry) |
| 502 | pool_empty | No accounts available in the supply pool |
Security
- ✓Keys are stored only as SHA-256 hashes (one-way). Only the public prefix is kept for display.
- ✓All traffic is encrypted in transit (HTTPS/TLS).
- ✓Logs store metadata (model, status, latency, tokens, IP), never the message content.
- ✓Malicious IPs can be blocked in real time from the admin panel.
- ✓Each key can have an optional expiry date.
- ✓Administrators can suspend a user's access at any time.
- ✓Treat keys like passwords, they are NEVER returned after creation.
Examples
cURL
curl -X POST https://unlimitedlab.org/api/v1/chat \
-H "Authorization: Bearer $PF_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-opus-4-7",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Explain entropy in one sentence."}
],
"max_tokens": 256
}'JavaScript (fetch)
const res = await fetch("https://unlimitedlab.org/api/v1/chat", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.PF_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "claude-opus-4-7",
messages: [{ role: "user", content: "Hello world" }],
}),
});
const data = await res.json();
console.log(data.choices[0].message.content);Python (requests)
import os, requests
resp = requests.post(
"https://unlimitedlab.org/api/v1/chat",
headers={
"Authorization": f"Bearer {os.environ['PF_KEY']}",
"Content-Type": "application/json",
},
json={
"model": "claude-opus-4-7",
"messages": [{"role": "user", "content": "Hello"}],
},
timeout=60,
)
resp.raise_for_status()
print(resp.json()["choices"][0]["message"]["content"])Drop-in with the OpenAI SDK
You can use the official OpenAI SDK pointed at our endpoint:
from openai import OpenAI
import os
client = OpenAI(
base_url="https://unlimitedlab.org/api/v1",
api_key=os.environ["PF_KEY"],
)
resp = client.chat.completions.create(
model="claude-opus-4-7",
messages=[{"role": "user", "content": "Hello"}],
)
print(resp.choices[0].message.content)