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", ... }
Don't share your key. If it leaks hit up support to get it swapped out.

GET /health

GET /health check if the api is up

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

POST /jobs start a generation job

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

FieldTypeDescription
keystringrequiredYour API key
proxystringrequirede.g. socks5://user:pass@host:port
phonestringrequiredPhone with country code e.g. +14155550123
usernamestringoptionalOverride the auto-generated username
passwordstringoptionalOverride the auto-generated password
full_namestringoptionalOverride the auto-generated name
yearintoptionalBirth year — defaults to random 1990–2002
monthintoptionalBirth month
dayintoptionalBirth 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

GET /jobs/{job_id} poll status / grab result

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"
}
120 second window. Once a job hits 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"
  }
}
One-time collect. The result is wiped the moment you grab it. Polling again returns 404 — save it locally immediately.

status: failed

{
  "job_id": "a3f9b2c1-...",
  "status": "failed",
  "error":  "instagram: challenge required"
}

POST /jobs/:id/otp

POST /jobs/{job_id}/otp submit the sms code

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

StatusWhat it meansWhat 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

HTTPMeaning
400Bad request — missing or invalid field (check proxy format, phone format)
401Invalid or missing API key
403Key suspended — contact support
404Job not found — already collected, failed, or expired
429Submitting 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:

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:

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
Issues? Hit up support and include the error field from the failed job response — makes it way easier to debug.

gen fac api v1.0