{
  "openapi": "3.1.0",
  "info": {
    "title": "PanelCompare API",
    "version": "1",
    "summary": "Open price index, trust scores and catalogues of SMM panels.",
    "description": "Read-only JSON API behind https://panelcompare.com. It tracks the public catalogues of SMM panels (the wholesale resellers behind social-media engagement services), maps every listing onto a canonical service, and publishes per-service price indexes (min, quartiles, median, max and a quotable range per 1,000 units), trust and overall scores, uptime and catalogue size per panel. No key, open CORS, GET only. All prices are USD per 1,000 units unless a currency field says otherwise. Every response carries `_meta` with the licence and an attribution line; please keep it with the data.",
    "contact": {
      "name": "PanelCompare",
      "url": "https://panelcompare.com/api-docs",
      "email": "hello@panelcompare.com"
    },
    "license": {
      "name": "CC BY 4.0",
      "identifier": "CC-BY-4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/"
    },
    "termsOfService": "https://panelcompare.com/terms"
  },
  "externalDocs": {
    "description": "Methodology",
    "url": "https://panelcompare.com/methodology"
  },
  "servers": [
    {
      "url": "https://panelcompare.com"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Panels",
      "description": "SMM panels: scores, uptime, features and catalogues."
    },
    {
      "name": "Services",
      "description": "The canonical service taxonomy and per-service offers."
    },
    {
      "name": "Market",
      "description": "Daily price index and market-wide totals."
    },
    {
      "name": "Bulk",
      "description": "Whole datasets as CSV or JSON files."
    }
  ],
  "paths": {
    "/api/v1": {
      "get": {
        "tags": [
          "Market"
        ],
        "operationId": "getDiscovery",
        "summary": "Discovery document listing every endpoint",
        "responses": {
          "200": {
            "description": "Endpoints, bulk files and feeds.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "_meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "object"
                    },
                    "_meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/panels": {
      "get": {
        "tags": [
          "Panels"
        ],
        "operationId": "listPanels",
        "summary": "Ranked list of tracked SMM panels",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Rows per page, at most 200.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Rows to skip.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "best",
                "cheapest",
                "trust",
                "newest",
                "services",
                "uptime",
                "rating"
              ],
              "default": "best"
            }
          },
          {
            "name": "platform",
            "in": "query",
            "description": "Platform slug, e.g. `instagram`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "payment",
            "in": "query",
            "description": "Payment method slug, e.g. `paypal`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "description": "ISO 3166-1 alpha-2 country code.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "feature",
            "in": "query",
            "description": "Repeat to require several features.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "api",
                  "child-panel",
                  "drip-feed",
                  "refill",
                  "cancel-button",
                  "geo-targeting",
                  "subscriptions",
                  "live-chat",
                  "free-trial",
                  "mass-order"
                ]
              }
            },
            "style": "form",
            "explode": true
          },
          {
            "name": "minTrust",
            "in": "query",
            "description": "Minimum trust score, 0-100.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "maxDeposit",
            "in": "query",
            "description": "Maximum minimum deposit, USD.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "q",
            "in": "query",
            "description": "Name or domain search.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "One page of panels.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "_meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Panel"
                      }
                    },
                    "_meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/Meta"
                        },
                        {
                          "type": "object",
                          "required": [
                            "pagination"
                          ],
                          "properties": {
                            "pagination": {
                              "$ref": "#/components/schemas/Pagination"
                            }
                          }
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Unknown `sort` or `feature` value.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/panels/{slug}": {
      "get": {
        "tags": [
          "Panels"
        ],
        "operationId": "getPanel",
        "summary": "One panel, with its catalogue of offerings",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "justanotherpanel"
          }
        ],
        "responses": {
          "200": {
            "description": "The panel.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "_meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Panel"
                    },
                    "_meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No panel with this slug.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/services": {
      "get": {
        "tags": [
          "Services"
        ],
        "operationId": "listServices",
        "summary": "Canonical service taxonomy across every platform",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "Rows per page, at most 200.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Rows to skip.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          },
          {
            "name": "platform",
            "in": "query",
            "description": "Platform slug.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "One page of services.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "_meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Service"
                      }
                    },
                    "_meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/Meta"
                        },
                        {
                          "type": "object",
                          "required": [
                            "pagination"
                          ],
                          "properties": {
                            "pagination": {
                              "$ref": "#/components/schemas/Pagination"
                            }
                          }
                        }
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/services/{platform}/{service}": {
      "get": {
        "tags": [
          "Services"
        ],
        "operationId": "getServiceOffers",
        "summary": "Every panel selling one service, cheapest first, with the market index",
        "parameters": [
          {
            "name": "platform",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "instagram"
          },
          {
            "name": "service",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "followers"
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Rows per page, at most 200.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Rows to skip.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          },
          {
            "name": "minTrust",
            "in": "query",
            "description": "Minimum trust score, 0-100.",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The service, its latest index, 90 days of index history and one page of offers.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "_meta"
                  ],
                  "properties": {
                    "data": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/Service"
                        },
                        {
                          "type": "object",
                          "properties": {
                            "priceIndex": {
                              "oneOf": [
                                {
                                  "$ref": "#/components/schemas/ServicePriceIndex"
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            },
                            "priceIndexHistory": {
                              "type": "array",
                              "items": {
                                "type": "object"
                              }
                            },
                            "offers": {
                              "type": "array",
                              "items": {
                                "$ref": "#/components/schemas/Offer"
                              }
                            }
                          }
                        }
                      ]
                    },
                    "_meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No service at this path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/price-index": {
      "get": {
        "tags": [
          "Market"
        ],
        "operationId": "getPriceIndex",
        "summary": "Latest daily price index, one row per service",
        "responses": {
          "200": {
            "description": "Index rows.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "_meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PriceIndexRow"
                      }
                    },
                    "_meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/stats": {
      "get": {
        "tags": [
          "Market"
        ],
        "operationId": "getStats",
        "summary": "Market-wide totals and per-platform rollups",
        "responses": {
          "200": {
            "description": "Totals.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "_meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "object"
                    },
                    "_meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/data/price-index.csv": {
      "get": {
        "tags": [
          "Bulk"
        ],
        "operationId": "downloadPriceIndexCsv",
        "summary": "Latest price index as CSV",
        "responses": {
          "200": {
            "description": "CSV, one row per service.",
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/data/price-index.json": {
      "get": {
        "tags": [
          "Bulk"
        ],
        "operationId": "downloadPriceIndexJson",
        "summary": "Latest price index as JSON",
        "responses": {
          "200": {
            "description": "Rows of the CSV, with dataset metadata.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "_meta": {
                      "type": "object"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PriceIndexRow"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/data/price-changes.csv": {
      "get": {
        "tags": [
          "Bulk"
        ],
        "operationId": "downloadPriceChangesCsv",
        "summary": "Recorded price changes as CSV, whole UTC days",
        "responses": {
          "200": {
            "description": "CSV of price-change events.",
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/data/panel-facts.csv": {
      "get": {
        "tags": [
          "Bulk"
        ],
        "operationId": "downloadPanelFactsCsv",
        "summary": "Measured facts per panel (domain age, TLS issuer, Tranco rank, order counters) as CSV",
        "responses": {
          "200": {
            "description": "CSV, one row per panel.",
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Meta": {
        "type": "object",
        "required": [
          "generatedAt",
          "license",
          "attribution"
        ],
        "properties": {
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "license": {
            "type": "string",
            "const": "CC-BY-4.0"
          },
          "licenseUrl": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "methodology": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Pagination": {
        "type": "object",
        "required": [
          "limit",
          "offset",
          "total",
          "next"
        ],
        "properties": {
          "limit": {
            "type": "integer"
          },
          "offset": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "Next page, or null on the last one."
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              }
            }
          }
        }
      },
      "Panel": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "domain",
          "url",
          "scores"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "domain": {
            "type": "string"
          },
          "website": {
            "type": "string",
            "format": "uri"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The panel's page on PanelCompare."
          },
          "tagline": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string"
          },
          "launchedYear": {
            "type": [
              "integer",
              "null"
            ]
          },
          "countryCode": {
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "type": [
              "string",
              "null"
            ]
          },
          "minDeposit": {
            "type": [
              "number",
              "null"
            ]
          },
          "isAffiliate": {
            "type": "boolean"
          },
          "isClaimed": {
            "type": "boolean"
          },
          "relationship": {
            "type": [
              "string",
              "null"
            ],
            "description": "A material connection between this panel and the site, or null."
          },
          "isSponsored": {
            "type": "boolean"
          },
          "scores": {
            "type": "object",
            "properties": {
              "overall": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "0-10."
              },
              "overallCoverage": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Share of the weighted evidence behind `overall`, 0-1."
              },
              "trust": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "0-100."
              },
              "trustCoverage": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Share of the weighted trust evidence behind `trust`, 0-1."
              },
              "price": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "feature": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "reliability": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "support": {
                "type": [
                  "number",
                  "null"
                ]
              }
            }
          },
          "rating": {
            "type": "object",
            "properties": {
              "average": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "count": {
                "type": "integer"
              }
            }
          },
          "reliability": {
            "type": "object",
            "properties": {
              "uptimePct30d": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "avgResponseMs": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "lastCheckedAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              }
            }
          },
          "catalogue": {
            "type": "object",
            "properties": {
              "serviceCount": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "categoryCount": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "cheapestPer1000": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "listed": {
                "type": [
                  "object",
                  "null"
                ]
              }
            }
          },
          "features": {
            "type": "object",
            "properties": {
              "api": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "childPanel": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "dripFeed": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "refill": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "cancelButton": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "geoTargeting": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "subscriptions": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "ticketSupport": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "liveChat": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "emailSupport": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "freeTrial": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "massOrder": {
                "type": [
                  "boolean",
                  "null"
                ]
              }
            }
          },
          "paymentMethods": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "platforms": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "supply": {
            "type": "object"
          },
          "listedSince": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "reviewedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "Service": {
        "type": "object",
        "required": [
          "platform",
          "slug",
          "name",
          "url"
        ],
        "properties": {
          "platform": {
            "type": "object",
            "properties": {
              "slug": {
                "type": "string"
              },
              "name": {
                "type": "string"
              }
            }
          },
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "unit": {
            "type": "string"
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "demandTier": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "referencePricePer1000": {
            "type": "object",
            "properties": {
              "low": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "median": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "high": {
                "type": [
                  "number",
                  "null"
                ]
              }
            }
          },
          "typicalOrder": {
            "type": "object",
            "properties": {
              "min": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "max": {
                "type": [
                  "number",
                  "null"
                ]
              }
            }
          }
        }
      },
      "ServicePriceIndex": {
        "type": "object",
        "properties": {
          "day": {
            "type": "string",
            "format": "date"
          },
          "currency": {
            "type": "string"
          },
          "minPricePer1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "p25PricePer1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "medianPricePer1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "p75PricePer1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "maxPricePer1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "panelsSampled": {
            "type": "integer"
          },
          "quotableMinPricePer1000": {
            "type": [
              "number",
              "null"
            ],
            "description": "Cheapest listing that is not a single-order package and sits within 10x of the median."
          },
          "quotableMaxPricePer1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "computedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "Offer": {
        "type": "object",
        "properties": {
          "panel": {
            "type": "object",
            "properties": {
              "slug": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "url": {
                "type": "string",
                "format": "uri"
              },
              "trustScore": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "overallScore": {
                "type": [
                  "number",
                  "null"
                ]
              }
            }
          },
          "pricePer1000": {
            "type": "number",
            "description": "USD."
          },
          "currency": {
            "type": "string"
          },
          "quoted": {
            "type": [
              "object",
              "null"
            ],
            "description": "The panel's own price when it quotes a currency other than USD.",
            "properties": {
              "pricePer1000": {
                "type": "number"
              },
              "currency": {
                "type": "string"
              }
            }
          },
          "minOrder": {
            "type": [
              "number",
              "null"
            ]
          },
          "maxOrder": {
            "type": [
              "number",
              "null"
            ]
          },
          "quality": {
            "type": [
              "string",
              "null"
            ]
          },
          "refillDays": {
            "type": [
              "number",
              "null"
            ]
          },
          "dripFeed": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "cancellable": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "startTimeMinutes": {
            "type": [
              "number",
              "null"
            ]
          },
          "speedPerDay": {
            "type": [
              "number",
              "null"
            ]
          },
          "source": {
            "type": [
              "string",
              "null"
            ]
          },
          "lastSeenAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "PriceIndexRow": {
        "type": "object",
        "properties": {
          "platform_slug": {
            "type": "string"
          },
          "platform": {
            "type": "string"
          },
          "service_slug": {
            "type": "string"
          },
          "service": {
            "type": "string"
          },
          "unit": {
            "type": "string"
          },
          "day": {
            "type": "string",
            "format": "date"
          },
          "currency": {
            "type": "string"
          },
          "min_price_per_1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "p25_price_per_1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "median_price_per_1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "p75_price_per_1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "max_price_per_1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "panels_sampled": {
            "type": "integer"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "quotable_min_price_per_1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "quotable_max_price_per_1000": {
            "type": [
              "number",
              "null"
            ]
          },
          "comparable": {
            "type": "boolean"
          },
          "computed_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      }
    }
  }
}