FBegenicik
Descărcător de VideoclipuriFree API
Autentificare
Developers · v1.2.0

igsub.me Free API

100% free — no fees, no paid plans, no API key, no credit card. Free for everyone, forever.

A 100% free (no fees, no paid plans, no API key), public, browser-only JSON API for growing YouTube channels (subscribers, likes, comments, comment likes) and, when enabled, Instagram / TikTok / X / Facebook posts. There is no API key: your web page calls the API directly with fetch() (CORS), the visitor signs in with their own Google account, and every order spends that visitor's free credits. It is the same API our Blogger theme and our own sites use, so you can build a complete site with it: home page with order form, channel page, video page, order tracking page and account page. Every order is protected by hCaptcha.

💸 Completely freeNo fees, no paid tiers, no usage billing. Orders use free credits that refill every hour.
🔑 No API keyNothing to register. Your page calls https://igsub.me directly.
🌐 Browser onlyCORS from any website (Blogger, WordPress, static HTML). Server-side scripts are rejected.
👤 Free without sign-in100 free YouTube subscribers per channel without sign-in; Google sign-in unlocks everything else with free credits.
🎁 Earn creditsAdd your invite code: +1000 credits for every new user who signs in on your site.
📦 Everything includedLookup, orders, live progress, history, invites, credits — the same API as our Blogger theme.

Last updated 2026-10-25. Base URL https://igsub.me.

Quick start

Copy this into any page (inside <script type="module">). It signs the visitor in, reads the balance, finds a channel, passes hCaptcha, sends 100 subscribers and tracks the order.

// igsub.me public API — minimal client (no key, browser only)
const API = 'https://igsub.me';
const MY_REF = 'YOURCODE';     // your invite code: +1000 credits for every new user who signs in here
let token = localStorage.getItem('fs_token') || '';

async function api(path, { body, headers = {} } = {}) {
  const h = { 'X-FS-Mode': 'token', ...headers };
  if (body) h['Content-Type'] = 'application/json';
  if (token) h['Authorization'] = 'Bearer ' + token;
  const r = await fetch(API + path, {
    method: body ? 'POST' : 'GET',
    headers: h,
    body: body ? JSON.stringify(body) : undefined,
    mode: 'cors',
    credentials: 'omit',
  });
  const data = await r.json().catch(() => ({}));
  if (r.status === 401 && (data.kod === 'oturum_yok' || data.kod === 'kullanici_yok')) {
    token = ''; localStorage.removeItem('fs_token');          // expired -> sign in again
  }
  return { ok: r.ok, status: r.status, data };
}

// 1) hCaptcha — solved inside an igsub.me frame (no keys on your site)
function captcha() {
  return new Promise(resolve => {
    const box = document.createElement('div');
    box.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,.5);display:grid;place-items:center;z-index:9999';
    box.innerHTML = '<iframe src="' + API + '/captcha/frame.html" style="width:400px;max-width:95vw;height:560px;border:0;border-radius:12px;background:#fff"></iframe>';
    document.body.appendChild(box);
    function onMsg(e) {
      if (e.origin !== API || !e.data || !e.data.fsCaptcha) return;
      window.removeEventListener('message', onMsg); box.remove(); resolve(e.data.fsCaptcha);
    }
    window.addEventListener('message', onMsg);
    box.onclick = e => { if (e.target === box) { window.removeEventListener('message', onMsg); box.remove(); resolve(''); } };
  });
}

// 2) Sign in with Google (YouTube TV code)
async function signIn(onCode) {
  const ref = new URLSearchParams(location.search).get('ref') || MY_REF;
  const s = await api('/api/auth/device/start' + (ref ? '?ref=' + encodeURIComponent(ref) : ''), { body: {} });   // no captcha for sign-in
  if (!s.ok) throw new Error(s.data.error);
  onCode(s.data.user_code, s.data.qr_url, s.data.qr_image);   // show code + link/QR
  const until = Date.now() + s.data.expires_in * 1000;
  while (Date.now() < until) {
    await new Promise(r => setTimeout(r, Math.max(3, s.data.interval) * 1000));
    const p = await api('/api/auth/device/poll', { headers: { 'X-FS-Device': s.data.device_token } });
    if (p.data.status) { token = p.data.session_token; localStorage.setItem('fs_token', token); return; }
    if (['expired', 'no_flow', 'only gmail'].includes(p.data.message)) throw new Error(p.data.message);
  }
  throw new Error('expired');
}

// 3) Balance
const { data: { kredi } } = await api('/api/kredi');           // kredi.kredi = credits

// 4) Find a channel and order 100 subscribers
const ch = await api('/api/resolve', { body: { q: 'https://www.youtube.com/@channel' } });
const captcha_token = await captcha();
const order = await api('/api/order', { body: { tip: 'sub', hedef_kanal: ch.data.channel_id, adet: 100, captcha_token } });
if (!order.ok) console.log(order.data.kod, order.data.error);  // e.g. kredi_yok

// 5) Track it
const timer = setInterval(async () => {
  const o = (await api('/api/order/' + order.data.order_id)).data;
  console.log(o.status, o.biten_sayac + '/' + o.adet);
  if (['completed', 'canceled', 'failed'].includes(o.status)) clearInterval(timer);
}, 10000);

Rules & headers

HeaderWhenValue
X-FS-Modeevery requesttoken
Authorizationafter sign-inBearer <session_token>
Content-TypePOST with a bodyapplication/json
X-FS-Deviceonly /api/auth/device/poll<device_token>
X-FS-CaptchaPOST /api/referans/uygula, /api/kredi/kanal-topla<hCaptcha token>

fetch options: mode: 'cors', credentials: 'omit'. Origin, User-Agent, Accept-Language and Sec-Fetch-* are added by the browser automatically — do not try to set them.

Sign-in flow

Sign-in uses the YouTube TV device code: the visitor opens youtube.com/qr/activate (or scans a QR code with their phone), signs in with Google and approves. Your page never sees a password.

Visitor            Your page (browser)                      https://igsub.me
  |  click "Sign in"  |                                         |
  |------------------>| POST /api/auth/device/start (no captcha)|
  |                   |---------------------------------------->|
  |                   |<-- user_code, qr_url, device_token -----|
  |<-- show code -----|                                         |
  |  opens youtube.com/qr/activate, approves with Google        |
  |                   | GET /api/auth/device/poll (every 5s)    |
  |                   |   X-FS-Device: device_token             |
  |                   |---------------------------------------->|
  |                   |<-- { status: true, session_token } -----|
  |                   | save token -> Authorization: Bearer ... |
  |  paste channel    | POST /api/resolve { q }                 |
  |                   |<-- channel_id, videos ------------------|
  |  solves hCaptcha  | iframe igsub.me/captcha/frame.html     |
  |                   |<-- postMessage { fsCaptcha: token } ----|
  |  click "Send"     | POST /api/order { tip, hedef_kanal, adet, captcha_token }
  |                   |<-- order_id, status: queued ------------|
  |                   | GET /api/order/{order_id} (every 10s)   |
  |                   |<-- status, biten_sayac / adet ----------|
  1. POST /api/auth/device/start (no captcha; optionally ?ref=INVITECODE) → show user_code, a button to qr_url and the qr_image.
  2. Every interval seconds: GET /api/auth/device/poll with header X-FS-Device: device_token.
  3. When status is true, save session_token (e.g. localStorage) and send it as Authorization: Bearer.
  4. On next visits call GET /api/auth/me; a 401 means the token expired — delete it.

Free 100 subscribers (no sign-in)

// no Authorization header — anonymous visitor
const ch = await api('/api/resolve', { body: { q: 'https://youtube.com/@channel' } });
const captcha_token = await captcha();                       // igsub.me hCaptcha frame
let fp = localStorage.getItem('fs_fp');
if (!fp) { fp = crypto.randomUUID(); localStorage.setItem('fs_fp', fp); }
const o = await api('/api/order', { body: { tip: 'sub', hedef_kanal: ch.data.channel_id, captcha_token, fingerprint: fp } });
// o.data.order_id -> GET /api/order/{order_id}; on 401 giris_gerekli / 429 kanal_cooldown offer Google sign-in

Credits

Earn credits with your site

Your site can earn free credits for you: add your own invite code and every new user who signs in there counts as your invite.

// sign-in on your site, credited to you
POST https://igsub.me/api/auth/device/start?ref=YOURCODE
X-FS-Mode: token

// example page (starter-kit.html)
<script>window.FS_REF = 'YOURCODE';</script>

hCaptcha (required for orders, invites and credits — not for sign-in)

Every POST /api/order needs a fresh captcha_token in the body, and POST /api/referans/uygula and POST /api/kredi/kanal-topla need one in the X-FS-Captcha header. Sign-in (POST /api/auth/device/start) has no captcha. Our hCaptcha site key works only on igsub.me, so the check runs inside a small igsub.me page that you show in an iframe. You never need a captcha key or secret.

  1. When the visitor clicks “Send”, open a modal with <iframe src="https://igsub.me/captcha/frame.html">. It opens in the visitor's own browser language automatically; add ?hl=tr (any language code) to force one and theme=dark for dark mode. Give it about 400×560 px so the challenge fits.
  2. Listen for message events from origin https://igsub.me. When the visitor passes, you receive { fsCaptcha: "<token>" } ({ fsCaptchaExpired: true } if it expired before use).
  3. Close the modal and send the token: captcha_token in POST /api/order, or header X-FS-Captcha for invite / credit calls. A token works once; get a new one for each call.
  4. On captcha_yok / captcha_ret show the check again.
Frame parameters
ParameterDescription
hlLanguage of the check. Default (omitted or "auto"): the visitor's browser language, so nobody is forced into English. Force one with an hCaptcha language code: en, tr, es, pt, pt-BR, fr, de, it, nl, pl, ru, uk, ar, fa, hi, id, ms, th, vi, ja, ko, zh-CN, zh-TW, ro, cs, el, he, hu, sv, da, fi, no, bg, sr, hr, sk, sl, lt, lv, et and more. Unknown codes fall back to English.
theme"dark" for a dark check that matches dark mode; default light.
<!-- auto language (visitor's browser) -->
<iframe src="https://igsub.me/captcha/frame.html"></iframe>
<!-- forced Turkish, dark -->
<iframe src="https://igsub.me/captcha/frame.html?hl=tr&theme=dark"></iframe>
window.addEventListener('message', (e) => {
  if (e.origin !== 'https://igsub.me' || !e.data) return;
  if (e.data.fsCaptcha) placeOrder(e.data.fsCaptcha);   // -> POST /api/order { ..., captcha_token }
});

Endpoints

21 endpoints in 6 groups. All paths are relative to https://igsub.me. 🔒 = sign-in required · ◐ = works without sign-in (free 100 subscribers flow) · — = public.

MethodPathAuthPurpose
GET/api/site—Site information
GET/api/link-servisler—Service catalog
POST/api/auth/device/start—Start Google sign-in
GET/api/auth/device/poll—Poll sign-in
GET/api/auth/me🔒Current user
POST/api/auth/logout—Sign out
GET/api/kredi🔒Credit balance
GET/api/kredi/hareketler🔒Credit history
POST/api/referans/uygula🔒Apply an invite code
POST/api/kredi/kanal-topla🔒Claim extra-channel credits
POST/api/resolve◐Find a channel or video
GET/api/search🔒Search channels
GET/api/channel/{channelId}◐Channel page data
GET/api/channel/{channelId}/videos◐More channel videos / shorts
GET/api/video/{videoId}◐Video page data
POST/api/order◐Create an order
GET/api/order/{order_id}◐Order progress
GET/api/order/{order_id}/events◐Order timeline
GET/api/siparislerim🔒My orders
GET/api/siparislerim/{id}🔒One of my orders
GET/api/son-siparisler—Recent deliveries

Site & catalog

Public information. No sign-in needed.

GET/api/sitepublic

Site information

Name, languages and public settings of the API host. Call it once on page load if you want to show the brand or language list.

Response fields
NameTypeDescription
domainstringAPI host domain.
adstringBrand name.
varsayilan_dilstringDefault language code.
dillerstring[]Supported language codes.
secili_dilstringLanguage picked for this request (Accept-Language).
telegram_kanalstringTelegram channel link.
telegram_botstringTelegram bot link.
Response example
{
  "domain": "igsub.me",
  "ad": "iGSub",
  "varsayilan_dil": "en",
  "diller": ["en", "tr", "es", "pt", "ar", "fr", "de", "ru"],
  "secili_dil": "en",
  "telegram_kanal": "https://t.me/...",
  "telegram_bot": "https://t.me/..."
}

ℹ️ Other fields (analytics ids, verification tags) belong to igsub.me itself — ignore them.

GET/api/link-servislerpublic

Service catalog

Every service with its limits and credit price. Use it to build the service picker, quantity limits and the cost preview. Hide services where aktif is false.

Response fields
NameTypeDescription
servisler[]Service[]See the Service model.
Response example
{
  "servisler": [
    { "tip": "sub", "platform": "youtube", "tur": "sub", "min_adet": 10, "max_adet": 1000000, "kredi_carpani": 1, "min_referans": 0, "aktif": true, "sira": 0 },
    { "tip": "like", "platform": "youtube", "tur": "like", "min_adet": 10, "max_adet": 1000000, "kredi_carpani": 50, "min_referans": 3, "aktif": true, "sira": 6 },
    { "tip": "comment", "platform": "youtube", "tur": "comment", "min_adet": 1, "max_adet": 1000000, "kredi_carpani": 10, "min_referans": 100, "aktif": true, "sira": 7 },
    { "tip": "comment_like", "platform": "youtube", "tur": "comment_like", "min_adet": 10, "max_adet": 1000000, "kredi_carpani": 15, "min_referans": 5, "aktif": true, "sira": 8 },
    { "tip": "ig_views", "platform": "instagram", "tur": "views", "min_adet": 100, "max_adet": 2147483647, "kredi_carpani": 3, "min_referans": 0, "aktif": false, "sira": 1 }
  ]
}

ℹ️ cost in credits = quantity × kredi_carpani.

ℹ️ min_referans > 0 means the user needs that many invited friends before using the service (error referans_gerekli).

Authentication

Google sign-in with the YouTube TV device code flow. Produces the session token used everywhere else.

POST/api/auth/device/startpublic

Start Google sign-in

Creates a one-time code. Show user_code to the user and send them to qr_url (opens youtube.com/qr/activate with the code pre-filled) or show qr_image to scan with a phone. Keep device_token in memory for polling.

Limit: 12 starts per IP per 10 minutes

Query parameters
NameTypeDescription
refstringInvite code. Use YOUR code to earn +1000 credits for every new user who signs in on your site (or the visitor's ?ref= link if present). Applied when the sign-in completes; max 30 per code per day. Example: AB12CD34
Headers
NameTypeDescription
X-FS-ModerequiredstringMust be "token" so device_token / session_token are returned in JSON (no cookies). Example: token
Request example
POST https://igsub.me/api/auth/device/start

{}
Response fields
NameTypeDescription
user_codestringCode the user enters (format XXX-XXX-XXX).
qr_urlstringhttps://youtube.com/qr/activate/<code> — open in a new tab.
qr_imagestringPNG QR image URL of qr_url.
verification_urlstringPlain activation page (code typed manually).
intervalintegerSeconds to wait between polls (use at least 3).
expires_inintegerSeconds until the code expires.
device_tokenstringOpaque flow token; send it as X-FS-Device when polling.
Response example
{
  "ok": true,
  "user_code": "ABC-DEF-GHI",
  "qr_url": "https://youtube.com/qr/activate/ABC-DEF-GHI",
  "qr_image": "https://api.qrserver.com/v1/create-qr-code/?size=280x280&data=...",
  "verification_url": "https://www.google.com/device",
  "interval": 5,
  "expires_in": 1800,
  "device_token": "eyJ...signed"
}

Errors: rate_limitdevice_hata

GET/api/auth/device/pollpublic

Poll sign-in

Call every `interval` seconds until status is true, then save session_token (localStorage) and send it as Authorization: Bearer on every call. Always answers HTTP 200; read status/message.

Headers
NameTypeDescription
X-FS-Moderequiredstring"token" Example: token
X-FS-Devicerequiredstringdevice_token from /api/auth/device/start.
Response fields
NameTypeDescription
statusbooleantrue = signed in.
session_tokenstringPresent when status is true. Valid for 30 days.
messagestringWhen status is false: "not approved yet" (keep polling), "expired" / "no_flow" (start again), "only gmail" (only @gmail.com accounts), other values = temporary, keep polling.
Response example
{ "status": false, "message": "not approved yet" }

{ "status": true, "redirect_url": "/account", "session_token": "eyJ1aWQiOjEy...signed" }

ℹ️ New accounts receive a welcome credit bonus.

ℹ️ A user who already has an account gets the same account and credits (accounts are shared with igsub.me and the blog).

GET/api/auth/me🔒 sign-in required

Current user

Validate the stored token on page load. 401 oturum_yok / kullanici_yok = token expired or deleted: clear it and show the sign-in button.

Response fields
NameTypeDescription
kullanici.idintegerUser id.
kullanici.emailstringGmail address (show only to the user themself).
kullanici.adstringDisplay name.
kullanici.avatarstringAvatar URL.
kullanici.son_girisstring (date-time)Last sign-in.
Response example
{
  "ok": true,
  "kullanici": { "id": 156, "email": "[email protected]", "ad": "Name", "avatar": "https://lh3.googleusercontent.com/...", "son_giris": "2026-10-25T07:55:40Z" }
}

Errors: oturum_yokkullanici_yok

POST/api/auth/logoutpublic

Sign out

Tokens are stateless: signing out = deleting session_token from your storage. Calling this endpoint is optional.

Request example
POST https://igsub.me/api/auth/logout

{}
Response fields
NameTypeDescription
okbooleanAlways true.
Response example
{ "ok": true }

Account & credits

The signed-in user, credit balance, credit history, invites and extra-channel credits.

GET/api/kredi🔒 sign-in required

Credit balance

Spendable credits and invite info. Show kredi in the header and refresh it after every order.

Response fields
NameTypeDescription
kredi.krediintegerSpendable credits (1 credit = 1 unit × kredi_carpani).
kredi.referans_kodstringUser's own invite code. Invite link: https://igsub.me/?ref=<code>
kredi.davet_sayisiintegerFriends invited so far (unlocks min_referans services).
kredi.kanal_sayisiintegerExtra YouTube channels found on the account (each adds hourly credits).
kredi.gunluk_hakintegerFree credits added every hour.
kredi.sonraki_sifirlamastring (date-time)When the next free credits arrive (UTC).
Response example
{
  "ok": true,
  "kredi": { "kredi": 1000, "bonus_kredi": 0, "referans_kod": "8E6WNYMQ", "davet_sayisi": 0, "kanal_sayisi": 0, "gunluk_hak": 1000, "sonraki_sifirlama": "2026-10-25T08:00:00Z" }
}

Errors: oturum_yok

GET/api/kredi/hareketler🔒 sign-in required

Credit history

Credit movements, newest first.

Query parameters
NameTypeDescription
limitintegerDefault 50. Example: 30
offsetintegerPagination offset. Example: 0
Response fields
NameTypeDescription
hareketler[]CreditTx[]See the CreditTx model.
Response example
{
  "ok": true,
  "hareketler": [
    { "id": 991, "tur": "siparis", "miktar": -100, "aciklama": "tip=sub adet=100x1", "order_id": 3927, "olusturma": "2026-10-24T18:05:43Z" },
    { "id": 990, "tur": "saatlik", "miktar": 1000, "aciklama": "hourly", "olusturma": "2026-10-24T18:00:00Z" }
  ]
}

Errors: oturum_yok

POST/api/referans/uygula🔒 sign-in required

Apply an invite code

Manually apply a friend's invite code (the inviter gets +1000 credits). Usually not needed: pass ?ref= to device/start instead.

Headers
NameTypeDescription
X-FS-CaptcharequiredstringhCaptcha token from the igsub.me captcha frame (one token per call).
Body (JSON)
NameTypeDescription
kodrequiredstringInvite code. Example: AB12CD34
Request example
POST https://igsub.me/api/referans/uygula

{ "kod": "AB12CD34" }
Response fields
NameTypeDescription
okbooleantrue on success.
bonusintegerCredits given to the inviter.
Response example
{ "ok": true, "veren_id": 12, "bonus": 1000 }

Errors: captcha_yokcaptcha_retkod_yokreferans_gecersizreferans_kendireferans_varreferans_limit

POST/api/kredi/kanal-topla🔒 sign-in required

Claim extra-channel credits

Counts the extra YouTube channels on the user's Google account; every channel adds +1000 credits per hour. Once per hour (when called earlier you get beklemede=true and kalan_saniye).

Headers
NameTypeDescription
X-FS-CaptcharequiredstringhCaptcha token from the igsub.me captcha frame (one token per call).
Request example
POST https://igsub.me/api/kredi/kanal-topla

{}
Response fields
NameTypeDescription
kanal_sayisiintegerExtra channels found.
saatlik_kazancintegerCredits per hour from channels.
krediintegerNew balance.
beklemedebooleantrue = called too early.
kalan_saniyeintegerSeconds until it can be called again.
Response example
{ "ok": true, "kanal_sayisi": 3, "saatlik_kazanc": 3000, "kredi": 4000 }

{ "ok": true, "kanal_sayisi": 3, "saatlik_kazanc": 3000, "beklemede": true, "kalan_saniye": 2710 }

Errors: captcha_yokcaptcha_retoturum_yokkanal_alinamadi

YouTube lookup

Find channels and videos from any link, @handle or name. Needed to get the channel_id / video_id that orders use.

POST/api/resolve◐ sign-in optional

Find a channel or video

Accepts anything a user may paste: channel URL, @handle, /c/ or /user/ URL, channel name, video URL (watch, youtu.be, shorts) or a bare video id. Returns a channel (tip = "kanal") with its latest videos and similar channels, or a video (tip = "video").

Limit: 40 per minute per IP

Body (JSON)
NameTypeDescription
qrequiredstringUser input. Example: https://www.youtube.com/@MrBeast
Request example
POST https://igsub.me/api/resolve

{ "q": "https://www.youtube.com/@MrBeast" }
Response fields
NameTypeDescription
tip"kanal" | "video"What was found.
channel_idstringUC… id — use as hedef_kanal in orders.
adstringChannel name.
handlestringHandle without @ (channel only, may be empty).
avatarstringChannel avatar (channel only).
abone_sayiintegerSubscriber count (channel only).
video_sayiintegerVideo count (channel only).
aciklamastringChannel description (channel only).
videolar[]{id, baslik, kapak, bilgi}[]Latest videos (channel only). id = video id.
alternatifler[]{channel_id, ad, avatar, abone_sayi}[]Similar channels when the input was a name/handle — show "Not this channel?".
video_idstringVideo id (video only).
videoobjectVideo only: {id, baslik, aciklama, kapak, goruntulenme, sure_sn, yazar}.
Response example
{
  "tip": "kanal",
  "channel_id": "UCX6OQ3DkcsbYNE6H8uQQuVA",
  "ad": "MrBeast",
  "handle": "mrbeast",
  "avatar": "https://yt3.ggpht.com/...",
  "abone_sayi": 523000000,
  "video_sayi": 900,
  "aciklama": "...",
  "yontem": "handle",
  "videolar": [ { "id": "dQw4w9WgXcQ", "baslik": "Video title", "kapak": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg", "bilgi": "12M views" } ],
  "alternatifler": [ { "channel_id": "UC...", "ad": "MrBeast Gaming", "avatar": "...", "abone_sayi": 45000000 } ]
}

{
  "tip": "video",
  "video_id": "dQw4w9WgXcQ",
  "channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw",
  "ad": "Channel name",
  "video": { "id": "dQw4w9WgXcQ", "baslik": "Title", "aciklama": "...", "kapak": "...", "goruntulenme": 1500000000, "sure_sn": 213, "yazar": "Channel name" }
}

Errors: bos_girdicozulemedigiris_gereklirate_limit

GET/api/channel/{channelId}◐ sign-in optional

Channel page data

Full channel card plus the first 30 videos. Use it for a channel page (e.g. #/channel/UC...).

Path parameters
NameTypeDescription
channelIdrequiredstringUC… channel id. Example: UCX6OQ3DkcsbYNE6H8uQQuVA
Response fields
NameTypeDescription
kanalChannelSee the Channel model.
videolar[]Video[]See the Video model.
Response example
{
  "kanal": { "channel_id": "UCX6OQ3DkcsbYNE6H8uQQuVA", "handle": "mrbeast", "ad": "MrBeast", "aciklama": "...", "avatar": "...", "banner": "", "abone_sayi": 523000000, "video_sayi": 900, "ulke": "", "kategori": "" },
  "videolar": [ { "video_id": "...", "channel_id": "UC...", "baslik": "...", "kapak": "...", "goruntulenme": 1000000, "sure_sn": 900, "sira": 1 } ]
}

Errors: gecersiz_kanalkanal_yokgiris_gerekli

GET/api/channel/{channelId}/videos◐ sign-in optional

More channel videos / shorts

Paginated videos. Default tab uses limit/offset. For Shorts or live streams pass sekme=shorts|streams and page with the returned devam token (continuation).

Path parameters
NameTypeDescription
channelIdrequiredstringUC… channel id.
Query parameters
NameTypeDescription
limitinteger1–100, default 30 (videos tab). Example: 30
offsetintegerOffset (videos tab). Example: 30
sekme"videos" | "shorts" | "streams"Tab. Default videos. Example: shorts
continuationstringNext-page token (devam) for shorts/streams.
Response fields
NameTypeDescription
videolar[]Video[]Videos (shorts/streams return {video_id, channel_id, baslik, kapak}).
devamstringNext page token for shorts/streams ("" = end).
Response example
{ "channel_id": "UC...", "limit": 30, "offset": 30, "videolar": [ ... ] }

{ "channel_id": "UC...", "sekme": "shorts", "videolar": [ { "video_id": "...", "baslik": "...", "kapak": "..." } ], "devam": "4qmFsgK..." }

Errors: gecersiz_kanalsekme_hatagiris_gerekli

GET/api/video/{videoId}◐ sign-in optional

Video page data

Video details plus its channel card. Use it for a video page with like/comment ordering.

Path parameters
NameTypeDescription
videoIdrequiredstring11-character video id. Example: dQw4w9WgXcQ
Response fields
NameTypeDescription
videoobject{video_id, baslik, aciklama, channel_id, kapak, goruntulenme, sure_sn, etiketler[], yazar}
kanalChannel | {channel_id, ad}Channel of the video.
Response example
{
  "video": { "video_id": "dQw4w9WgXcQ", "baslik": "Title", "aciklama": "...", "channel_id": "UC...", "kapak": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg", "goruntulenme": 1500000000, "sure_sn": 213, "etiketler": ["music"], "yazar": "Channel" },
  "kanal": { "channel_id": "UC...", "ad": "Channel", "avatar": "...", "abone_sayi": 4000000 }
}

Errors: gecersiz_videovideo_yokgiris_gerekli

Orders

Create orders, follow live progress and list the user's history.

POST/api/order◐ sign-in optional

Create an order

Without sign-in: 100 free YouTube subscribers (tip sub only) once per channel, max 1 free order per hour per visitor, hCaptcha required. Signed in: spends credits (quantity × kredi_carpani) and starts delivery immediately. YouTube services need hedef_kanal (channel_id from /api/resolve); like and comment also need hedef_video. Instagram / TikTok / X / Facebook services need the full post URL in hedef_video and no hedef_kanal.

Limit: 30 orders per hour per user (external sites) · 20 per hour per IP

Body (JSON)
NameTypeDescription
tiprequiredstringService type from /api/link-servisler: sub, like, comment, comment_like (YouTube) · ig_views, ig_likes, tiktok_views, x_views, fb_likes (only when aktif). Example: sub
hedef_kanalstringYouTube channel_id (UC…). Required for YouTube services. Example: UCX6OQ3DkcsbYNE6H8uQQuVA
hedef_videostringYouTube video id (like, comment, comment_like) or full post URL (Instagram/TikTok/X/Facebook). Example: dQw4w9WgXcQ
adetintegerQuantity. Signed in: clamped to the service min/max and to what the balance can pay (omit = 100). Without sign-in: always 100 (omit it). Example: 100
captcha_tokenrequiredstringhCaptcha token, required for every order. Get it from the igsub.me captcha frame (see "hCaptcha" section): open https://igsub.me/captcha/frame.html in an iframe and read the token from the postMessage { fsCaptcha }. Single use.
fingerprintstringStable device id (random string kept in localStorage). Recommended without sign-in: the free quota is counted per IP + fingerprint.
Request example
POST https://igsub.me/api/order

{ "tip": "sub", "hedef_kanal": "UCX6OQ3DkcsbYNE6H8uQQuVA", "adet": 100, "captcha_token": "P1_eyJ0eXAi..." }

{ "tip": "like", "hedef_kanal": "UCX6OQ3DkcsbYNE6H8uQQuVA", "hedef_video": "dQw4w9WgXcQ", "adet": 50, "captcha_token": "P1_eyJ0eXAi..." }

{ "tip": "tiktok_views", "hedef_video": "https://www.tiktok.com/@user/video/7300000000000000000", "adet": 1000, "captcha_token": "P1_eyJ0eXAi..." }
Response fields
NameTypeDescription
order_idstringUnguessable order token. Keep it: it is the key for tracking (share links like #/order/<order_id>).
statusOrderStatusUsually "queued"; "failed" if dispatch failed (credits refunded automatically).
durumstringSame status, internal name.
adetintegerFinal quantity after clamping.
Response example
{ "ok": true, "order_id": "c43a7ec92aef79f3e7f96c1b55125d44", "durum": "kuyrukta", "status": "queued", "adet": 100 }

Errors: giris_gereklikanal_cooldowncaptcha_yokcaptcha_retgecersiz_tiphedef_yoklink_gecersizservis_yokkredi_yokmin_kredireferans_gereklirate_limitgecersiz_govde

ℹ️ Every order needs a fresh hCaptcha token (one token = one order).

ℹ️ Request body must contain only these fields (unknown fields → 400 gecersiz_govde).

ℹ️ Refresh /api/kredi after an order.

GET/api/order/{order_id}◐ sign-in optional

Order progress

Live progress, synced with the delivery engine on every call. Poll every 8–15 seconds while the status is not final. Progress = biten_sayac / adet.

Path parameters
NameTypeDescription
order_idrequiredstringToken from /api/order.
Response fields
NameTypeDescription
order_idstringOrder token.
tipstringService type.
statusOrderStatuspending | queued | in_progress | completed | canceled | failed.
adetintegerOrdered quantity.
baslangic_sayacintegerCounter (subscribers/likes) when delivery started; 0 until known.
biten_sayacintegerUnits delivered so far.
hedef_kanalstringTarget channel.
hedef_videostringTarget video / link.
olusturmastring (date-time)Created at.
bitenstring (date-time) | nullFinished at.
Response example
{
  "order_id": "c43a7ec92aef79f3e7f96c1b55125d44",
  "tip": "sub",
  "durum": "calisiyor",
  "status": "in_progress",
  "adet": 100,
  "baslangic_sayac": 18300,
  "biten_sayac": 40,
  "hedef_kanal": "UCKtuGDfMjgNe5M9Eu_XsdRw",
  "hedef_video": "",
  "olusturma": "2026-10-24T18:05:43Z",
  "biten": null
}

Errors: siparis_yokgiris_gerekli

GET/api/order/{order_id}/events◐ sign-in optional

Order timeline

Step-by-step events for a timeline view.

Path parameters
NameTypeDescription
order_idrequiredstringOrder token.
Response fields
NameTypeDescription
olaylar[]OrderEvent[]See the OrderEvent model.
Response example
{
  "order_id": "c43a7ec9...",
  "olaylar": [
    { "id": 1, "olay": "olusturuldu", "detay": "tip=sub adet=100", "ts": "2026-10-24T18:05:43Z" },
    { "id": 2, "olay": "kuyruga_alindi", "detay": "ref=...", "ts": "2026-10-24T18:05:44Z" }
  ]
}

Errors: siparis_yok

GET/api/siparislerim🔒 sign-in required

My orders

The signed-in user's orders on every site, newest first, with the latest event.

Query parameters
NameTypeDescription
limitintegerDefault 50. Example: 20
offsetintegerPagination offset. Example: 0
Response fields
NameTypeDescription
siparisler[]OrderSummary[]See the OrderSummary model. Link each row with public_token.
Response example
{
  "ok": true,
  "siparisler": [
    { "id": 3927, "public_token": "c43a7ec9...", "platform": "youtube", "tip": "sub", "hedef_kanal": "UC...", "hedef_video": "", "adet": 1000, "durum": "tamamlandi", "status": "completed", "baslangic_sayac": 18300, "biten_sayac": 1000, "son_olay": "kuyruga_alindi", "olusturma": "2026-10-24T18:05:43Z", "biten": "2026-10-24T18:41:02Z" }
  ]
}

Errors: oturum_yok

GET/api/siparislerim/{id}🔒 sign-in required

One of my orders

Summary plus full event list of one order owned by the user (numeric id from /api/siparislerim).

Path parameters
NameTypeDescription
idrequiredintegerNumeric order id.
Response fields
NameTypeDescription
siparisOrderSummaryOrder summary.
olaylar[]OrderEvent[]Events.
Response example
{ "ok": true, "siparis": { ... }, "olaylar": [ ... ] }

Errors: gecersiz_idsiparis_yokoturum_yok

Social proof

Recent completed deliveries (masked names) for a live activity feed.

GET/api/son-siparislerpublic

Recent deliveries

Latest completed orders across all sites for a "just delivered" ticker. Names are masked server-side; no e-mail, channel or IP is returned. Cached 30 seconds.

Response fields
NameTypeDescription
siparisler[]{tip, adet, ad, saniye_once}[]ad = masked name ("" = guest), saniye_once = seconds ago.
Response example
{ "siparisler": [ { "tip": "sub", "adet": 100, "ad": "Al***", "saniye_once": 42 }, { "tip": "like", "adet": 50, "ad": "", "saniye_once": 95 } ] }

Data models

Service

Item of /api/link-servisler.

Fields
NameTypeDescription
tipstringService type used in orders.
platformstringyoutube | instagram | tiktok | x | facebook
turstringsub | like | comment | comment_like | views | likes
min_adetintegerMinimum quantity.
max_adetintegerMaximum quantity per order.
kredi_carpaniintegerCredits per unit.
min_referansintegerInvites needed to unlock (0 = open).
aktifbooleanfalse = hide it.
siraintegerDisplay order.

Channel

YouTube channel card.

Fields
NameTypeDescription
channel_idstringUC… id.
handlestringHandle without @.
adstringName.
aciklamastringDescription.
avatarstringAvatar URL.
bannerstringBanner URL (may be empty).
abone_sayiintegerSubscribers.
video_sayiintegerVideos.

Video

Video card in channel lists.

Fields
NameTypeDescription
video_idstringVideo id.
channel_idstringChannel id.
baslikstringTitle.
aciklamastringDescription.
kapakstringThumbnail URL (fallback: https://i.ytimg.com/vi/<id>/mqdefault.jpg).
goruntulenmeintegerViews.
sure_snintegerDuration in seconds.
etiketlerstring[]Tags.

OrderSummary

Row of /api/siparislerim.

Fields
NameTypeDescription
idintegerNumeric id (for /api/siparislerim/{id}).
public_tokenstringOrder token (for /api/order/{order_id}).
platformstringPlatform.
tipstringService type.
hedef_kanalstringTarget channel.
hedef_videostringTarget video / link.
adetintegerQuantity.
statusOrderStatusEnglish status.
baslangic_sayacintegerStart count.
biten_sayacintegerDelivered.
son_olaystringLatest event name.
olusturmastring (date-time)Created.
bitenstring (date-time)Finished (omitted while running).

OrderEvent

Timeline item.

Fields
NameTypeDescription
olaystringolusturuldu (created) · kuyruga_alindi (queued for delivery) · teslimat_hata (dispatch error) · kredi_iade (credits refunded) · otomatik_sonlandir (closed automatically)
detaystringFree text detail.
tsstring (date-time)Time.

CreditTx

Credit history row.

Fields
NameTypeDescription
turstringsaatlik (hourly free credits) · hosgeldin (welcome bonus) · referans_bonus (invite bonus) · siparis (order, negative) · iade (refund)
miktarinteger+ added / − spent.
aciklamastringDetail.
order_idintegerRelated order (optional).
olusturmastring (date-time)Time.

Order status

pending → queued → in_progress → completed. Final states: completed, canceled, failed. Responses also carry the internal name in durum.

statusdurumMeaning
pendingbeklemedeCreated, not yet sent to delivery.
queuedkuyruktaAccepted by the delivery engine, waiting to start.
in_progresscalisiyorDelivering. biten_sayac grows.
completedtamamlandiFinished (final).
cancelediptalCanceled (final).
failedhataCould not be dispatched; credits refunded (final).

Errors

Every error has an HTTP status and a body like { "kod": "kredi_yok", "error": "not enough credits", "hata": "not enough credits" }. Show your own text based on kod — this is how you translate the API into any language.

kodHTTPMeaningWhat to do
giris_gerekli401Sign in required (or the free no-sign-in quota is used up for this channel/visitor).Open the sign-in dialog: signed-in users order with credits.
kanal_cooldown429This channel already received a free order in the last hour.Sign in or try again later.
oturum_yok401Token missing, invalid or expired.Delete the token, ask to sign in again.
kullanici_yok401Account no longer exists.Delete the token.
browser_required403Not a real browser request (server-side script).Call the API from a web page.
not_public403Endpoint not available to external sites.Do not use it.
captcha_yok400hCaptcha token missing (captcha_token in /api/order, X-FS-Captcha header for invite code / channel credits).Show the hCaptcha frame and send its token.
captcha_ret400hCaptcha token invalid, expired or already used.Show the hCaptcha frame again.
kredi_yok402Not enough credits.Show the balance, invite link and next refill time.
min_kredi402Balance below the service minimum.Same as above.
referans_gerekli403Service needs more invites ("x/y" in message).Show the invite link.
rate_limit429Too many requests.Wait and retry with backoff.
gecersiz_govde400Invalid JSON or unknown field.Fix the request body.
gecersiz_tip400Unknown service type.Use a tip from /api/link-servisler.
hedef_yok400hedef_kanal missing.Resolve the channel first.
servis_yok400Service disabled.Hide it.
bos_girdi400Empty input.Validate before sending.
cozulemedi422Channel/video not found.Ask for another link.
kanal_yok404Channel not found.—
video_yok404Video not found.—
siparis_yok404Order not found.—
referans_gecersiz404Invite code not found.—
referans_kendi400Own invite code.—
referans_var409Invite already used.—
referans_limit429Invite limit for this network/account.—
kanal_alinamadi502Could not read the user's channels.Ask to sign in again.
device_hata502Sign-in could not start.Retry.
db_hata500Temporary server error.Retry later.

Rate limits & security

ScopeLimit
All /api calls6 requests/second per IP (burst 60). Abusive IPs are banned automatically for 60 minutes.
Heavy calls (resolve, search, order, channel, video, device start)30 per minute per IP (burst 15).
Per user (external sites)90 requests per minute.
Orders per user (external sites)30 per hour, plus the credit balance.
Free orders without sign-in100 subscribers once per channel; 1 per hour per visitor (IP + fingerprint); 1 per hour per channel; shared hourly cap for all external sites.
Per site (Origin)1500 requests per minute.
Sign-in starts12 per IP per 10 minutes.
Resolve40 per minute per IP.

Build a full site

These are the exact pages of our Blogger theme. Use hash routes (#/channel/…) so it works on any static host, including Blogger.

Header (every page)

  1. On load: if a token is stored call GET /api/auth/me. 200 → show avatar + name; 401 → delete the token, show "Sign in with Google" (no captcha for sign-in).
  2. Show the balance from GET /api/kredi (kredi.kredi). Refresh it after each order.
  3. Optional: a search box that sends any link/@handle/name to your channel/video page.

Home page with order form

  1. GET /api/link-servisler → build service tabs from items with aktif = true (YouTube: sub, like, comment, comment_like; others when active).
  2. Input "channel or video link" → POST /api/resolve. tip = "kanal": show avatar, name, abone_sayi, videolar; tip = "video": show the video card.
  3. If alternatifler is not empty show "Not this channel?" with those channels.
  4. Quantity input limited by min_adet / max_adet; show cost = adet × kredi_carpani and the user's balance. Lock services where min_referans > davet_sayisi.
  5. Send → open the hCaptcha frame (https://igsub.me/captcha/frame.html in an iframe), wait for the postMessage token, then POST /api/order with captcha_token. On success go to the order page with order_id. On error show the message for kod (kredi_yok → invite link + next refill time, captcha_ret → show the check again).
  6. Optional live feed: GET /api/son-siparisler every 30 s ("Al*** received 100 subscribers 42 s ago").

Channel page (e.g. #/channel/UC…)

  1. GET /api/channel/{channelId} → channel header (avatar, banner, abone_sayi, video_sayi, aciklama) + first 30 videos.
  2. "Load more": GET /api/channel/{channelId}/videos?offset=30. Shorts tab: ?sekme=shorts then pass devam as continuation.
  3. Subscriber order form on top (tip sub, hedef_kanal = channelId); clicking a video opens the video page.

Video page (e.g. #/video/VIDEO_ID)

  1. GET /api/video/{videoId} → title, thumbnail or YouTube embed (https://www.youtube.com/embed/VIDEO_ID), views, duration, channel card.
  2. Order buttons for like, comment, comment_like (hedef_kanal = video.channel_id, hedef_video = video id) and sub.

Order tracking page (e.g. #/order/ORDER_ID)

  1. GET /api/order/{order_id} every 10 s → progress bar biten_sayac / adet, status badge, start count.
  2. GET /api/order/{order_id}/events → timeline. Stop polling when status is completed, canceled or failed.
  3. The order_id link can be shared; it only shows progress, never personal data.

Account page

  1. GET /api/kredi → balance, gunluk_hak, sonraki_sifirlama (countdown), referans_kod (invite link https://igsub.me/?ref=CODE + share buttons), davet_sayisi.
  2. Button "Claim channel credits" → hCaptcha frame → POST /api/kredi/kanal-topla with X-FS-Captcha (once per hour).
  3. Field "Have an invite code?" → hCaptcha frame → POST /api/referans/uygula with X-FS-Captcha.
  4. Tables: GET /api/siparislerim (orders, link to order page with public_token) and GET /api/kredi/hareketler (credit history).
  5. Sign out = delete the stored token.

Example page

Our Blogger theme as one HTML file — the same design and the same features: home page with service tabs and live deliveries, channel page with videos and Shorts, video page, order tracking with timeline, account page with credits, invites and history, Google sign-in, hCaptcha check, dark mode, header search and popular searches. Upload it as index.html anywhere and change “My Site” to your name. Built-in languages: English and Turkish (window.FS_DIL = 'tr'); all texts are inside the script.

FAQ

Is the API really free?

Yes. There are no fees, no paid plans and no usage billing — for you and for your visitors. Orders use free credits that refill every hour.

Can I earn credits with my site?

Yes. Pass your invite code to /api/auth/device/start?ref=YOURCODE (or set window.FS_REF in the example page). Every new user who signs in on your site gives you +1000 credits (max 30 per day).

Do I need an API key?

No. There are no keys. The visitor signs in with Google on your page and uses their own credits.

Can I call it from PHP / Node / Python / cURL?

No. Only real browsers are accepted (403 browser_required). Build your page in HTML + JavaScript; the visitor's browser calls the API.

Does it work on Blogger / WordPress / Wix / GitHub Pages?

Yes — anywhere you can add HTML and JavaScript. All calls go to https://igsub.me with CORS.

Can visitors order without signing in on my site?

Yes, but only the free 100 YouTube subscribers: once per channel, max 1 per hour per visitor, with hCaptcha. Likes, comments, other platforms and bigger orders need Google sign-in (free credits).

Is there a captcha?

Yes: every order, invite code and channel-credit claim needs hCaptcha (sign-in does not). It runs inside a small igsub.me frame (https://igsub.me/captcha/frame.html), so you need no captcha keys — you receive the token via postMessage and send it (captcha_token for orders, X-FS-Captcha header for the others).

Which Google accounts work?

@gmail.com accounts.

How long is a session valid?

30 days. On 401 oturum_yok ask the user to sign in again.

Is there an invite reward?

Yes: every friend who signs in with the user's invite code gives that user +1000 credits.

Which language are responses in?

Errors and status are English (kod is language-neutral). Translate your UI freely.

Is there a sandbox?

No. Use a test channel and small quantities; credits are free.

Where is the machine-readable spec?

OpenAPI 3.1: https://igsub.me/developers/openapi.json — plain text / Markdown for AI assistants: https://igsub.me/developers/llms.txt

Changelog

v1.2.0 2026-10-25

  • Sign-in (POST /api/auth/device/start) no longer needs hCaptcha. hCaptcha stays required for orders, invite codes and channel credits.
  • Admin statistics per external site (requests, sign-ins, orders).

v1.1.0 2026-10-25

  • hCaptcha is required for every order (captcha_token) and for sign-in start, invite codes and channel credits (X-FS-Captcha header). Solved in the igsub.me frame https://igsub.me/captcha/frame.html — no keys needed.
  • Site owners can pass their own invite code (?ref=CODE / window.FS_REF) and earn +1000 credits per new user who signs in on their site.
  • The example page (starter-kit.html) is now identical to our Blogger theme.
  • Cross-site API is served only from https://igsub.me.
  • Free without sign-in: 100 YouTube subscribers once per channel (resolve, channel, video, order and tracking work without sign-in; hCaptcha required).
  • The hCaptcha frame opens in the visitor's browser language by default (?hl=auto); ?hl=xx forces a language.

v1.0.0 2026-10-25

  • First public release: no API key, browser-only CORS, Google sign-in, English errors (kod + error) and English order status.

For AI assistants

If you are an AI model helping someone build a site with this API: read /developers/llms.txt (full reference in Markdown) or import /developers/openapi.json (OpenAPI 3.1). Generate browser JavaScript only (fetch with X-FS-Mode: token and Authorization: Bearer), never server-side code, and never invent API keys.

Prefer the hosted tool? Use Begenicik directly.

Bot