Tasqo API v1

Orders, the reports people send back, and your own numbers.

Authenticate with Authorization: Bearer ow_…. The machine-readable document is at /api/docs/openapi.json (OpenAPI 3.1, version 1.0.0).

v1:orders

GET /api/v1/services

The catalogue

Every service you may order, with its price per 1000 and its bounds, in catalogue order. The price is USD and the bounds are units; a Custom Task may set its own price per unit instead. catalog places each service in the tree (section, optional category), with titles and descriptions in both languages; icon_url is relative to this host.

POST /api/v1/orders

Place an order

Charges the balance and creates the task in one transaction: either you are charged and the task exists, or neither happened. Send idempotency_key and a retry of the same request returns the same order rather than buying twice.

GET /api/v1/orders

Your orders

Newest first. remains is what has not been delivered yet.

GET /api/v1/orders/{id}

One order

The counters, the charge as it stands now, and the task behind it.

POST /api/v1/orders/{id}/cancel

Stop an order

A REQUEST, not an instant stop. Nothing new is handed out from this moment; slots already held run to their verdict, and the order becomes Partial or Canceled when the last one lands. What was not delivered is refunded.

GET /api/v1/balance

Your balance

USD, as the ledger has it right now.

v1:review

GET /api/v1/submissions

Reports waiting for you

Across every order. awaiting means somebody has to decide: a first report, one being looked at, or a corrected one that came back.

GET /api/v1/orders/{id}/submissions

Reports on one order

The same list, narrowed to one order.

GET /api/v1/submissions/{id}

One report, with its thread

The conversation as the person sees it, their proof, and what our model made of it. allowed is what you may decide right now and refusal says why the rest are not there.

POST /api/v1/submissions/{id}/verdict

Decide a report

Approve it, ask for a fix, or refuse it. A refusal of the DECISION is 200 with applied: false, not an error: "you cannot reject a report nobody has asked to fix" is an answer, and retrying it will not change it. Asking for a fix or refusing needs a message — the person reads it.

POST /api/v1/submissions/{id}/messages

Say something without deciding

Goes into the same thread the person reads in the wall. They see it.

GET /api/v1/me/usage/ai

What the model did with your reports

Not a bill — you pay for completions, and what a check costs is ours. This is here so you can see whether automatic checking is doing anything for you.

v1:webhooks

GET /api/v1/webhooks

Your webhooks

With the last delivery’s outcome, so a broken endpoint is visible here.

POST /api/v1/webhooks

Register a webhook

The signing secret comes back once, in this response. Store it: every delivery is signed with it, and we cannot show it to you again.

PATCH /api/v1/webhooks/{id}

Pause one, or change its events

Pausing beats deleting: the secret is shown once, so a delete is a re-key for every consumer of it. A paused endpoint receives nothing and keeps everything.

GET /api/v1/webhooks/{id}/deliveries

What we sent to this endpoint

Every attempt, with your server’s answer and the exact body we sent. The last 50, newest first.

POST /api/v1/webhooks/{id}/deliveries/{deliveryId}/resend

Send one again

Starts the schedule again from the first attempt. This is what the stored body is for: an endpoint that was down all afternoon has run out of attempts, and the alternative is reconciling by hand. A disabled webhook answers 409: enable it first.

DELETE /api/v1/webhooks/{id}

Remove a webhook

Its delivery history goes with it.

publisher:stats

GET /api/v1/placements/{key}/stats

What your wall earned

Conversions, revenue, reversals, and both halves of what we owe you.

GET /api/v1/placements/{key}/postbacks

What we sent you

Every notification, every attempt, and what your server answered.

POST /api/v1/placements/{key}/postbacks/{deliveryId}/resend

Send one again

Restarts the retry schedule from the first attempt.

POST /api/v1/placements/{key}/postbacks/test

Send a test one

A real request to your configured URL, with a real signature. It carries payout=0 and amount=0, so a handler that credits without reading event credits nothing.

GET /api/v1/placements/{key}/users/{externalId}

One of your users

By YOUR id for them — the one you sent us in the loader. Their counters, what they earned, and the fraud flags our checks raised.

Errors

Translate by code, never by message — the message is the English default and may be reworded.

codestatusmeaning
validation_failed400Request validation failed
unauthorized401Authentication required
forbidden403Not allowed
not_found404Not found
conflict409Conflict with the current state
rate_limited429Too many requests
payload_too_large413Request body is too large
internal500Internal error
ai_unavailable503The model is not available
comments_unavailable503Automatic comments are not available right now
ai_models_not_chosen409Pick a real model for every tier before checking is switched on
ai_check_unavailable409This report cannot be sent to the model
ai_key_missing409This server has no AI provider key
project_locked409The project changed status while it was being edited
icon_invalid400Expected a PNG, JPEG, WebP, GIF or SVG image within the size limit
placement_not_found404Unknown placement
placement_inactive403Placement is not active
invalid_signature401Invalid user signature
signature_required401The wall opens only with a signed user id: sig = HMAC-SHA256(user_id:ts) and ts
signature_expired401The signed link has expired; open the wall again
placeholder_user_id400user_id is the template placeholder; put the real user id there
user_banned403User is banned by the publisher
session_expired401Session expired
task_not_available409Task is not available
task_already_reserved409Task already reserved
per_user_limit_reached409Task limit reached for this user
no_slots409No free slots left
target_already_done409You already did this task for this target on an earlier order
account_required409Link your account on this platform first
account_script_mismatch409This task is not available for your linked account
account_already_done409Your linked account has already done this task
account_input_invalid400Paste a channel id, a channel link or a profile link
account_not_found404The platform has no such account
account_private400Make your subscriptions public on YouTube and try again
account_taken409This account is already linked by another person
account_already_linked409You already have a linked account on this platform
account_link_cooldown429Please wait before trying to link an account again
api_check_limit_reached429You have started as many API-checked tasks as allowed for now
api_unavailable503The platform cannot be asked right now
reservation_not_found404Reservation not found
reservation_expired410Reservation has expired
stage_not_started409Start the stage before sending its report
stage_not_open409The stage has not opened yet
stage_not_startable409There is no stage to start
submission_not_editable409Submission cannot be changed in its current status
revision_deadline_passed410Revision deadline has passed
attachment_required400A proof attachment is required
proof_field_required400The report is missing a required proof field
attachment_too_large413Attachment is too large
attachment_type_not_allowed415Attachment type is not allowed
attachment_unreadable415Attachment could not be read
too_many_attachments400Too many attachments
insufficient_funds402Insufficient balance
order_target_busy409There is an active order for this target already; a new one can be placed when it is completed
refill_not_available409Refill is not available for this order
refill_in_progress409A refill of this order is in progress
refill_too_soon409A refill of this order was requested recently
refill_temporarily_unavailable503The platform did not answer; try the refill again later
adjustment_above_max400The adjustment is above the configured maximum
service_unavailable409Service is not available
invalid_quantity400Quantity is out of the allowed range
verdict_not_allowed409This verdict is not allowed at this stage
wrong_cabinet403This address belongs to a different cabinet
email_not_verified403Confirm your email address first
api_scope_not_allowed403This account cannot hold an API key with these scopes
invalid_token400This link or code is no longer valid
two_factor_required401A sign-in code is required