Order from FiniTasks over the API
FiniTasks is a provider. Point your panel at one endpoint and your customers' orders become real tasks, done by real people in Nigeria, with a reviewer checking the proof on every single one before it counts as delivered.
Last updated 19 August 2026. This is the contract in force today.
What this is
The standard SMM panel provider protocol, version 2. If your panel already orders from other providers, it already speaks this. Adding FiniTasks is a provider row and an import, not a piece of development work.
One endpoint. POST, form encoded in, JSON out. Every request carries your API key and an action.
Three things to read before you integrate
Tell us which currency your panel thinks in. The protocol has no field for it, so a panel assumes, and the assumption is expensive when it is wrong. A dollar panel that reads a naira rate as dollars multiplies every price by its own exchange rate: a ₦7 follow gets priced to its customers in the thousands. So a key is either naira or dollars, you choose when you create it, and every rate, balance and charge comes back in that currency with a matching currency field. Nothing else changes.
Progress and completion are different numbers. remains falls as workers submit, so your bar moves at the speed the work is actually happening. Completed comes only from approvals, because it is final: once you see it you settle with your customer, and a rejection arriving afterwards would have nowhere to go. So the bar is live, and the guarantee at the end of it still means a person checked every proof. If a submission is rejected, remains goes back up while the order is still In progress.
You do not have to review anything. FiniTasks staff check the submissions on your orders, so most orders finish without anybody at your end opening a screenshot. If you would rather check them yourself, tell us and we will set your key up that way.
Your key spends your wallet. There is no credit and no separate API balance. Fund your FiniTasks account, and orders draw on that same balance. An order you cannot pay for is refused and nothing is created.
New orders are checked by a person before any worker sees them. add returns an order ID straight away and the money moves into escrow straight away, but the order reports Pending until somebody here has looked at it. This is usually quick. If it is turned down you get the whole amount back and the order reports Canceled. It is there so a bad link cannot reach a thousand workers before anyone notices.
Send the right kind of link
The link has to match the action. A worker cannot follow a post, so a post link on a follow service is refused at the moment you send it rather than turning into a refund a day later.
- Follows, subscribes, page likes, joins want the profile, channel or group. instagram.com/yourpage, not instagram.com/p/....
- Likes, comments, views, shares, saves want the specific post, video or track, not the profile it sits on.
- The host has to belong to the platform. A TikTok link on an Instagram service is refused.
The rules are deliberately forgiving everywhere else. Mobile hosts, www, trailing slashes, tracking parameters, youtu.be and the platforms' own short links all pass, and anything we cannot confidently call wrong is accepted. The error names the mistake and what to paste instead, so you can show it to your own customer.
{ "error": "That is a link to a post. For page follow, paste the link to your profile instead." }
Order size, and orders that end on their own
Every service carries its own min and max, and they are real. Today that is 10 to 5000 on everything. Read them from services rather than assuming: they are set per service and they will move as supply does.
The minimum exists because reviewing a single follow costs more than the margin on it. The maximum exists because promising supply we do not have is worse than saying no: the order sits half filled, your money sits in escrow, and your customer waits for something that is not coming.
For a Custom Comments order the number of lines is the quantity, so the same limits apply to the list. The error tells you how many lines we counted.
An order that stops moving closes itself. After seven days with no new approved completion, an unfinished order closes and the undelivered part is refunded in full. It then reports Partial, or Canceled if none of it was delivered, so your own partial refund runs on the usual path without anybody having to chase us.
Getting a key
Create an advertiser account, open /api-keys, and mint one. It is shown once and stored only as a hash, so keep it somewhere safe. A key can be revoked at any time and a revoked key stops working immediately.
Panels doing volume can be moved to the partner tier, which quotes a wholesale rate in services and charges it on add. Ask once you are running.
services
The catalogue. Import this once, then re-import when you want new services.
key=YOUR_KEY&action=services
Returns an array. One entry, abbreviated:
{
"service": 42,
"name": "Instagram Page Follow - Nigerian",
"type": "Default",
"category": "Instagram",
"rate": "7000.00",
"min": "10",
"max": "5000",
"refill": false,
"cancel": true,
"dripfeed": false,
"description": "Follow the account at the link from your own
Instagram account and stay following...
Proof required: a screenshot showing you are
following, and your username...
Every submission is checked by a person before
it counts as delivered."
}
service is the integer to store against your own service. rate is per 1000 units in your key's currency, so the example above is 7 naira per follow on a naira key. The same service on a dollar key quotes the same money converted, and says so. type is Default for everything except the comment services, which are Custom Comments.
description is the brief the worker is actually given, plus the proof they have to send. Show it to your customers: it is the honest description of what they are buying, and it is what the reviewer will hold the work against.
The numbers above are an example of the shape, not a live price. Call the endpoint for real ones.
add
Places an order. This is the call that creates a funded campaign and puts it in front of workers.
key=YOUR_KEY&action=add&service=42&link=https://instagram.com/yourpage&quantity=1000
Returns the order ID to store and poll:
{ "order": 1023 }
For a Custom Comments service, send comments instead of quantity, one comment per line. The number of lines is the quantity. Each line becomes its own task given to a different worker, so every comment is posted once by one real person.
Blank lines and exact duplicates are dropped rather than rejected, so a list pasted out of a spreadsheet does not bounce over one repeat. The quantity you are charged for is the number of lines that survived.
If your balance does not cover the order, you get an error and nothing is created. No half-made campaign, no partial charge.
{ "error": "Not enough funds" }
status
Poll one order, or up to a hundred at once.
key=YOUR_KEY&action=status&order=1023
{
"charge": "7000.00",
"start_count": "0",
"status": "In progress",
"remains": "320",
"currency": "NGN"
}
For a batch, send orders as a comma separated list. The reply is keyed by order ID, and an ID that is not yours answers with its own error rather than failing the whole batch.
key=YOUR_KEY&action=status&orders=1023,1024
{
"1023": { "charge": "7000.00", "status": "In progress", "remains": "320", ... },
"1024": { "error": "Incorrect order ID" }
}
status is always one of six values:
- Pending, either waiting for our check, or checked and waiting for its first approved completion.
- In progress, some completions approved, more outstanding.
- Completed, every unit delivered and approved.
- Partial, stopped with some delivered. remains is what was not, and that part is refunded to you.
- Canceled, stopped with nothing delivered. Fully refunded.
- Processing is accepted by the protocol and FiniTasks does not use it.
start_count is whatever you sent on add, echoed back, or zero. FiniTasks does not read follower counts off social platforms, so we do not invent a number we have not measured.
cancel
Only while the order has not gone live yet. An order still waiting for our check is yours to pull, and we keep 3% of it. Once workers can see it, it is not yours to withdraw: people choose what to spend their day on partly from what is on the board. Ask us and we will close it as a partial instead, keeping everything delivered and returning the rest with nothing deducted.
key=YOUR_KEY&action=cancel&order=1023
{ "cancel": 1 }
Work a worker is holding at that moment stays funded until that task is decided. Somebody who did the job before you changed your mind still gets paid for it, and that money is not yours to take back. Everything else returns to your wallet, and the rest follows as those last tasks resolve.
A live order answers with an error rather than cancelling:
Poll status afterwards. A cancelled order that had delivered nothing reports Canceled; one that had delivered something reports Partial with the undelivered amount in remains.
Send orders with a comma separated list to cancel several, and the reply is an array with one result per order.
{ "error": "This order is already in progress. Ask FiniTasks to close it as a partial." }
balance
key=YOUR_KEY&action=balance
{ "balance": "125000.00", "currency": "NGN" }
refill
Always answers with an error, and services reports "refill": false on every service so a well behaved panel never offers the button.
This is a deliberate no rather than a gap. A refill means redoing work we cannot verify was undone, and a provider that accepts refill requests it has no way to honour is a provider that is going to disappoint you later. If drop off matters for your customer, order the quantity you need.
{ "error": "Refill is not offered on FiniTasks services" }
Errors
Every failure comes back as HTTP 200 with an error field. That is the protocol convention and it is deliberate: a 4xx reads to most panels as a transport fault, which is the class of thing they retry forever.
- Invalid API key, wrong, revoked, or the account is not active.
- Incorrect service ID, no active service with that number.
- Invalid link, not a URL we will accept.
- Incorrect quantity, outside the min and max on the service.
- Incorrect comments, a Custom Comments order with no usable lines.
- Not enough funds, and nothing was created.
- Incorrect order ID, unknown, or belongs to another account.
- Invalid action.
Rate limit
600 requests a minute per caller, which is enough to import the catalogue and sync several hundred orders without thinking about it. Use the batch form of status for polling rather than one request per order.
What your customer actually gets
A Nigerian worker sees the task with the exact amount it pays them, does it from their own account, and sends proof: a screenshot, and their username where the service calls for one. A reviewer checks that proof against the rules for that service. Only then does your remains fall by one.
A rejected submission carries a written reason and the worker can appeal it to FiniTasks staff rather than to the advertiser who benefits from the rejection. The slot returns to the pool once that rejection is final, so your order keeps filling.
Nothing is deducted from what a worker earns, and nothing is added to what you pay at checkout. Our revenue on a task is the difference between the two.