API documentation

Prestoclick has two deliberately different APIs. Use the PP-v2 compatible API with existing reseller tooling. Use the native REST API for new integrations; it is the only API that can create and control campaigns.

PP-v2 uses form data and an action parameter. Except for invalid API keys, failures are returned as HTTP 200 JSON error bodies. Native REST uses JSON, Bearer authentication, versioned paths, and meaningful HTTP status codes.

Get an API key

Create it at API → Keys after signing in. Each account can have exactly one active key. The complete key is shown once when it is created and cannot be displayed again, so copy it then. Revoking disables it; regenerating atomically disables the old key and creates a new one.

There are no enforced request, velocity, or spend limits. Unusual request volume raises an internal anomaly alert, and an administrator can manually revoke a key.

PP-v2 compatible API

Send every request to POST /api/pp-v2 as application/x-www-form-urlencoded. Every request needs key: string and action: string.

POST /api/pp-v2 (balance)

Read your available customer credit.

Parameters: key: string; action: "balance".

Request

curl https://prestoclick.example/api/pp-v2 \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'key=pk_live_REPLACE_WITH_YOUR_KEY' \
  --data-urlencode 'action=balance'

Response

HTTP 200
{"balance":"42.500000","currency":"USD"}

POST /api/pp-v2 (services)

List published Prestoclick products. Product ids and prices are customer-facing; no upstream identity is returned.

Parameters: key: string; action: "services". rate is a quoted decimal string; min and max are numbers.

Request

curl https://prestoclick.example/api/pp-v2 \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'key=pk_live_REPLACE_WITH_YOUR_KEY' \
  --data-urlencode 'action=services'

Response

HTTP 200
[{"service":"prod_demo_123","name":"Aurora Social Reach","type":"Default","category":"Social growth","rate":"12.750000","min":50,"max":10000,"refill":true,"cancel":false,"dripfeed":false}]

POST /api/pp-v2 (add)

Place an order for a Prestoclick product. Arbitrary additional form fields are passed through as order parameters. An identical request retried within five minutes returns the same order id and does not charge twice.

Parameters: key: string; action: "add"; service: string (product id); link: string; quantity: positive integer; optional extra string fields.

Request

curl https://prestoclick.example/api/pp-v2 \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'key=pk_live_REPLACE_WITH_YOUR_KEY' \
  --data-urlencode 'action=add' \
  --data-urlencode 'service=prod_demo_123' \
  --data-urlencode 'link=https://example.com/posts/launch' \
  --data-urlencode 'quantity=500'

Response

HTTP 200
{"order":"ord_demo_7f3a"}

POST /api/pp-v2 (status)

Read one order status, or several in a single request.

Parameters: key: string; action: "status"; order: string containing one order id or a comma-separated list (up to 100).

Request

curl https://prestoclick.example/api/pp-v2 \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'key=pk_live_REPLACE_WITH_YOUR_KEY' \
  --data-urlencode 'action=status' \
  --data-urlencode 'order=ord_demo_7f3a'

Response

HTTP 200
{"charge":"6.375000","start_count":1250,"status":"Processing","remains":275,"currency":"USD"}

Batch responses are keyed by order id:
{"ord_demo_7f3a":{"charge":"6.375000","start_count":1250,"status":"Processing","remains":275,"currency":"USD"}}

POST /api/pp-v2 (refill)

Request a refill where the product supports it. Batch requests return an array.

Parameters: key: string; action: "refill"; order: string containing one id or a comma-separated list.

Request

curl https://prestoclick.example/api/pp-v2 \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'key=pk_live_REPLACE_WITH_YOUR_KEY' \
  --data-urlencode 'action=refill' \
  --data-urlencode 'order=ord_demo_7f3a'

Response

HTTP 200
{"refill":"ref_demo_204"}

POST /api/pp-v2 (cancel)

Request cancellation where the product supports it. The response is always an array, including for one order.

Parameters: key: string; action: "cancel"; order: string containing one id or a comma-separated list. The alias orders is also accepted.

Request

curl https://prestoclick.example/api/pp-v2 \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'key=pk_live_REPLACE_WITH_YOUR_KEY' \
  --data-urlencode 'action=cancel' \
  --data-urlencode 'order=ord_demo_7f3a'

Response

HTTP 200
[{"order":"ord_demo_7f3a","cancel":true}]

Native REST API

Send Authorization: Bearer <api key>. Request and response bodies are JSON, fields are camelCase, and routes are versioned under /api/v1/.

GET /api/v1/balance

Read available customer credit.

Parameters: No body.

Request

curl https://prestoclick.example/api/v1/balance \
  -H 'Authorization: Bearer pk_live_REPLACE_WITH_YOUR_KEY'

Response

HTTP 200
{"balance":"42.500000","currency":"USD"}

GET /api/v1/orders

List your orders, newest first.

Parameters: No body.

Request

curl https://prestoclick.example/api/v1/orders \
  -H 'Authorization: Bearer pk_live_REPLACE_WITH_YOUR_KEY'

Response

HTTP 200
{"orders":[{"id":"ord_demo_7f3a","productId":"prod_demo_123","link":"https://example.com/posts/launch","quantity":500,"params":{},"status":"processing","startCount":1250,"remains":275,"customerRate":"12.750000","customerCharge":"6.375000","scheduleId":null,"scheduleRunId":null,"placedAt":"2026-08-15T10:00:00.000Z","createdAt":"2026-08-15T09:59:58.000Z","updatedAt":"2026-08-15T10:02:00.000Z"}]}

GET /api/v1/orders/{id}

Read one of your orders.

Parameters: id: string path parameter.

Request

curl https://prestoclick.example/api/v1/orders/ord_demo_7f3a \
  -H 'Authorization: Bearer pk_live_REPLACE_WITH_YOUR_KEY'

Response

HTTP 200
{"order":{"id":"ord_demo_7f3a","productId":"prod_demo_123","link":"https://example.com/posts/launch","quantity":500,"params":{},"status":"processing","startCount":1250,"remains":275,"customerRate":"12.750000","customerCharge":"6.375000","scheduleId":null,"scheduleRunId":null,"placedAt":"2026-08-15T10:00:00.000Z","createdAt":"2026-08-15T09:59:58.000Z","updatedAt":"2026-08-15T10:02:00.000Z"}}

GET /api/v1/campaigns

List your campaigns, newest first.

Parameters: No body.

Request

curl https://prestoclick.example/api/v1/campaigns \
  -H 'Authorization: Bearer pk_live_REPLACE_WITH_YOUR_KEY'

Response

HTTP 200
{"campaigns":[]}

POST /api/v1/campaigns

Create a campaign. Set enabled to true to validate and start it immediately.

Parameters: name: non-empty string; link: non-empty string; timezone?: string; params?: object of string/number values; enabled?: boolean; dryRun?: boolean; target: {providerId: string, providerServiceId: string} or {serviceGroupId: string}; mode: once, repeat, or drip object; optional maxRate, maxSpendTotal, requireBalanceAbove: decimal strings.

Request

curl https://prestoclick.example/api/v1/campaigns \
  -X POST \
  -H 'Authorization: Bearer pk_live_REPLACE_WITH_YOUR_KEY' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Launch day","link":"https://example.com/posts/launch","timezone":"UTC","params":{},"enabled":false,"target":{"serviceGroupId":"group_demo_social"},"mode":{"kind":"once","quantity":500,"runAt":"2026-08-20T14:00:00.000Z"}}'

Response

HTTP 201
{"campaign":{"id":"camp_demo_91b2","name":"Launch day","kind":"once","link":"https://example.com/posts/launch","params":{},"timezone":"UTC","enabled":false,"target":{"serviceGroupId":"group_demo_social"},"quantity":500,"runAt":"2026-08-20T14:00:00.000Z","createdAt":"2026-08-15T10:00:00.000Z","updatedAt":"2026-08-15T10:00:00.000Z"}}

GET /api/v1/campaigns/{id}

Read one of your campaigns.

Parameters: id: string path parameter.

Request

curl https://prestoclick.example/api/v1/campaigns/camp_demo_91b2 \
  -H 'Authorization: Bearer pk_live_REPLACE_WITH_YOUR_KEY'

Response

HTTP 200
{"campaign":{"id":"camp_demo_91b2","name":"Launch day","kind":"once","link":"https://example.com/posts/launch","enabled":false,"target":{"serviceGroupId":"group_demo_social"},"quantity":500}}

PATCH /api/v1/campaigns/{id}

Update one or more campaign fields. Enabling is handled by the resume endpoint, not PATCH.

Parameters: Any non-empty subset of the create fields except enabled.

Request

curl https://prestoclick.example/api/v1/campaigns/camp_demo_91b2 \
  -X PATCH \
  -H 'Authorization: Bearer pk_live_REPLACE_WITH_YOUR_KEY' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Launch day — revised"}'

Response

HTTP 200
{"campaign":{"id":"camp_demo_91b2","name":"Launch day — revised","kind":"once","link":"https://example.com/posts/launch","enabled":false}}

DELETE /api/v1/campaigns/{id}

Permanently delete one of your campaigns.

Parameters: id: string path parameter; no body.

Request

curl https://prestoclick.example/api/v1/campaigns/camp_demo_91b2 \
  -X DELETE \
  -H 'Authorization: Bearer pk_live_REPLACE_WITH_YOUR_KEY'

Response

HTTP 204
(empty body)

POST /api/v1/campaigns/{id}/pause

Pause an enabled campaign.

Parameters: id: string path parameter; no body.

Request

curl https://prestoclick.example/api/v1/campaigns/camp_demo_91b2/pause \
  -X POST \
  -H 'Authorization: Bearer pk_live_REPLACE_WITH_YOUR_KEY'

Response

HTTP 200
{"campaign":{"id":"camp_demo_91b2","enabled":false,"pauseKind":"user","pausedReason":"Paused by user"}}

POST /api/v1/campaigns/{id}/resume

Validate and enable a paused campaign. Stale planned runs are reported as missed instead of firing in a burst.

Parameters: id: string path parameter; no body.

Request

curl https://prestoclick.example/api/v1/campaigns/camp_demo_91b2/resume \
  -X POST \
  -H 'Authorization: Bearer pk_live_REPLACE_WITH_YOUR_KEY'

Response

HTTP 200
{"campaign":{"id":"camp_demo_91b2","enabled":true},"missedRuns":0}

GET /api/v1/campaigns/{id}/runs

List runs belonging to one of your campaigns.

Parameters: id: string campaign path parameter.

Request

curl https://prestoclick.example/api/v1/campaigns/camp_demo_91b2/runs \
  -H 'Authorization: Bearer pk_live_REPLACE_WITH_YOUR_KEY'

Response

HTTP 200
{"runs":[{"id":"run_demo_01","campaignId":"camp_demo_91b2","seq":1,"scheduledFor":"2026-08-20T14:00:00.000Z","plannedQuantity":500,"status":"planned","orderId":null,"attempt":0,"error":null,"firedAt":null,"createdAt":"2026-08-15T10:00:00.000Z","updatedAt":"2026-08-15T10:00:00.000Z"}]}

GET /api/v1/campaigns/{id}/runs/{runId}

Read one run belonging to one of your campaigns.

Parameters: id: string campaign path parameter; runId: string run path parameter.

Request

curl https://prestoclick.example/api/v1/campaigns/camp_demo_91b2/runs/run_demo_01 \
  -H 'Authorization: Bearer pk_live_REPLACE_WITH_YOUR_KEY'

Response

HTTP 200
{"run":{"id":"run_demo_01","campaignId":"camp_demo_91b2","seq":1,"scheduledFor":"2026-08-20T14:00:00.000Z","plannedQuantity":500,"status":"planned","orderId":null}}
SMM panel API documentation | Prestoclick