Gen FAC API
Private API for Instagram account generation. You bring your own proxies and phone numbers, the API handles the rest and hands you back the credentials.
Quickstart
Three calls to get an account:
# 1. start the job — pass your proxy + phone
POST /jobs
# 2. once status = "awaiting_otp", drop the code
POST /jobs/{job_id}/otp
# 3. poll until done, grab the creds
GET /jobs/{job_id}
Just use client.py and it handles all of this automatically.
Auth
Every request needs your API key. Two ways to pass it:
# header — use this on GET /jobs/:id and POST /jobs/:id/otp
x-api-key: YOUR_KEY_HERE
# body field — use this on POST /jobs
{ "key": "YOUR_KEY_HERE", ... }
GET /health
No auth needed. Good to ping before starting a big run.
Response
{
"ok": true,
"total_jobs": 45,
"running": 38,
"queued": 7,
"awaiting_otp": 12,
"worker_slots": 100
}
POST /jobs
Submit a job. Starts immediately — poll GET /jobs/:id for the result. You can fire off hundreds at once, they'll queue and drain automatically.
Request body
| Field | Type | Description | |
|---|---|---|---|
| key | string | required | Your API key |
| proxy | string | required | e.g. socks5://user:pass@host:port |
| phone | string | required | Phone with country code e.g. +14155550123 |
| username | string | optional | Override the auto-generated username |
| password | string | optional | Override the auto-generated password |
| full_name | string | optional | Override the auto-generated name |
| year | int | optional | Birth year — defaults to random 1990–2002 |
| month | int | optional | Birth month |
| day | int | optional | Birth day |
Example
POST /jobs
Content-Type: application/json
{
"key": "YOUR_KEY_HERE",
"proxy": "socks5://user:pass@proxy.example.com:1080",
"phone": "+14155550123"
}
Response 202
{
"job_id": "a3f9b2c1-...",
"status": "running"
}
GET /jobs/:id
Poll every 3–5 seconds. Response changes as the job moves through its stages.
Headers
x-api-key: YOUR_KEY_HERE
status: queued
Server is at capacity — your job is in line. It'll start automatically when a slot frees up, no action needed.
{
"job_id": "a3f9b2c1-...",
"status": "queued",
"queue_position": 4,
"message": "position 4 in queue — will start when a slot is free"
}
status: running
{
"job_id": "a3f9b2c1-...",
"status": "running"
}
status: awaiting_otp
{
"job_id": "a3f9b2c1-...",
"status": "awaiting_otp",
"phone": "+14155550123",
"message": "submit OTP to POST /jobs/a3f9b2c1-.../otp"
}
awaiting_otp you've got 2 minutes to submit the code. Miss it and the job fails — just retry with a fresh number.
status: done
{
"job_id": "a3f9b2c1-...",
"status": "done",
"result": {
"username": "jordan_smith92",
"password": "Xk9#mLp3wQ!z",
"phone": "+14155550123",
"user_id": "58291047382"
}
}
status: failed
{
"job_id": "a3f9b2c1-...",
"status": "failed",
"error": "instagram: challenge required"
}
POST /jobs/:id/otp
When your job hits awaiting_otp, grab the code from your SMS provider and drop it here. Job picks back up instantly.
Headers
x-api-key: YOUR_KEY_HERE
Body
{ "code": "123456" }
Response
{
"ok": true,
"message": "code accepted — job resuming"
}
Job Statuses
| Status | What it means | What to do |
|---|---|---|
| queued | Waiting for a free slot — check queue_position |
Nothing — it starts automatically |
| running | Signup in progress | Keep polling |
| awaiting_otp | Waiting on your SMS code | POST /jobs/:id/otp with the code |
| done | Account created | Collect result — it's deleted after |
| failed | Something went wrong — see error |
Retry with a fresh phone + proxy |
Error Codes
| HTTP | Meaning |
|---|---|
| 400 | Bad request — missing or invalid field (check proxy format, phone format) |
| 401 | Invalid or missing API key |
| 403 | Key suspended — contact support |
| 404 | Job not found — already collected, failed, or expired |
| 429 | Submitting too fast — max 5 jobs/sec |
Full Flow
1. get a phone number from your SMS provider
2. POST /jobs
→ {job_id, status: "running"} (or "queued" if busy)
3. poll GET /jobs/{job_id} every 3s
"queued" → chill, check queue_position, auto-starts
"running" → still going, keep polling
"awaiting_otp" → grab OTP from your SMS provider
POST /jobs/{job_id}/otp {code}
"done" → save result immediately (username/password/phone)
"failed" → read error, retry with new phone + proxy
Limits
You can run as many concurrent jobs as you want — no cap on your end. If the server is at capacity your jobs queue up automatically and start as slots free, you'll see queue_position counting down.
The only hard limits:
- 5 job submissions/sec per key — anything faster is rejected with 429
- 120s OTP window — job auto-fails if you don't submit the code in time
client.py
Drop-in script that handles everything — SMS polling, OTP submission, polling, saving creds to accounts.txt. Easiest way to use the API.
Install deps
pip install requests colorama faker
Run
python client.py
First run asks for:
- API URL + key
- SMS provider + your API key for it (5sim, SMSPool, etc.)
- Phone country
- Proxy — single URL or
proxies.txtfor rotation - How many accounts + how many workers to run in parallel
Everything gets saved to config.json so you don't have to re-enter it each run.
proxies.txt
socks5://user:pass@host1:port
socks5://user:pass@host2:port
# lines with # are skipped
Output format
[2025-01-15 14:32:01] [CREATED] username=jordan_smith92 | password=Xk9#mLp3wQ!z | phone=+14155550123
error field from the failed job response — makes it way easier to debug.
gen fac api v1.0