3SKID API — full guide
Run every 3SKID service from your own program, website, or a simple copy-paste command. Written so anyone can follow it, even with zero API experience.
What is this, in plain words?
Normally you use 3SKID by opening the app and clicking buttons. The API is a way to do the exact same things by sending a message over the internet instead of clicking. That lets a program (your website, a bot, or a one-line command) do the work automatically — one account or ten thousand.
You don't need to be a programmer to try it — you can use a free app called Postman (a form you fill in and click Send). If you are integrating it into a website, any language works (PHP, Node, Python…).
What you need before you start
- A 3SKID account — the same email + password you log into the 3SKID app with. (No account? Open the app → any credits service → Create account.)
- Credits on that account — buy them in the app (Buy credits). Every successful action costs credits; failures cost nothing.
- A way to send a request — pick one:
- Postman — free app, no coding (how ↓). Easiest.
- The terminal —
curl.exeon Windows,curlon Mac/Linux. - Your own code — examples ↓.
The API lives at one address (the base URL):
https://api.3skr-storeid.com/v1
⚠️ The one thing everyone mixes up: two different "accounts"
There are two logins in play. Keep them straight and everything else is easy:
① Your 3SKID account
The email + password you use to sign into 3SKID. This is who you are and who pays. You turn it into a token (Step 1) and send that token on every request.
② The Apple accounts you process
The Apple IDs you want to activate / bind. These go inside the request, in the accounts list. Each one has its own email + password.
accounts list, and never paste your token into a chat or share it — it's a live key to your credits. To kill a leaked token, change your 3SKID password.No code? Use Postman (fill a form, click Send)
- Install Postman (free, postman.com) and open it.
- Click New → HTTP Request.
- Set the method to POST and paste the URL
https://api.3skr-storeid.com/v1/login. - Open the Body tab → choose raw → JSON, and paste:
{"email":"you@example.com","password":"your-3skid-password"} - Click Send. The reply shows your token. Copy it.
- For the next requests: in the Authorization tab pick Bearer Token and paste your token; put the JSON body in Body → raw → JSON; click Send.
The 3 steps (this is the whole thing)
Everything you do is: 1) log in once to get a token → 2) send a job → 3) check the job until it's done. That's it.
Step 1 — Log in and get your token
Send your 3SKID email + password. You get back a token — a long string you'll use on every other request. It's valid ~30 days.
curl.exe https://api.3skr-storeid.com/v1/login -H "Content-Type: application/json" -d '{\"email\":\"you@example.com\",\"password\":\"your-3skid-password\"}'
curl https://api.3skr-storeid.com/v1/login \ -H "Content-Type: application/json" \ -d '{"email":"you@example.com","password":"your-3skid-password"}'
You get back:
{ "ok":true, "token":"1EugwnWP…long-string…", "email":"you@example.com", "credits":494215.5 }
Copy the token. On every request after this, add the header Authorization: Bearer YOUR-TOKEN.
curl is fake (it's Invoke-WebRequest) and breaks on -H/-d. Always type curl.exe (with .exe) and keep it on one line. See FAQ.Step 2 — Run a function
You send a job: which service, and a list of Apple accounts. You immediately get a job id back (the work runs in the background). Pick the function you want below — 5GB activation or Mac-code binding.
Step 3 — Get the results (check the job)
Take the id from Step 2 and ask for it. Repeat every few seconds while status is running; stop when it's done (or stopped/error).
curl.exe https://api.3skr-storeid.com/v1/jobs/5g_7Kd2b9Q -H "Authorization: Bearer YOUR-TOKEN"
{ "status":"done", "total":1, "success":1, "charged":1, "results":[ { "email":"user@icloud.com", "success":true, "charged":true, "link":"https://code.3skr-storeid.com/code?key=…" } ], "credits":494214.5 }
Full meaning of every field is in Reading results. To stop a job early: POST /v1/jobs/{id}/cancel (same token).
Every function, every option
iCloud 5GB activation
Upgrades Apple accounts from 1GB to 5GB. You send a list of accounts and how many to run at once (threads). Each account needs a type — that tells us how it signs in. There are three types:
| type | Use it when… | Extra fields needed |
|---|---|---|
"3q" | The account uses 3 security questions (no 2FA). | none — just email + password |
"2fa" | The account's code arrives by SMS (phone 2FA). | phone |
"maccode" | The account's code comes from a Mac / trusted device link. | code_url (its code link) |
Example — one of each type
curl.exe https://api.3skr-storeid.com/v1/activations/5gb -H "Authorization: Bearer YOUR-TOKEN" -H "Content-Type: application/json" -d '{\"accounts\":[ {\"email\":\"a@icloud.com\",\"password\":\"pw1\",\"type\":\"maccode\",\"code_url\":\"https://code.3skr-storeid.com/code?key=abc\"}, {\"email\":\"b@icloud.com\",\"password\":\"pw2\",\"type\":\"3q\"}, {\"email\":\"c@icloud.com\",\"password\":\"pw3\",\"type\":\"2fa\",\"phone\":\"3051234567\"} ],\"threads\":20}'
{ "ok":true, "id":"5g_7Kd2b9Q", "status":"queued", "total":3, "credits":494215.5 }
Then check the job with the returned id. Add as many accounts as you like (up to 5000 per job); raise threads to run more at once.
code_url? It's the account's Mac-code link — the same https://code.3skr-storeid.com/code?key=… you'd paste into the app's "Mac code" box. If you bound the device with 3SKID, that's the link it gave you.Mac-code device binding
Binds a trusted device to each Apple account and returns a private live code link (so you can read that account's 2FA code later). Each account needs a phone and an sms_url (your SMS-gateway link).
curl.exe https://api.3skr-storeid.com/v1/bindings/maccode -H "Authorization: Bearer YOUR-TOKEN" -H "Content-Type: application/json" -d '{\"accounts\":[ {\"email\":\"user@icloud.com\",\"password\":\"pw\",\"phone\":\"3051234567\",\"sms_url\":\"https://api1997.com/sms-record?token=PG…\"} ],\"threads\":10}'
Reply: { "ok":true, "id":"db_5Rm0…", "status":"queued", "total":1 }. Check the job; each success returns a link (the account's code link) in its result.
Check your account & balance
curl.exe https://api.3skr-storeid.com/v1/account -H "Authorization: Bearer YOUR-TOKEN" # → { "ok":true, "email":"you@example.com", "credits":494215.5 }
Checks & top-up — coming soon
POST /v1/checks and POST /v1/credits/invoice currently return 501 ("coming soon"). For now: run account checks and buy credits inside the app.
Reference
Every field, explained
Request body — 5GB activation & binding
| field | required? | what it is |
|---|---|---|
accounts | required | A list [ … ] of the Apple accounts to process. 1–5000 per job. |
accounts[].email | required | The Apple ID's email. |
accounts[].password | required | That Apple ID's password. |
accounts[].type | 5GB only | "3q" / "2fa" / "maccode". How the account signs in. (Binding doesn't use this.) |
accounts[].code_url | maccode only | The account's Mac-code link (https://code.3skr-storeid.com/code?key=…). |
accounts[].phone | 2fa / binding | The account's phone number (SMS 2FA). |
accounts[].sms_url | binding | Your SMS-gateway link that receives the code. |
threads | optional | How many accounts to run at once (default 10). Higher = faster but be gentle — 15–25 is a good range. |
Reading the results
A job (GET /v1/jobs/{id}) returns these fields:
| field | meaning |
|---|---|
status | queued/running = still working · done = finished · stopped/error = ended early. Keep checking while running. |
total / done | How many accounts in the job / how many have finished. |
success | How many succeeded (activated / bound). |
charged | How many credits were charged (= successes). Failures are never charged. |
credits | Your remaining balance. |
results[] | One entry per account: email, success (true/false), charged, link (the code link, on success), and a reason if it failed (e.g. "Wrong password", "Apple throttled — retry later"). Passwords are never returned. |
Errors & how to fix them
Each request returns an HTTP status code. Anything 200 = good; otherwise the reply has {"detail":"…"} explaining what went wrong.
| code | means | fix |
|---|---|---|
| 401 | Bad or missing token. | Log in again (Step 1) and use the fresh token. Check the header is exactly Authorization: Bearer <token>. |
| 402 | Not enough credits. | Buy credits in the app, then retry. |
| 404 | Job id not found (or not yours). | Use the exact id from Step 2, with the same account's token. |
| 409 | A job is already running for this account. | Wait for it to finish, or cancel it, then start again. |
| 413 / 422 | Too many accounts (>5000) / malformed body. | Split into smaller jobs / fix the JSON (see FAQ on quotes). |
| 429 | Too many requests, too fast. | Slow down (limit ~10 requests/sec). Wait a moment and retry. |
| 501 | Not available yet (checks / top-up). | Use the app for those for now. |
success:false with a reason. You're only charged for the ones that worked.Pricing & limits
| Function | Cost (charged only on success) |
|---|---|
| iCloud 5GB activation | 1 credit |
| Mac-code device binding | 0.5 credit |
| Every other function | 0.05 credit |
- Success-only billing: failed / throttled accounts cost nothing.
- Max 5000 accounts per job. ~10 requests/sec per IP.
- Your token lasts ~30 days; changing your password revokes all tokens.
Integrating into your website / tool (code)
Resellers put this on their own server (never expose your 3SKID password to your end-users). Log in once, cache the token, then call the endpoints. Same three steps.
$B = "https://api.3skr-storeid.com/v1"; // 1) login → token $tok = json_decode(file_get_contents("$B/login", false, stream_context_create(["http"=>[ "method"=>"POST", "header"=>"Content-Type: application/json", "content"=>json_encode(["email"=>"you@example.com","password"=>"…"])]])))->token; // 2) run a 5GB job $job = json_decode(file_get_contents("$B/activations/5gb", false, stream_context_create(["http"=>[ "method"=>"POST", "header"=>"Authorization: Bearer $tok\r\nContent-Type: application/json", "content"=>json_encode(["accounts"=>[["email"=>"a@icloud.com","password"=>"p","type"=>"maccode","code_url"=>"…"]],"threads"=>20])]]))); // 3) then GET $B/jobs/{$job->id} with the same Bearer header, until status == "done"
const B = "https://api.3skr-storeid.com/v1"; const j = (u,o)=>fetch(u,o).then(r=>r.json()); // 1) login const {token} = await j(`${B}/login`,{method:"POST",headers:{"Content-Type":"application/json"}, body:JSON.stringify({email:"you@example.com",password:"…"})}); const H = {"Authorization":`Bearer ${token}`,"Content-Type":"application/json"}; // 2) run const job = await j(`${B}/activations/5gb`,{method:"POST",headers:H, body:JSON.stringify({accounts:[{email:"a@icloud.com",password:"p",type:"maccode",code_url:"…"}],threads:20})}); // 3) poll: await j(`${B}/jobs/${job.id}`,{headers:H}) until status === "done"
import requests, time B = "https://api.3skr-storeid.com/v1" tok = requests.post(f"{B}/login", json={"email":"you@example.com","password":"…"}).json()["token"] H = {"Authorization": f"Bearer {tok}"} job = requests.post(f"{B}/activations/5gb", headers=H, json={ "accounts":[{"email":"a@icloud.com","password":"p","type":"maccode","code_url":"…"}], "threads":20}).json() while True: r = requests.get(f"{B}/jobs/{job['id']}", headers=H).json() if r["status"] in ("done","stopped","error"): print(r); break time.sleep(3)
FAQ & troubleshooting
PowerShell says -H is not recognized / A positional parameter cannot be found
You used PowerShell's fake curl. Type curl.exe (with .exe) and put the whole command on one line (no \ at line ends — that's Mac/Linux). Inside -d, escape the inner quotes as \", like the examples here.
I get 401 even though I just logged in
You're probably still using the placeholder YOUR-TOKEN or an old token. Log in again, copy the real token from the reply, and paste it after Bearer .
Which email goes where?
Your 3SKID email/password → Step 1 (becomes the token). The Apple emails/passwords → inside accounts. See the two accounts.
An account came back "Apple throttled — too many attempts"
That Apple ID (or the server) is temporarily rate-limited by Apple, usually from heavy testing. Wait ~30–60 min and retry; use fewer threads. You were not charged.
Do I need Python / to be a coder?
No. curl.exe (one command) or Postman (a form) need zero coding. Code is only for wiring it into your own website.
How do I stop a running job?
POST /v1/jobs/{id}/cancel with your token.
Base URL https://api.3skr-storeid.com/v1 · Auth = your 3SKID account (email+password → token) · Billed per success from your credits. The same quickstart lives in the app under the API Access tab.