Documentație

Documentație API

Tot ce face panoul este disponibil prin HTTP. Îndreaptă un panou SMM către un singur endpoint sau conduce întreaga platformă — catalog, campanii, jurnale, facturi — dintr-un script sau dintr-un agent AI.

Pe această pagină

Prezentare generală

Toplistbot expune două API-uri HTTP. Ambele sunt JSON peste HTTPS, ambele consumă același sold de token-uri, iar oricare dintre ele este suficientă pentru a rula campanii fără a deschide vreodată panoul.

URL de bază

Base URL
https://backend.toplistbot.com/api
https://backend.toplistbot.com

Referința de mai jos este scrisă pentru aceste două gazde. Care dintre ele o folosești decide cum te autentifici — vezi Autentificare.

Primii pași

De la un cont nou la o campanie activă în cinci pași. Totul de mai jos folosește endpointul SMM, cea mai rapidă cale de intrare; API-ul platformei funcționează la fel odată ce ai un JWT.

  1. Creează un cont

    Înregistrează-te și confirmă-ți adresa de e-mail. Confirmarea îți adaugă 100 de jetoane gratuite în sold, suficient pentru o campanie reală înainte să cheltui ceva.

  2. Copiază-ți cheia API

    Deschide panoul și generează o cheie API. Tratează-o ca pe o parolă — consumă din soldul tău de jetoane. O poți regenera oricând, iar cea veche devine imediat invalidă.

  3. Găsește serviciul dorit

    Listează toate site-urile pe care poți plasa comenzi. Fiecare intrare are un id numeric de serviciu și un tarif în jetoane la 1.000 de acțiuni. Notează id-ul site-ului pe care vrei să promovezi.

    cURL
    curl -X POST https://backend.toplistbot.com/api/v2 -d "key=YOUR_API_KEY" -d "action=services"
  4. Plasează prima comandă

    Trimite id-ul serviciului, URL-ul pe care rulează campania și câte acțiuni să execute. Costul se deduce imediat, iar răspunsul îți dă un id de comandă.

    cURL
    curl -X POST https://backend.toplistbot.com/api/v2 \
      -d "key=YOUR_API_KEY" \
      -d "action=add" \
      -d "service=9" \
      -d "link=https://arena-top100.com/index.php?a=in&u=yourserver" \
      -d "quantity=1000"
  5. Urmărește livrarea

    Interoghează id-ul comenzii pentru a vedea cât s-a livrat. Când ești mulțumit de flux, conectează aceleași apeluri în propriul panou sau în scripturile tale.

    cURL
    curl -X POST https://backend.toplistbot.com/api/v2 -d "key=YOUR_API_KEY" -d "action=status" -d "orders=184223"

Conectarea unei instanțe Perfect Panel

Dacă folosești Perfect Panel sau software compatibil de panou SMM, nu trebuie să scrii cod — adaugă Toplistbot ca furnizor cu setările de mai jos și importă lista de servicii.

URL API
https://backend.toplistbot.com/api/v2
Cheie API
YOUR_API_KEY
Metodă HTTP
POST

Începe cu o cantitate mică pe un singur site, ca să confirmi că formatul linkului este acceptat, înainte să crești volumul. Un link greșit consumă tot jetoane.

Automatizare cu un agent AI

Această pagină are un geamăn în text simplu, scris pentru mașini. Dă-i unui agent acel URL și cheia ta API și are tot ce îi trebuie: lista completă de endpoint-uri, formatele cererilor și răspunsurilor, aritmetica prețurilor, codurile de eroare și exemple complete.

Referință citibilă de mașini

Un singur document, fără autentificare și fără JavaScript. Descarcă-l, lipește-l într-un prompt sau dă URL-ul unei unelte care poate naviga.

https://toplistbot.com/llms.txt

Prompt de pornire

Lipește asta în Claude sau în orice agent care poate face cereri HTTP. Ține cheia într-o variabilă de mediu, nu în mesajul propriu-zis.

Prompt
Read https://toplistbot.com/llms.txt — it is the complete Toplistbot API reference.

My API key is in the TOPLISTBOT_KEY environment variable. Using the API-key
surface (paths without the /api prefix):

  1. list the sites in the catalog that cost under 20 tokens per 1,000 votes
  2. tell me my token balance
  3. propose a campaign for <my vote URL> that fits a budget of <N> tokens

Do not place the order until I confirm the cost.

O cheie API este credențialul potrivit pentru un agent: nu expiră, nu este afectată de autentificarea în doi pași, iar rotirea ei din panou revocă accesul instantaneu dacă va fi nevoie.

Autentificare

Există două credențiale, iar de care ai nevoie depinde de cale, nu de endpoint. Aproape fiecare endpoint este montat de două ori.

Prefixul /api decide credențialul

Același handler stă în spatele ambelor căi. Scoate prefixul /api și API-ul platformei acceptă o cheie API de lungă durată; păstrează-l și endpoint-ul așteaptă un JWT obținut la autentificare.

CaleCredențialFolosește pentru
/api/orders/getAllJWTOrice loc în care o persoană se autentifică
/orders/getAllCheie APIScripturi, sarcini programate, agenți

Pentru automatizare, preferă căile fără prefix. Nu există autentificare, expirare sau sesiune de întreținut — o singură cheie face totul, iar autentificarea în doi pași nu îți stă niciodată în cale.

Cheie API

Trimite cheia ca un câmp `key` în orice cerere: parametru de interogare, câmp de formular, câmp JSON sau antet `Authorization: Bearer`. Generează-o și rotește-o din panou. Un GET către /api/v2 întoarce starea ok și este o metodă ieftină de a verifica dacă o cheie este validă.

cURL
# any of these three carry the key
curl "https://backend.toplistbot.com/orders/getAll?key=YOUR_API_KEY"
curl -X POST https://backend.toplistbot.com/orders/pause -d "key=YOUR_API_KEY" -d "id=184223"
curl https://backend.toplistbot.com/orders/getAll -H "Authorization: Bearer YOUR_API_KEY"
Health check
curl https://backend.toplistbot.com/api/v2?key=YOUR_API_KEY

JWT

Autentifică-te pentru a primi un token, apoi trimite-l ca bearer token pe rutele /api. Token-urile expiră, deci apelează /auth/refresh înainte. Dacă contul are autentificare în doi pași, autentificarea are nevoie și de `two_factor_code`.

Login
curl -X POST https://backend.toplistbot.com/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","password":"..."}'
Response
{
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
  "token_type": "bearer",
  "expires_in": 3600,
  "user": { "id": 4211, "email": "[email protected]", "tokens": 528.41, "...": "..." }
}
Authenticated request
curl https://backend.toplistbot.com/api/orders/getAll \
  -H "Authorization: Bearer YOUR_JWT"

Apeluri din browser

Toate rutele răspund cu Access-Control-Allow-Origin deschis, deci o pagină, o extensie de browser sau un agent care rulează în browser pot apela API-ul direct, fără să ridici tu un proxy. Avertismentul de mai sus rămâne valabil: o cheie trimisă în browser este o cheie publicată, așa că asta e pentru uneltele tale, nu pentru o pagină publică.

JavaScript
// Works from a page, an extension, or a browser-based agent.
const sites = await fetch(
  'https://backend.toplistbot.com/orders/getAllWebsites'
).then(r => r.json())

Cheia ta API cheltuie sold real de token-uri. Ține-o pe server: orice cheie trimisă într-un browser sau urcată într-un repository trebuie tratată ca fiind compromisă și rotită din panou.

Jetoane și prețuri

Campaniile se plătesc în jetoane, cumpărate în avans. Fiecare site publică un tarif — câte jetoane costă 1.000 de acțiuni de campanie acolo — returnat ca `rate` de acțiunea services.

Cost formula
cost_in_tokens = (rate * quantity) / 1000

Un site cu tariful 13 costă 13 jetoane pentru 1.000 de acțiuni, deci o comandă de 500 costă 6,5 jetoane. Costul se deduce la acceptarea comenzii, iar anularea returnează restul necheltuit.

Răspunsurile balance și status raportează un câmp de monedă USD pentru compatibilitate cu Perfect Panel, dar valoarea este un sold de jetoane, nu dolari. Tratează numărul ca jetoane.

API panou SMM

Un singur endpoint face totul. Trimite un câmp `action` cu fiecare POST pentru a alege operațiunea; fiecare cerere include și `key`.

POSThttps://backend.toplistbot.com/api/v2
AcțiuneParametri
services
addservice, link, quantity, interval?
statusorders
balance
cancelorders

`refill` și `refill_status` sunt acceptate pentru compatibilitate și ambele răspund "neimplementat". Nimic de aici nu este realimentabil; comandă din nou.

action=services

Listează toate site-urile pe care poți comanda, cu tariful curent și limitele. Folosește id-ul `service` în apelurile add.

cURL
curl -X POST https://backend.toplistbot.com/api/v2 \
  -d "key=YOUR_API_KEY" \
  -d "action=services"
Response
[
  {
    "service": 9,
    "name": "arena-top100.com 1000 upvotes",
    "type": "Default",
    "category": "Votes",
    "rate": 15,
    "min": 1,
    "max": 50000,
    "refill": false,
    "cancel": true
  }
]

`rate` este în jetoane la 1.000 de acțiuni. `min` este 1 și `max` este 50000 pentru fiecare serviciu.

action=add

Creează o campanie și îi deduce imediat costul din soldul tău.

ParametruTipDescriere
keyobligatoriustringCheia ta API.
actionobligatoriustringTrebuie să fie `add`.
serviceobligatoriuintegerId-ul serviciului din acțiunea services.
linkobligatoriuurlURL-ul pe care rulează campania. Trebuie să fie un URL valid.
quantityobligatoriuintegerNumărul de acțiuni de executat, între 1 și 50000.
intervalintegerAcțiuni pe oră. Implicit 15, plafonat la 4000, și nu poate depăși maximul propriu al site-ului.
cURL
curl -X POST https://backend.toplistbot.com/api/v2 \
  -d "key=YOUR_API_KEY" \
  -d "action=add" \
  -d "service=9" \
  -d "link=https://arena-top100.com/index.php?a=in&u=yourserver" \
  -d "quantity=1000" \
  -d "interval=60"
Response
{
  "order_id": 184223
}

action=status

Returnează progresul pentru una sau mai multe comenzi. Trimite un singur id pentru un obiect simplu sau o listă separată prin virgulă.

cURL
curl -X POST https://backend.toplistbot.com/api/v2 \
  -d "key=YOUR_API_KEY" \
  -d "action=status" \
  -d "orders=184223"
Response — single order
{
  "charge": 13.5,
  "start_count": 0,
  "status": "Completed",
  "remains": 1000,
  "currency": "USD"
}

Cu mai multe id-uri, răspunsul este indexat după id-ul comenzii, iar comenzile necunoscute sau care nu îți aparțin returnează o intrare de eroare în loc să pice întreaga cerere.

Response — multiple orders
{
  "184223": { "charge": 13.5, "start_count": 0, "status": "Completed", "remains": 1000, "currency": "USD" },
  "184224": { "error": "Incorrect order ID" }
}

Citește `remains`, nu `status`

`status` este întotdeauna literalul "Completed". Câmpul există fiindcă orice client Perfect Panel îl cere, iar panourile tratează orice altă valoare drept candidat la realimentare — ceva ce această platformă nu oferă. Progresul stă în cifre: `remains` sunt voturile acceptate rămase de livrat, deci `remains == 0` înseamnă că respectiva comandă s-a încheiat. `start_count` este ce s-a livrat până acum, iar `charge` este cât a costat. Ambele sunt măsurate față de rata de acceptare a site-ului, deci numără voturile cumpărate, nu încercările brute.

`status` și `cancel` acceptă cel mult 100 de id-uri de comandă per apel. Grupează în loc să iterezi: un apel cu 100 de id-uri este mult mai ieftin pentru ambele părți decât 100 de apeluri.

action=balance

Returnează soldul rămas de jetoane.

cURL
curl -X POST https://backend.toplistbot.com/api/v2 \
  -d "key=YOUR_API_KEY" \
  -d "action=balance"
Response
{
  "balance": 528.41,
  "currency": "USD"
}

action=cancel

Oprește o comandă și returnează restul necheltuit în sold. Comenzile finalizate nu pot fi anulate.

cURL
curl -X POST https://backend.toplistbot.com/api/v2 \
  -d "key=YOUR_API_KEY" \
  -d "action=cancel" \
  -d "orders=184223,184224"
Response
[
  { "order": "184223", "cancel": 1, "refund": 4.5 },
  { "order": "184224", "cancel": { "error": "Incorrect order ID" } }
]

API platformă

Același API REST pe care îl folosește panoul. Căile de mai jos sunt scrise în forma cu cheie API, fără prefixul /api. Adaugă /api și schimbă cheia cu un JWT pentru forma cu sesiune; endpoint-urile marcate JWT există doar sub /api.

Catalog și descoperire

Public, fără credențial. getAllWebsites este endpoint-ul de la care pornești: aduce id-ul, prețul, plafonul orar și rata de acceptare de care ai nevoie ca să calculezi prețul și să dimensionezi o comandă.

  • GET/orders/getAllWebsitesPublicăCatalogul complet: fiecare site cu tarife, limite și metadate
  • GET/orders/getAllBasicWebsitesDetailsPublică20 de nume de site la întâmplare, pentru widget-uri și autocompletare
  • POST/orders/getWebsiteDetailsByNamePublicăUn site după numele exact
  • POST/products/getSuggestionsPublicăSite-uri înrudite cu un set de id-uri
  • GET/products/demand?days=30PublicăCât de mult a fost comandat fiecare site recent
  • GET/products/tokensPublicăPachete de token-uri pe care le poți cumpăra
  • POST/products/suggestCheie APICere-ne să adăugăm un site nou
  • GET/api/news/timelinePublicăJurnalul de noutăți al produsului
cURL
curl "https://backend.toplistbot.com/orders/getAllWebsites"

Cere mai puțin

Catalogul întreg are în jur de 665 KB pentru 396 de site-uri, iar două câmpuri cu care nu vei comanda niciodată reprezintă jumătate din el: un bloc JSON de popularitate și descrierea de marketing. Păstrează doar câmpurile cu care comanzi și renunță la site-urile inactive și ajunge la circa 40 KB.

cURL + jq
# The whole catalog is ~665 KB across 396 sites.
# Projected to what you actually order with: ~40 KB.
curl -s "https://backend.toplistbot.com/orders/getAllWebsites" \
  | jq '[.[]
      | select(.active == 1)
      | {id, name, price_per_1000, max_per_hour, accept_rate, subscribeable}]'

Pentru un agent AI asta este diferența dintre aproximativ 170.000 de tokenuri și 10.000: dintre un prim apel care funcționează și unul care epuizează fereastra de context. Filtrează înainte să prelucrezi.

Cont și sesiuni

Înregistrarea are nevoie de browser: este protejată de o provocare Cloudflare. Înregistrează-te o dată pe app.toplistbot.com, apoi automatizează tot ce urmează.

  • POST/api/auth/registerPublicăCreare cont: doar din browser, protejat de captcha
  • POST/api/auth/loginPublicăSchimbă credențialele pe un JWT
  • POST/api/auth/refreshJWTEmite un JWT nou dintr-unul care expiră
  • POST/api/auth/logoutJWTInvalidează JWT-ul curent
  • GET/api/auth/user-profileJWTContul autentificat, cu sold și cheie API
  • GET/api/userJWTAcelași obiect de utilizator, pe o cale mai scurtă
  • GET/api/api_tokenCheie APIRezolvă o cheie API către proprietarul ei: folosește-l ca să validezi o cheie
  • POST/api/auth/reset-api-keyJWTRotește cheia API; cea veche moare imediat
  • POST/api/auth/fingerprintJWTÎnregistrează o amprentă de browser pe cont
  • POST/api/auth/ipJWTÎnregistrează IP-ul curent al contului
  • POST/api/auth/forgot-passwordPublicăTrimite pe e-mail un link de resetare, valabil 60 de minute
  • POST/api/auth/reset-passwordPublicăSetează o parolă nouă cu token-ul primit pe e-mail

Doi factori și autentificare

Doi factori protejează autentificarea cu parolă. Nu se aplică cheilor API, motiv pentru care o cheie este credențialul mai bun pentru lucrul nesupravegheat.

  • POST/api/2fa/enableJWTPornește înrolarea: întoarce secretul, URL-ul QR și codurile de recuperare
  • POST/api/2fa/verifyJWTConfirmă un cod de șase cifre și activează cei doi factori
  • POST/api/2fa/disableJWTDezactivează cei doi factori
  • POST/api/account/verification/requestJWTTrimite un link de verificare la adresa autentificată
  • GET/api/account/verification/confirm?token=PublicăAfișează pagina de confirmare: nu scrie nimic
  • POST/api/account/verification/confirmPublicăFinalizează verificarea
  • GET/api/auth/googlePublicăPornește autentificarea Google
  • GET/api/auth/google/callbackPublicăRevenirea de la autentificarea Google
  • GET/api/auth/discordPublicăPornește autentificarea Discord
  • GET/api/auth/discord/callbackPublicăRevenirea de la autentificarea Discord

Preferințe și alerte

Comutatoarele de e-mail și notificări, plus fluxul de alerte al contului.

  • GET/api/user/email-preferencesJWTStarea abonării la e-mailuri de marketing
  • POST/api/user/email-preferencesJWTSchimb-o
  • GET/api/user/notification-preferencesJWTPreferința pentru notificările de vot în timp real
  • POST/api/user/notification-preferencesJWTSchimb-o: trebuie să fie un boolean JSON adevărat
  • GET/api/user/alerts?limit=20JWTAlertele contului, de la cea mai nouă, paginate cu ?before
  • POST/api/user/alerts/readJWTMarchează o alertă ca citită
  • POST/api/user/alerts/dismissJWTÎnchide o alertă
  • GET/api/email/unsubscribe?token=PublicăDezabonare într-un clic dintr-un token trimis pe e-mail

Campanii

Creează campanii, condu-le în timp ce rulează și încheie-le. Este nucleul API-ului platformei.

  • GET/orders/getAllCheie APICampaniile tale, de la cea mai nouă, cu site-ul atașat
  • GET/orders/get/{id}Cheie APIO campanie
  • POST/orders/checkoutCheie APICreează campanii și scade din sold
  • POST/orders/updateCheie APIEditează o campanie
  • POST/orders/pauseCheie APIPune pe pauză o campanie activă
  • POST/orders/unpauseCheie APIReia o campanie pusă pe pauză
  • POST/orders/archiveCheie APIArhivează o campanie
  • POST/orders/unarchiveCheie APIRestaurează o campanie arhivată
  • PATCH/orders/updateLimitCheie APISetează sau șterge plafonul zilnic de voturi

POST /orders/checkout

Corpul este un array JSON de linii de coș la nivelul cel mai de sus, nu un obiect. Fiecare linie este o campanie. Tot coșul este validat înainte să se scadă ceva, iar scăderea și inserările sunt o singură tranzacție: o comandă se întâmplă complet sau deloc.

O linie cu cantitate fixă

Cazul obișnuit: livrarea unui număr stabilit de voturi către un URL.

ParametruTipDescriere
idobligatoriuintegerId-ul site-ului, din /orders/getAllWebsites.
amountobligatoriuintegerVoturi de livrat. 0 sau mai multe, cel mult 2.147.483.647.
ownNameobligatoriuurlURL-ul de vot. Se salvează drept câmpul `url` al comenzii.
custom_max_per_hourintegerPlafon de livrare, limitat la maximul site-ului.
extra_colstringCâmp de text liber purtat de comandă.
cURL
curl -X POST "https://backend.toplistbot.com/orders/checkout?key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "id": 9,
      "amount": 1000,
      "ownName": "https://arena-top100.com/index.php?a=in&u=yourserver",
      "custom_max_per_hour": 60
    }
  ]'
Response
200 OK
Successfully purchased with token balance

O linie de abonament

Pentru site-urile al căror indicator `subscribeable` este 1. Prețul vine din subscription_price_1d al site-ului înmulțit cu numărul de zile și cu reducerea nivelului: Weekly este 0,90, Monthly este 0,80, orice altceva 1,00. Cantitatea livrată este derivată pe server din propriul subscription_speed al site-ului, deci nimic din ce trimiți nu o schimbă.

Body
[
  {
    "type": "subscription",
    "website": { "id": 9 },
    "subscription_days": 30,
    "tier": { "name": "Monthly" },
    "url": "https://arena-top100.com/index.php?a=in&u=yourserver"
  }
]

Răspunsuri

  • 200Toate liniile au fost create și soldul a fost debitat. Corpul este text simplu.
  • 400Corpul nu era JSON valid.
  • 402Token-uri insuficiente. Mesajul spune câte lipsesc și nu s-a debitat nimic.
  • 422Una sau mai multe linii sunt greșite. Nu s-a debitat nimic.
  • 429Același coș a fost trimis în ultimele 60 de secunde. Reîncearcă după așteptarea indicată.

Un 422 numește linia problematică: erorile sunt indexate ca items.[index].[field], deci un coș cu trei linii greșite se repară dintr-un singur drum, nu din trei.

422 body
{
  "errors": {
    "items.2.amount": ["Enter 0 or more votes; a negative amount is not allowed."]
  }
}

POST /orders/update

`id` este obligatoriu; trimite doar câmpurile pe care le schimbi. Comenzile de abonament nu pot fi modificate.

ParametruTipDescriere
idobligatoriuintegerCampania de editat.
amount_to_dointegerNoul total de voturi. Creșterea taxează diferența, scăderea o returnează, iar între modificări sunt 30 de secunde de așteptare.
urlurlURL-ul de vot.
custom_namestringEticheta ta pentru campanie.
custom_max_per_hourintegerPlafon de livrare.
username_profile_idintegerAtașează un profil de vot.
proxy_profile_idintegerAtașează un profil de proxy.
http_referralurlReferrer-ul trimis cu fiecare vot.
extra_colstringCâmp de text liber.
cURL
curl -X POST "https://backend.toplistbot.com/orders/update?key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":184223,"amount_to_do":2000,"custom_name":"EU launch"}'

Plafon zilnic

`type: "delete"` șterge plafonul. Validatorul cere în continuare `max_votes_per_day` în acest caz: trimite orice număr întreg.

cURL
curl -X PATCH "https://backend.toplistbot.com/orders/updateLimit?key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":184223,"max_votes_per_day":500,"type":"set"}'

Jurnale și analize

Date de livrare, vot cu vot și agregate. Citesc o bază de date de jurnale separată și sunt mai lente decât restul API-ului: interoghează-le la minute, nu la secunde.

  • GET/orders/logs/{id}Cheie APIJurnalul de livrare vot cu vot al unei campanii
  • GET/orders/graph/{id}Cheie APISerie temporală pentru o campanie, gata de grafic
  • GET/api/orders/graph/summaryJWTO serie pentru toate campaniile tale
  • GET/orders/grouped/usernames/{id}Cheie APILivrări grupate după utilizatorul care a votat
  • POST/orders/averageCheie APILivrarea medie pentru mai multe campanii
  • GET/api/logs/{id}/filtered-graphJWTSerie temporală filtrată

Profiluri de vot și proxy

Un profil de vot este o listă denumită de utilizatori cu care votează o campanie. Un profil de proxy este o listă de țări permise pentru IP-urile folosite. Atașează oricare unei campanii cu username_profile_id sau proxy_profile_id în /orders/update.

  • GET/advanced/profile/getCheie APIProfilurile tale de vot
  • GET/advanced/profile/get/{id}Cheie APIUn profil de vot
  • POST/advanced/profile/createCheie APICreează un profil de vot sau suprascrie unul după id
  • DELETE/advanced/profile/delete/{id}Cheie APIȘterge un profil de vot
  • GET/advanced/profile/proxy/getCheie APIProfilurile tale de proxy
  • GET/advanced/profile/proxy/get/{id}Cheie APIUn profil de proxy
  • POST/advanced/profile/proxy/createCheie APICreează un profil de proxy sau suprascrie unul după id
  • DELETE/advanced/profile/proxy/delete/{id}Cheie APIȘterge un profil de proxy

Token-uri Discord

Pentru topurile care autentifică votanții prin Discord. Adăugarea aceluiași token de două ori este respinsă ca duplicat.

  • GET/api/discord-tokensJWTToken-urile tale Discord
  • POST/api/discord-tokensJWTAdaugă un token
  • GET/api/discord-tokens/statsJWTUtilizarea cumulată a token-urilor tale
  • GET/api/discord-tokens/{id}JWTUn token
  • PATCH/api/discord-tokens/{id}JWTSchimbă un token sau starea lui activă
  • DELETE/api/discord-tokens/{id}JWTElimină un token
  • PUT/api/discord-tokens/{id}/toggleJWTComută un token între activ și inactiv

Facturare și plăți

Cumpărarea de token-uri se termină mereu pe o pagină de plată găzduită, deci alimentarea nu poate fi complet automată. Tot ce urmează după alimentare poate fi.

  • GET/invoices/getCheie APIIstoricul facturării
  • GET/api/subscriptions/subscriptionsJWTAbonamente active
  • GET/products/tokensByUserCheie APIPachete de token-uri la prețul contului tău
  • POST/company/getCheie APIAdresa ta de facturare
  • POST/company/createCheie APISetează-o: country, region, city, address, postalCode
  • GET/api/stripe/checkout?product_id=JWTUn URL Stripe Checkout pentru un pachet de token-uri
  • GET/api/stripe/subscription?plan=JWTUn URL Stripe Checkout pentru un plan
  • GET/api/stripe/portalJWTUn URL către portalul de facturare Stripe
  • GET/api/stripe/documentsJWTFacturi și chitanțe Stripe
  • GET/coinpayments/checkoutCheie APIUn URL de plată în cripto

Coș salvat

Coșul panoului, păstrat pe server ca să supraviețuiască unei schimbări de dispozitiv. Nu îți trebuie ca să plasezi comenzi: /orders/checkout primește coșul direct în cerere.

  • GET/api/cartJWTCoșul salvat
  • PUT/api/cartJWTÎnlocuiește-l
  • POST/api/cartJWTÎnlocuiește-l, la fel ca PUT
  • DELETE/api/cartJWTGolește-l

Suprafețe interne

Există pentru Stripe, planificatorul de sarcini și provocarea antiabuz de la înregistrare. Sunt autentificate prin secrete partajate sau semnături și nu fac parte din suprafața de integrare: sunt listate aici doar ca inventarul să fie complet.

  • POST/api/stripe/webhookEvenimente de plată Stripe, autentificate prin semnătură
  • POST/api/jobs/tickRulează sarcinile scadente, autentificat prin secret partajat
  • POST/api/pow/challengeProvocarea proof-of-work de la înregistrare
  • POST/api/logs/updateUrmărirea activității de e-mail
  • POST/api/order/{email}Plasează o comandă pe alt cont — doar pentru lista de administratori
  • GET/reset-password/{token}Vechea pagină de resetare randată pe server, păstrată pentru linkurile deja trimise
  • GET/PublicăVerificare de stare

Formatele răspunsurilor

Aproape tot ce vei citi vine în două obiecte: site-ul, întors de endpoint-urile de catalog, și campania, întoarsă de cele de comenzi. Fiecare are în jur de patruzeci de coloane; tabelele de mai jos sunt cele de care o integrare chiar are nevoie.

Trei câmpuri sosesc drept șiruri JSON deși conțin numere: accept_rate și timeout pe site, și custom_max_per_hour pe campanie. Convertește-le înainte de calcule, altfel vei concatena șiruri în loc să aduni.

Types to watch
{
  "accept_rate": "70",          // string, not number
  "timeout": "150000",          // string, not number
  "custom_max_per_hour": "60"   // string, not number
}

Obiectul site

Întors de /orders/getAllWebsites și /orders/getWebsiteDetailsByName, și inclus în fiecare campanie sub `website`.

ParametruTipDescriere
idintegerId-ul site-ului. Îl trimiți ca `id` într-o linie de coș, sau ca `service` pe endpoint-ul SMM.
namestringNumele afișat și șirul exact cu care compară /orders/getWebsiteDetailsByName.
price_per_1000numberTokenuri la 1.000 de voturi acceptate. Este numărul folosit de formula de cost.
accept_ratestringProcentul voturilor trimise care sunt acceptate. Toate calculele de progres și de rambursare depind de el.
max_per_hourintegerPlafonul de livrare al site-ului. Atât custom_max_per_hour cât și interval de pe SMM sunt reduse la el.
activeinteger1 înseamnă că se poate comanda. Site-urile inactive sunt tot returnate, deci filtrează-le singur.
vote_reset_timeintegerCâte ore trec până când aceeași identitate poate vota din nou.
speed_changeableinteger1 înseamnă că site-ul respectă o viteză de livrare personalizată.
referer_must_be_setinteger1 înseamnă că http_referral trebuie setat pe campanie.
optional_data_possibleinteger1 înseamnă că site-ul acceptă câmpul optional_data al campaniei.
track_votesinteger1 înseamnă că există jurnale de livrare vot cu vot pentru campaniile de aici.
subscribeableinteger1 înseamnă că liniile de abonament sunt acceptate.
subscription_price_1dnumberTokenuri pe zi de abonament, înainte de reducerea de nivel.
subscription_speedintegerVoturi pe oră livrate de un abonament. Cantitatea este dedusă de aici pe server, niciodată din cererea ta.

Câmpurile omise aici alimentează interfața panoului. Citește-le dacă vrei, dar nu fac parte din contractul de integrare și se pot schimba fără anunț.

Obiectul campanie

Întors de /orders/getAll și /orders/get/. Observă ce lipsește: nu există un câmp de stare.

ParametruTipDescriere
idintegerId-ul campaniei. Toate endpoint-urile din Campanii îl primesc drept `id`.
vote_website_idintegerSite-ul pe care rulează campania.
websiteobjectObiectul site complet, inclus. Prezent în /orders/getAll, absent în /orders/get/.
urlstringURL-ul de vot: `ownName` pe care l-ai trimis la plasarea comenzii.
custom_namestringEticheta ta pentru campanie, sau null.
amount_to_dointegerVoturi acceptate cumpărate. Numără voturi acceptate, nu încercări.
amount_doneintegerVoturi trimise până acum. Altă unitate decât amount_to_do: vezi secțiunea de progres.
runninginteger1 livrează, 0 este pe pauză.
doneinteger1 înseamnă închisă: anulată, rambursată și cu ambele cantități aduse la zero. Nu este un indicator de finalizare.
archiveinteger1 înseamnă arhivată. Campaniile arhivate sunt în continuare returnate de /orders/getAll.
custom_max_per_hourstringPlafonul tău de livrare pentru această campanie, ca șir.
max_votes_per_dayintegerPlafonul zilnic de voturi, sau null când nu există unul.
is_subscriptioninteger1 înseamnă abonament. Abonamentele nu pot fi editate după cumpărare.
paused_unpauseddatetimeCând a fost campania pusă pe pauză, reluată sau redimensionată ultima dată. De aici pornește pauza de 30 de secunde dintre modificări.

Câmpurile omise aici alimentează interfața panoului. Citește-le dacă vrei, dar nu fac parte din contractul de integrare și se pot schimba fără anunț.

Rulează? S-a terminat?

O campanie nu are câmp de stare, deci o deduci din patru coloane. Evaluează condițiile în ordine și oprește-te la prima potrivire.

VerificareÎnseamnă
1done === 1Anulată. Restul necheltuit a fost rambursat, ambele cantități au fost aduse la zero și a fost arhivată.
2running === 0Pusă pe pauză de tine. Reia-o cu /orders/unpause.
3remaining_accepted === 0Tot ce s-a cumpărat a fost livrat.
4running === 1Rulează normal.
5archive === 1Ascunsă în panou, dar în continuare returnată de /orders/getAll. Filtreaz-o dacă vrei să se potrivească cu ce afișează panoul.

Ordinea contează. Anularea setează done și archive împreună, deci verificarea lui archive prima ar prezenta o campanie anulată drept doar arhivată, iar verificarea restului înaintea lui running ar prezenta o campanie pusă pe pauză drept una care livrează.

Progres și rambursări

amount_to_do numără voturi acceptate; amount_done numără trimiteri. Doar accept_rate la sută dintre trimiteri sunt acceptate, deci cele două sunt în unități diferite și scăderea directă a uneia din cealaltă este greșită.

Este cea mai frecventă greșeală de integrare și eșuează în tăcere: cifrele rămân plauzibile, iar bara de progres este pur și simplu greșită. La o rată de acceptare de 70 la sută, o campanie încheiată apare ca fiind 70 la sută gata; la 50 la sută, una livrată pe jumătate apare ca neîncepută. Transformă mai întâi trimiterile în voturi acceptate, de fiecare dată.

JavaScript
// accept_rate arrives as a STRING, and it is per-site, not global.
const rate = Number(order.website.accept_rate)

// amount_done counts SUBMISSIONS; amount_to_do counts ACCEPTED votes.
// Convert before comparing them.
const delivered = order.amount_done * rate / 100
const remaining = Math.max(order.amount_to_do - delivered, 0)
const percent   = 100 * delivered / order.amount_to_do

// What cancelling right now would put back on your balance:
const refund    = (remaining / 1000) * order.website.price_per_1000

Același calcul dă prețul unei anulări: rambursarea este restul necheltuit la prețul de listă al site-ului, așa că poți afla cât valorează oprirea unei campanii înainte să te decizi.

O campanie de la cap la coadă

Șase apeluri, o cheie API, fără browser și fără autentificare. Același lucru prin endpoint-ul SMM înseamnă trei apeluri — services, add, status — și nu atinge deloc API-ul platformei.

bash
KEY=YOUR_API_KEY
BASE=https://backend.toplistbot.com

# 1. What can I order, and what does it cost?
curl -s "$BASE/orders/getAllWebsites" \
  | jq '.[] | {id, name, price_per_1000, max_per_hour}'

# 2. What can I afford?
curl -s -X POST "$BASE/api/v2" -d "key=$KEY" -d "action=balance"

# 3. Launch it.  cost = price_per_1000 * amount / 1000
curl -s -X POST "$BASE/orders/checkout?key=$KEY" \
  -H "Content-Type: application/json" \
  -d '[{"id":9,"amount":1000,
        "ownName":"https://arena-top100.com/index.php?a=in&u=me",
        "custom_max_per_hour":60}]'

# 4. Find the campaign that was just created.
curl -s "$BASE/orders/getAll?key=$KEY" | jq '.[0] | {id, url, amount_to_do, amount_done}'

# 5. Watch it. Poll every few minutes.
curl -s "$BASE/orders/graph/184223?key=$KEY"

# 6. Slow it down, or stop it.
curl -s -X PATCH "$BASE/orders/updateLimit?key=$KEY" \
  -H "Content-Type: application/json" -d '{"id":184223,"max_votes_per_day":200,"type":"set"}'
curl -s -X POST "$BASE/orders/pause?key=$KEY" \
  -H "Content-Type: application/json" -d '{"id":184223}'

Erori

Erorile vin cu un status HTTP corespunzător. Erorile de validare returnează un obiect `errors` indexat după numele câmpului.

  • 400Cererea nu a putut fi citită deloc: JSON invalid sau o acțiune pe care endpoint-ul SMM nu o cunoaște.
  • 401Credențial lipsă, expirat sau greșit.
  • 402Token-uri insuficiente. Nu s-a debitat nimic.
  • 403Autentificat, dar fără drept la această operațiune.
  • 404Nu există o astfel de înregistrare, inclusiv una care aparține altcuiva.
  • 409Intră în conflict cu starea curentă a contului, de exemplu activarea de două ori a celor doi factori.
  • 422Validarea a eșuat. Corpul numește fiecare câmp.
  • 429Limită de frecvență. Mesajul spune cât să aștepți.
  • 500Vina noastră. Nu s-a debitat nimic.
  • 503O dependență este indisponibilă. Reîncearcă mai târziu.
Validation error
{
  "errors": {
    "quantity": ["The quantity must be at least 1."]
  }
}

Când corpul cererii a fost un array, cheile erorilor poartă indexul liniei care a eșuat.

Câteva endpoint-uri răspund cu text simplu, nu cu JSON: /orders/checkout, /orders/pause și /orders/updateLimit printre ele. Ramifică după codul de stare, nu după forma corpului.

Limite de frecvență

Un 429 spune mereu cât să aștepți. Respectă-l în loc să reîncerci orbește.

  • Același coș este acceptat cel mult o dată la 60 de secunde.
  • Totalul de voturi al unei campanii poate fi schimbat o dată la 30 de secunde.
  • Încercările de autentificare sunt limitate per adresă și per IP.
  • Resetarea parolei: 3 per adresă și 10 per IP la fiecare 15 minute.
  • `status` și `cancel` acceptă cel mult 100 de id-uri de comandă per apel.
  • Urmărește progresul la minute, nu la secunde. Livrarea se măsoară în voturi pe oră.

Limite și observații

  • Cantitatea comenzii trebuie să fie între 1 și 50000 de acțiuni.
  • Intervalul este implicit 15 pe oră și este plafonat la 4000. Solicitarea unei valori peste maximul site-ului este respinsă cu un 400 care indică limita.
  • Acțiunile `refill` și `refill_status` nu sunt implementate — creează în schimb o comandă nouă.
  • Câmpul `status` este mereu literalul "Completed" și nu este un semnal de progres. Folosește `remains == 0` ca să știi că o comandă s-a încheiat și `start_count` pentru ce s-a livrat.
  • Abonamentele nu pot fi editate după cumpărare: pune-le pe pauză sau anulează-le.
  • Site-urile de listare își stabilesc propriile reguli și le schimbă în timp. Ești responsabil să te asiguri că utilizarea ta respectă termenii oricărui site pe care promovezi. Nu promitem o anumită poziție sau clasare.
Începi gratuit

Începe promovarea acum!

Verifică-ți adresa de e-mail și primește 100 de tokenuri gratuite pentru a încerca serviciul nostru. Fără obligații.

Fără card bancar
Anulezi oricând
Asistență 24/7