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}}