Developers

API v2

One endpoint, POST only, JSON back. Same catalogue and same prices you see in the panel, placed from your own site, bot or spreadsheet.

Four things to know first

01

Your key is your wallet

Generate it on the account page. It authorises spending, so it belongs in server config. Rotate it if it ever touched a browser, a chat or a screenshot.

02

Limits are per service

Minimum and maximum quantity are set individually — one service starts at 10 units, the next at 500 000. Read them from services and validate before you send an order.

03

Orders spend the balance

There is no invoice step. add succeeds only while the balance covers the order, so poll balance and stop your queue before it hits zero.

04

Already have a panel? No code needed

PerfectPanel and most panel scripts read this format natively. In your admin go to Providers → Add provider and paste the site addresshttps://autosmo.com/, just that, not the endpoint. Add your key, sync the catalogue, set your markup.

One request, start to finish

worked example
place an order and read it back
curl -X POST https://autosmo.com/api/v2 \\
  -d key=YOUR_KEY \\
  -d action=add \\
  -d service=6758 \\
  -d link=https://instagram.com/yourprofile \\
  -d quantity=100

{"order": 8231455}

curl -X POST https://autosmo.com/api/v2 -d key=YOUR_KEY -d action=status -d order=8231455

{"charge": "0.016", "start_count": "2841", "status": "Completed",
 "remains": "0", "currency": "USD"}

Service 6758 is a real id from the catalogue. Quantities below a service’s minimum are rejected, not rounded up.

Hand it to an agent

copy & paste

Paste this into ChatGPT, Claude or Cursor, name your language, and you get a working client. It carries the full call list plus the behaviour that is easy to get wrong.

integration prompt
Build me a client for the AutoSMO SMM API (v2), in a language I will name.

ENDPOINT
POST https://autosmo.com/api/v2 — form-encoded body, JSON response, no other verbs.
Authentication is the field `key`, sent with every call. Server-side only.

CALLS
action=services -> array of { service, name, type, category, rate (per 1000),
                              min, max, refill:bool, cancel:bool }
action=add      params: service, link, quantity [, runs, interval]  -> { "order": id }
                custom comments: service, link, comments
action=status   params: order | orders (comma separated, max 100)
                -> { charge, start_count, status, remains, currency }
action=refill   params: order | orders (max 100)   -> { "refill": id }
action=refill_status  params: refill | refills     -> { "status": ... }
action=cancel   params: orders (max 100)
action=balance                                      -> { balance, currency }

BEHAVIOUR THAT COSTS MONEY IF IGNORED
- A timed-out `add` is not a failed `add`. The order may exist and be paid for.
  Surface it for a human; do not resend it on a timer.
- Quantity outside a service's own min/max is refused outright, so read those
  bounds from the catalogue and check before sending.
- Status is polled with `orders` and up to 100 ids at once. Per-order polling
  works in testing and dies in production.
- A 200 response can still contain per-entry errors when several ids were
  requested. Walk the entries; do not trust the envelope.
- "Partial" is a delivery that stopped early: `remains` is the shortfall and
  `charge` is the real cost. Pass that difference back to your buyer.
- Refill and cancel exist only where the catalogue flags say so.

WHAT I EXPECT FROM YOU
- One function per call, with the response parsed into typed structures.
- My order reference stored next to the id this API returns.
- Two background jobs: refresh the catalogue, and follow orders still open.
- A rehearsal switch that logs calls without sending them, and a single
  end-to-end test using the cheapest service in the catalogue.

Checklist before you go live

The key is not in anything a customer can open

Not in front-end JavaScript, not in a mobile bundle, not in a public repository. Anyone holding it can place orders against your balance.

Timeouts are queued for a human, not retried

Because add has no idempotency key, an automatic retry is how one customer order becomes two paid orders.

Your catalogue copy refreshes on a schedule

Rates, limits and availability change when suppliers change theirs. A stale local copy sells at prices you no longer have.

Partial orders reach your customer as partial

Map remains into your own refund logic. Marking a partial delivery as complete is the fastest way to earn a chargeback.

You have watched one real order all the way through

Place the smallest order the catalogue allows, poll it to completion, and confirm your side matches charge to the cent before you switch traffic over.

Full reference, generated by the panel

API

HTTP Method POST
API URL https://autosmo.com/api/v2
Response format JSON

Service list

Parameters Description
key Your API key
action services

Example response

[
    {
        "service": 1,
        "name": "Followers",
        "type": "Default",
        "category": "First Category",
        "rate": "0.90",
        "min": "50",
        "max": "10000",
        "refill": true,
        "cancel": true
    },
    {
        "service": 2,
        "name": "Comments",
        "type": "Custom Comments",
        "category": "Second Category",
        "rate": "8",
        "min": "10",
        "max": "1500",
        "refill": false,
        "cancel": true
    }
]

Add order

Example response

{
    "order": 23501
}

Order status

Parameters Description
key Your API key
action status
order Order ID

Example response

{
    "charge": "0.27819",
    "start_count": "3572",
    "status": "Partial",
    "remains": "157",
    "currency": "USD"
}

Multiple orders status

Parameters Description
key Your API key
action status
orders Order IDs (separated by a comma, up to 100 IDs)

Example response

{
    "1": {
        "charge": "0.27819",
        "start_count": "3572",
        "status": "Partial",
        "remains": "157",
        "currency": "USD"
    },
    "10": {
        "error": "Incorrect order ID"
    },
    "100": {
        "charge": "1.44219",
        "start_count": "234",
        "status": "In progress",
        "remains": "10",
        "currency": "USD"
    }
}

Create refill

Parameters Description
key Your API key
action refill
order Order ID

Example response

{
    "refill": "1"
}

Create multiple refill

Parameters Description
key Your API key
action refill
orders Order IDs (separated by a comma, up to 100 IDs)

Example response

[
    {
        "order": 1,
        "refill": 1
    },
    {
        "order": 2,
        "refill": 2
    },
    {
        "order": 3,
        "refill": {
            "error": "Incorrect order ID"
        }
    }
]

Get refill status

Parameters Description
key Your API key
action refill_status
refill Refill ID

Example response

{
    "status": "Completed"
}

Get multiple refill status

Parameters Description
key Your API key
action refill_status
refills Refill IDs (separated by a comma, up to 100 IDs)

Example response

[
    {
        "refill": 1,
        "status": "Completed"
    },
    {
        "refill": 2,
        "status": "Rejected"
    },
    {
        "refill": 3,
        "status": {
            "error": "Refill not found"
        }
    }
]

Create cancel

Parameters Description
key Your API key
action cancel
orders Order IDs (separated by a comma, up to 100 IDs)

Example response

[
    {
        "order": 9,
        "cancel": {
            "error": "Incorrect order ID"
        }
    },
    {
        "order": 2,
        "cancel": 1
    }
]

User balance

Parameters Description
key Your API key
action balance

Example response

{
    "balance": "100.84292",
    "currency": "USD"
}
Example of PHP code