{"openapi":"3.1.0","info":{"title":"Panel Follows API","version":"2026-08-20","summary":"Modern REST API for ordering social media marketing services.","description":"Resource-oriented JSON API with real HTTP status codes, machine-readable error\ncodes, cursor pagination, idempotent order creation and signed webhooks.\n\nEvery service publishes its own order field schema, so a client can build and\nvalidate its order form without hardcoding service types.\n\nRate limit: 600 requests per minute per API key.\n\nThe classic reseller API remains available at /api/v2 and is not deprecated."},"servers":[{"url":"https://panelfollows.com/api/v3"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Send your API key as: Authorization: Bearer pf_live_..."}},"schemas":{"List":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"type":"object"}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"total":{"type":"integer"}},"required":["object","data","has_more","next_cursor"]},"GenericObject":{"type":"object","additionalProperties":true},"ApiRoot":{"type":"object","additionalProperties":true},"ErrorCode":{"type":"object","properties":{"object":{"type":"string","const":"error_code"},"code":{"type":"string","enum":["missing_api_key","invalid_api_key","revoked_api_key","account_banned","account_suspended","insufficient_scope","invalid_json","unsupported_content_type","method_not_allowed","payload_too_large","missing_parameter","invalid_parameter","invalid_link","invalid_quantity","quantity_out_of_range","invalid_comments","invalid_username","invalid_subscription","invalid_runs","invalid_interval","dripfeed_not_supported","missing_required_field","service_inactive","invalid_cursor","invalid_limit","invalid_webhook_url","invalid_events","batch_too_large","cancel_not_supported","refill_not_supported","unknown_endpoint","service_not_found","order_not_found","refill_not_found","webhook_not_found","order_not_cancelable","cancel_rejected","order_not_completed","duplicate_link","idempotency_key_reuse","idempotency_in_progress","webhook_limit_reached","insufficient_balance","rate_limit_exceeded","provider_error","refill_failed","service_temporarily_unavailable","internal_error"]},"type":{"type":"string"},"status":{"type":"integer"},"message":{"type":"string"}}},"Error":{"type":"object","properties":{"object":{"type":"string","const":"error"},"error":{"type":"object","properties":{"type":{"type":"string","enum":["authentication_error","permission_error","invalid_request_error","not_found_error","conflict_error","insufficient_funds_error","rate_limit_error","provider_error","service_unavailable_error","api_error"]},"code":{"type":"string","enum":["missing_api_key","invalid_api_key","revoked_api_key","account_banned","account_suspended","insufficient_scope","invalid_json","unsupported_content_type","method_not_allowed","payload_too_large","missing_parameter","invalid_parameter","invalid_link","invalid_quantity","quantity_out_of_range","invalid_comments","invalid_username","invalid_subscription","invalid_runs","invalid_interval","dripfeed_not_supported","missing_required_field","service_inactive","invalid_cursor","invalid_limit","invalid_webhook_url","invalid_events","batch_too_large","cancel_not_supported","refill_not_supported","unknown_endpoint","service_not_found","order_not_found","refill_not_found","webhook_not_found","order_not_cancelable","cancel_rejected","order_not_completed","duplicate_link","idempotency_key_reuse","idempotency_in_progress","webhook_limit_reached","insufficient_balance","rate_limit_exceeded","provider_error","refill_failed","service_temporarily_unavailable","internal_error"]},"message":{"type":"string"},"param":{"type":"string"},"detail":{"type":"string"},"doc_url":{"type":"string"},"request_id":{"type":"string"}},"required":["type","code","message","doc_url","request_id"]}},"required":["object","error"]},"Account":{"type":"object","properties":{"object":{"type":"string","const":"account"},"id":{"type":"string"},"email":{"type":"string"},"balance":{"type":"string","description":"Decimal string, USD."},"currency":{"type":"string"},"low_balance_threshold":{"type":["string","null"],"description":"Balance below which account.low_balance is emitted. null = alert disabled."},"api_key":{"type":"object","additionalProperties":true},"rate_limit":{"type":"object","additionalProperties":true}}},"Category":{"type":"object","properties":{"object":{"type":"string","const":"category"},"slug":{"type":"string"},"name":{"type":"string"},"platform":{"type":"string","description":"Platform key, usable as ?platform=."},"shelf":{"type":["string","null"],"description":"Shelf key (followers, likes, views, ...), usable as ?shelf= on /services/top. null for legacy categories outside the taxonomy."},"service_count":{"type":"integer"}}},"ServiceQuality":{"type":"object","description":"Quality report derived from hourly health measurements. Numbers are ratios (0-1) and integer scores, never money.","properties":{"object":{"type":"string","const":"service_quality"},"score":{"type":"integer","minimum":0,"maximum":100},"grade":{"type":"string","enum":["A","B","C","D"]},"confidence":{"type":"string","enum":["none","low","medium","high"],"description":"How much of the score rests on our own orders for this service."},"rank":{"type":"integer","description":"Position in the list; only on /services/top."},"ranked":{"type":"boolean","description":"Eligible for the /services/top shortlist."},"unranked_reason":{"type":["string","null"],"enum":["inactive","not_assessed","under_review","health_flag","source_probation",null]},"badges":{"type":"array","items":{"type":"string","enum":["proven","popular","fast","trusted_source","new"]}},"components":{"type":"object","properties":{"reliability":{"type":"number"},"satisfaction":{"type":"number"},"speed":{"type":"number"},"health":{"type":"number"},"evidence":{"type":"number"}}},"evidence":{"type":"object","properties":{"basis":{"type":"string","enum":["service_orders","peer_services","none"]},"window_days":{"type":"integer"},"orders":{"type":"integer"},"completed":{"type":"integer"},"failed":{"type":"integer"},"complaints":{"type":"integer"},"success_rate":{"type":["number","null"]},"success_rate_lower_bound":{"type":["number","null"]},"complaint_rate":{"type":["number","null"]},"delivery_seconds":{"type":["integer","null"]},"delivery_source":{"type":["string","null"],"enum":["measured","claimed",null]},"median_delivery_seconds":{"type":["integer","null"]}}},"health":{"type":["object","null"],"properties":{"status":{"type":"string"},"stage":{"type":"string"},"score":{"type":"integer"}}},"measured_at":{"type":["string","null"],"format":"date-time"}},"required":["object","score","grade","confidence","ranked","badges","components","evidence"]},"ServiceGroup":{"type":"object","description":"One group of GET /services/top?group_by=...: a shortlist per category or platform.","properties":{"object":{"type":"string","const":"service_group"},"key":{"type":"string"},"category":{"$ref":"#/components/schemas/Category"},"platform":{"$ref":"#/components/schemas/Platform"},"candidates":{"type":"integer","description":"Ranked services in this group before per_group."},"services":{"type":"array","items":{"$ref":"#/components/schemas/Service"}}}},"Platform":{"type":"object","properties":{"object":{"type":"string","const":"platform"},"key":{"type":"string"},"name":{"type":"string"},"service_count":{"type":"integer"}}},"Field":{"type":"object","description":"One input field required by this service. Use it to render and validate your own order form.","properties":{"name":{"type":"string"},"type":{"type":"string","enum":["url","integer","string","text_lines"]},"required":{"type":"boolean"},"label":{"type":"string"},"description":{"type":"string"},"min":{"type":"integer"},"max":{"type":"integer"},"determines_quantity":{"type":"boolean"}},"required":["name","type","required","label","description"]},"Service":{"type":"object","properties":{"object":{"type":"string","const":"service"},"id":{"type":"integer"},"name":{"type":"string"},"description":{"type":["string","null"]},"type":{"type":"string"},"platform":{"type":"string"},"category":{"type":"object","additionalProperties":true},"pricing":{"type":"object","properties":{"rate":{"type":"string"},"currency":{"type":"string"},"unit":{"type":"string","enum":["per_1000","per_order"]},"unit_note":{"type":"string"}}},"limits":{"type":"object","properties":{"min":{"type":"integer"},"max":{"type":"integer"}}},"features":{"type":"object","properties":{"refill":{"type":"boolean"},"cancel":{"type":"boolean"},"dripfeed":{"type":"boolean"}}},"average_time_seconds":{"type":["integer","null"]},"fields":{"type":"array","items":{"$ref":"#/components/schemas/Field"}},"is_active":{"type":"boolean"},"updated_at":{"type":"string","format":"date-time"},"quality":{"oneOf":[{"$ref":"#/components/schemas/ServiceQuality"},{"type":"null"}],"description":"Present with include=quality and on /services/top; null when the service has not been assessed yet."}}},"Order":{"type":"object","properties":{"object":{"type":"string","const":"order"},"id":{"type":"integer"},"status":{"type":"string","enum":["pending","in_progress","completed","partial","canceled","refunded","failed"],"description":"Stable machine value; never localized."},"status_label":{"type":"string","description":"Localized label for display."},"service":{"oneOf":[{"type":"integer"},{"$ref":"#/components/schemas/Service"}]},"link":{"type":"string"},"quantity":{"type":"integer"},"start_count":{"type":"integer"},"remains":{"type":"integer"},"charge":{"type":"string"},"currency":{"type":"string"},"comments":{"type":["string","null"]},"extra":{"type":["object","null"],"additionalProperties":true},"dripfeed":{"type":["object","null"],"additionalProperties":true},"subscription":{"type":["object","null"],"additionalProperties":true},"cancelable":{"type":"boolean"},"refillable":{"type":"boolean"},"processing_delayed":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"}}},"OrderPreview":{"type":"object","properties":{"object":{"type":"string","const":"order_preview"},"service":{"type":"integer"},"quantity":{"type":"integer"},"runs":{"type":["integer","null"]},"charge":{"type":"string"},"currency":{"type":"string"},"pricing_unit":{"type":"string","enum":["per_1000","per_order"]},"balance_after":{"type":"string"},"sufficient_balance":{"type":"boolean"}}},"Batch":{"type":"object","properties":{"object":{"type":"string","const":"batch"},"count":{"type":"integer"},"succeeded":{"type":"integer"},"results":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"Refill":{"type":"object","properties":{"object":{"type":"string","const":"refill"},"id":{"type":"integer"},"order":{"type":["integer","null"]},"status":{"type":"string"},"created_at":{"type":"string","format":"date-time"}}},"Event":{"type":"object","properties":{"object":{"type":"string","const":"event"},"id":{"type":"string"},"cursor":{"type":"integer"},"type":{"type":"string","enum":["order.created","order.processing","order.completed","order.partial","order.canceled","order.updated","refill.created","refill.updated","account.low_balance"]},"created_at":{"type":"string","format":"date-time"},"data":{"type":"object","additionalProperties":true}}},"WebhookEndpoint":{"type":"object","properties":{"object":{"type":"string","const":"webhook_endpoint"},"id":{"type":"string"},"url":{"type":"string"},"description":{"type":["string","null"]},"events":{"oneOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"is_active":{"type":"boolean"},"failure_count":{"type":"integer"},"last_success_at":{"type":["string","null"],"format":"date-time"},"last_failure_at":{"type":["string","null"],"format":"date-time"},"last_error":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"secret":{"type":"string","description":"Returned only when the endpoint is created or its secret is rotated."}}},"WebhookDelivery":{"type":"object","properties":{"object":{"type":"string","const":"webhook_delivery"},"id":{"type":"string"},"cursor":{"type":"integer"},"event_id":{"type":"string"},"event_type":{"type":"string"},"status":{"type":"string","enum":["pending","succeeded","failed"]},"attempts":{"type":"integer"},"response_status":{"type":["integer","null"]},"error":{"type":["string","null"]},"next_attempt_at":{"type":["string","null"],"format":"date-time"},"delivered_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"}}},"WebhookTest":{"type":"object","properties":{"object":{"type":"string","const":"webhook_test"},"delivered":{"type":"boolean"},"event_id":{"type":"string"},"delivery":{"$ref":"#/components/schemas/WebhookDelivery"}}}}},"paths":{"/":{"get":{"operationId":"getRoot","summary":"Discovery document: version, endpoints, limits and event types.","tags":["root"],"security":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiRoot"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApi","summary":"OpenAPI 3.1 schema for this API.","tags":["openapi.json"],"security":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenericObject"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account":{"get":{"operationId":"getAccount","summary":"Account balance, currency and current rate-limit window.","tags":["account"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateAccount","summary":"Set the low balance alert threshold that triggers account.low_balance.","tags":["account"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"low_balance_threshold":{"type":"string","description":"Emit account.low_balance once the balance drops below this amount, in USD. Send null or an empty string to turn the alert off. The event fires on the crossing, not on every order below it, and re-arms when the balance goes back above the threshold."}}}}}}}},"/services":{"get":{"operationId":"listServices","summary":"List services with filters and cursor pagination.","tags":["services"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, 1-500 (default 100). Out-of-range values return an error.","schema":{"type":"integer"}},{"name":"starting_after","in":"query","required":false,"description":"Cursor: the id of the last item on the previous page.","schema":{"type":"integer"}},{"name":"lang","in":"query","required":false,"description":"Response language for names, descriptions, status labels and error messages. Overrides Accept-Language. One of: tr, en, es, ru, pt, pt-br, nl, ko, ja, zh.","schema":{"type":"string"}},{"name":"platform","in":"query","required":false,"description":"Filter by platform key, e.g. instagram. See GET /platforms.","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Filter by category slug. See GET /categories.","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Filter by service type, e.g. default, custom_comments, package.","schema":{"type":"string"}},{"name":"search","in":"query","required":false,"description":"Case-insensitive substring match on the service name.","schema":{"type":"string"}},{"name":"refill","in":"query","required":false,"description":"Only services that offer refill (true) or do not (false).","schema":{"type":"boolean"}},{"name":"cancel","in":"query","required":false,"description":"Only services that support cancellation.","schema":{"type":"boolean"}},{"name":"dripfeed","in":"query","required":false,"description":"Only services that support drip-feed.","schema":{"type":"boolean"}},{"name":"min_rate","in":"query","required":false,"description":"Minimum price, in your own pricing (same scale as pricing.rate).","schema":{"type":"string"}},{"name":"max_rate","in":"query","required":false,"description":"Maximum price, in your own pricing.","schema":{"type":"string"}},{"name":"is_active","in":"query","required":false,"description":"Defaults to true. Pass false to list services closed for ordering.","schema":{"type":"boolean"}},{"name":"include","in":"query","required":false,"description":"Set to 'quality' to embed the service_quality object (score, grade, confidence, evidence) in each service.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/List"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Service"}}}}]}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/services/top":{"get":{"operationId":"topServices","summary":"Best services ranked by the quality score; optionally one shortlist per category or platform.","tags":["services"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"platform","in":"query","required":false,"description":"Only services on this platform key, e.g. instagram. See GET /platforms.","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Only services in this category slug. See GET /categories.","schema":{"type":"string"}},{"name":"shelf","in":"query","required":false,"description":"Only services on this shelf across all platforms, e.g. followers, likes, views. Shelf values appear on category objects.","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Only services of this type, e.g. default, package.","schema":{"type":"string"}},{"name":"refill","in":"query","required":false,"description":"Only services that offer refill (true) or do not (false).","schema":{"type":"boolean"}},{"name":"min_rate","in":"query","required":false,"description":"Minimum price, in your own pricing (same scale as pricing.rate).","schema":{"type":"string"}},{"name":"max_rate","in":"query","required":false,"description":"Maximum price, in your own pricing.","schema":{"type":"string"}},{"name":"min_confidence","in":"query","required":false,"description":"Drop services whose quality.confidence is below this level: none (default), low, medium or high. Use medium to see only services proven by our own orders.","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"score (default, the quality score), speed (fastest delivery first), reliability, price (cheapest first) or orders (most ordered first). Ties keep the quality order.","schema":{"type":"string"}},{"name":"group_by","in":"query","required":false,"description":"category or platform: return one service_group per category/platform, each with its own shortlist, instead of a flat list.","schema":{"type":"string"}},{"name":"per_group","in":"query","required":false,"description":"With group_by: services per group, 1-20 (default 3).","schema":{"type":"integer"}},{"name":"limit","in":"query","required":false,"description":"Flat list: 1-100 services (default 20). With group_by: 1-200 groups (default 100). This endpoint is a shortlist and has no cursor; use GET /services?include=quality for the whole catalog.","schema":{"type":"integer"}},{"name":"lang","in":"query","required":false,"description":"Response language for names, descriptions, status labels and error messages. Overrides Accept-Language. One of: tr, en, es, ru, pt, pt-br, nl, ko, ja, zh.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/List"},{"type":"object","properties":{"data":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/Service"},{"$ref":"#/components/schemas/ServiceGroup"}]}}}}]}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/services/{id}":{"get":{"operationId":"getService","summary":"Retrieve one service, including its order field schema.","tags":["services"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Service id.","schema":{"type":"integer"}},{"name":"include","in":"query","required":false,"description":"Set to 'quality' to embed the service_quality object (score, grade, confidence, evidence) in each service.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Response language for names, descriptions, status labels and error messages. Overrides Accept-Language. One of: tr, en, es, ru, pt, pt-br, nl, ko, ja, zh.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Service"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/categories":{"get":{"operationId":"listCategories","summary":"List categories with platform, shelf and active service counts.","tags":["categories"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"lang","in":"query","required":false,"description":"Response language for names, descriptions, status labels and error messages. Overrides Accept-Language. One of: tr, en, es, ru, pt, pt-br, nl, ko, ja, zh.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/List"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}}]}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/platforms":{"get":{"operationId":"listPlatforms","summary":"List platform keys usable as the ?platform= filter, with counts.","tags":["platforms"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/List"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Platform"}}}}]}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders":{"post":{"operationId":"createOrder","summary":"Create an order. Supports the Idempotency-Key header.","tags":["orders"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Unique key for this request. Retrying with the same key returns the first response instead of creating a second order.","schema":{"type":"string","maxLength":255}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"service":{"type":"integer","description":"Service id."},"link":{"type":"string","description":"Target link. Required for every service type except subscriptions."},"quantity":{"type":"integer","description":"Amount to deliver. Not sent for package services or for types whose quantity comes from a list field."},"runs":{"type":"integer","description":"Drip-feed: number of batches (2 or more enables drip-feed)."},"interval":{"type":"integer","description":"Drip-feed: minutes between batches."},"comments":{"type":"string","description":"One comment per line; the line count sets the quantity."},"username":{"type":"string","description":"Subscriptions and mention types: target username."},"posts":{"type":"integer","description":"Subscriptions: how many future posts to cover (1-100)."},"min":{"type":"integer","description":"Subscriptions: minimum amount per post."},"max":{"type":"integer","description":"Subscriptions: maximum amount per post."},"answer_number":{"type":"integer","description":"Poll services: which option to vote for, counting from 1."},"usernames":{"type":"string","description":"Mention list types: one username per line."},"hashtag":{"type":"string","description":"Hashtag types: a single hashtag without #."},"hashtags":{"type":"string","description":"Hashtag list types: one hashtag per line."},"groups":{"type":"string","description":"Group invite types: one group link per line."},"keywords":{"type":"string","description":"SEO types: one keyword per line."},"media":{"type":"string","description":"Media-likers types: link of the post whose likers are targeted."}},"required":["service"]}}}}},"get":{"operationId":"listOrders","summary":"List your orders, newest first.","tags":["orders"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, 1-500 (default 100). Out-of-range values return an error.","schema":{"type":"integer"}},{"name":"starting_after","in":"query","required":false,"description":"Cursor: the id of the last item on the previous page.","schema":{"type":"integer"}},{"name":"lang","in":"query","required":false,"description":"Response language for names, descriptions, status labels and error messages. Overrides Accept-Language. One of: tr, en, es, ru, pt, pt-br, nl, ko, ja, zh.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Comma-separated status filter: pending, in_progress, completed, partial, canceled, refunded, failed.","schema":{"type":"string"}},{"name":"service","in":"query","required":false,"description":"Only orders for this service id.","schema":{"type":"integer"}},{"name":"created_after","in":"query","required":false,"description":"ISO 8601 timestamp; only orders created at or after it.","schema":{"type":"string"}},{"name":"include","in":"query","required":false,"description":"Set to 'service' to embed the service object in each order.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/List"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Order"}}}}]}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/preview":{"post":{"operationId":"previewOrder","summary":"Validate an order and compute its charge without creating it.","tags":["orders"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderPreview"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/batch":{"post":{"operationId":"batchOrders","summary":"Create up to 50 orders in one call; each item reports its own result.","tags":["orders"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Unique key for this request. Retrying with the same key returns the first response instead of creating a second order.","schema":{"type":"string","maxLength":255}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"orders":{"type":"array","items":{"type":"object"},"description":"Array of order objects, each shaped like the POST /orders body."}},"required":["orders"]}}}}}},"/orders/{id}":{"get":{"operationId":"getOrder","summary":"Retrieve one order.","tags":["orders"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Order id.","schema":{"type":"integer"}},{"name":"include","in":"query","required":false,"description":"Set to 'service' to embed the service object.","schema":{"type":"string"}},{"name":"lang","in":"query","required":false,"description":"Response language for names, descriptions, status labels and error messages. Overrides Accept-Language. One of: tr, en, es, ru, pt, pt-br, nl, ko, ja, zh.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{id}/cancel":{"post":{"operationId":"cancelOrder","summary":"Request cancellation. Only for services whose features.cancel is true.","tags":["orders"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Order id.","schema":{"type":"integer"}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{id}/refill":{"post":{"operationId":"refillOrder","summary":"Request a refill for a completed order.","description":"If the provider only opens refills 24 hours after completion, the refill is queued (status Pending) and submitted automatically when the window opens. Repeating the call within 24 hours returns the existing refill instead of creating a new one.","tags":["orders"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Order id.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Refill"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/refills":{"get":{"operationId":"listRefills","summary":"List your refill requests, newest first.","tags":["refills"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, 1-500 (default 100). Out-of-range values return an error.","schema":{"type":"integer"}},{"name":"starting_after","in":"query","required":false,"description":"Cursor: the id of the last item on the previous page.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/List"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Refill"}}}}]}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/refills/{id}":{"get":{"operationId":"getRefill","summary":"Retrieve one refill; refreshes its status from the provider.","tags":["refills"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Refill id.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Refill"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/events":{"get":{"operationId":"listEvents","summary":"Read your event stream oldest-first; the polling alternative to webhooks.","tags":["events"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, 1-500 (default 100). Out-of-range values return an error.","schema":{"type":"integer"}},{"name":"starting_after","in":"query","required":false,"description":"Cursor: the 'cursor' value of the last event you processed.","schema":{"type":"integer"}},{"name":"type","in":"query","required":false,"description":"Comma-separated event type filter.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/List"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}}]}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks":{"get":{"operationId":"listWebhooks","summary":"List your webhook endpoints.","tags":["webhooks"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/List"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}}}}]}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createWebhook","summary":"Register a webhook endpoint. The signing secret is returned once.","tags":["webhooks"],"security":[{"bearerAuth":[]}],"parameters":[],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Public https:// URL that will receive events."},"events":{"type":"array","items":{"type":"object"},"description":"Event types to subscribe to. Omit to receive all of them."},"description":{"type":"string","description":"Free-text label, up to 200 characters."}},"required":["url"]}}}}}},"/webhooks/{id}":{"get":{"operationId":"getWebhook","summary":"Retrieve one webhook endpoint.","tags":["webhooks"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Endpoint id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateWebhook","summary":"Update a webhook endpoint's url, events, description or active state.","tags":["webhooks"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Endpoint id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"New https:// URL."},"events":{"type":"array","items":{"type":"object"},"description":"New event subscription list."},"description":{"type":"string","description":"New label."},"is_active":{"type":"boolean","description":"Enable or disable delivery. Enabling resets the failure counter."}}}}}}},"delete":{"operationId":"deleteWebhook","summary":"Delete a webhook endpoint and its delivery log.","tags":["webhooks"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Endpoint id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenericObject"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{id}/test":{"post":{"operationId":"testWebhook","summary":"Send a test event to this endpoint, ignoring its event filter.","tags":["webhooks"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Endpoint id.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTest"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{id}/rotate_secret":{"post":{"operationId":"rotateWebhookSecret","summary":"Generate a new signing secret. The old one stops working immediately.","tags":["webhooks"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Endpoint id.","schema":{"type":"string"}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{id}/deliveries":{"get":{"operationId":"listDeliveries","summary":"Delivery log for one endpoint: attempts, response codes and errors.","tags":["webhooks"],"security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Endpoint id.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1-500 (default 100). Out-of-range values return an error.","schema":{"type":"integer"}},{"name":"starting_after","in":"query","required":false,"description":"Cursor: the id of the last item on the previous page.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/List"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}}}}]}}}},"4XX":{"description":"Client error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"5XX":{"description":"Server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}