{
  "openapi": "3.1.0",
  "info": {
    "title": "LaunchSpy API",
    "version": "1.1.0",
    "summary": "Coaches and course creators, their Meta ads and their funnels.",
    "description": "Read-only API over the LaunchSpy database of coaches, course creators and infopreneurs: who sells in a niche, the Meta ads they run, how long each ad has been running, the funnels behind the ads, and the builders, pixels, payment tools and prices on those funnels. The same data is served to AI agents by the MCP server at https://launchspy.io/api/mcp. Built for scripts and automation tools (n8n, Make, Zapier) as well as agents: every route is a GET request with one header. Included in the Pro and Business plans; one call uses one credit. Any other account, including a free one, gets 50 trial credits, once; they do not renew and EU reach is not included.",
    "termsOfService": "https://launchspy.io/terms",
    "contact": {
      "name": "LaunchSpy",
      "url": "https://launchspy.io/contact"
    }
  },
  "externalDocs": {
    "description": "Documentation",
    "url": "https://launchspy.io/docs"
  },
  "servers": [
    {
      "url": "https://launchspy.io/api/v1"
    }
  ],
  "security": [
    {
      "bearerKey": []
    },
    {
      "headerKey": []
    }
  ],
  "tags": [
    {
      "name": "Creators",
      "description": "Coaches, course creators and infopreneurs."
    },
    {
      "name": "Ads",
      "description": "Meta ad creative, run dates and EU reach."
    },
    {
      "name": "Funnels",
      "description": "Funnels behind the ads, with the X-Ray teardown."
    },
    {
      "name": "Analysis",
      "description": "What is known about a URL or a domain."
    },
    {
      "name": "Markets",
      "description": "Market size by niche and country."
    }
  ],
  "paths": {
    "/creators": {
      "get": {
        "tags": [
          "Creators"
        ],
        "operationId": "searchCreators",
        "summary": "Search coaches and course creators",
        "description": "Find who sells in a niche, a market or on a platform, ranked by advertising volume. Same data as the MCP tool search_creators.",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Text matched against the creator name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Market, ISO 2-letter code, for example US, FR, BR.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "required": false,
            "description": "ISO language code, for example en, fr, pt.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "niche",
            "in": "query",
            "required": false,
            "description": "A niche domain (for example Coaching, Trading & Finance, Health & Fitness) or one exact sub-niche (Life Coaching, Crypto Trading). An unknown value returns the full list in the error message.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "platform",
            "in": "query",
            "required": false,
            "description": "Hosting platform the creator is present on, for example Skool, Hotmart, Kajabi.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "min_ads",
            "in": "query",
            "required": false,
            "description": "Only creators with at least this many ads.",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordering. Default: ads.",
            "schema": {
              "type": "string",
              "enum": [
                "ads",
                "active_ads",
                "followers",
                "recent"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Rows to return, 1 to 100. Default 25.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Rows to skip. Capped at 2000: filter instead of paging deep.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of creators.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Credits of the billing period.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Credits left.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "object": {
                      "const": "list"
                    },
                    "resource": {
                      "type": "string"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "offset": {
                      "type": "integer"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Creator"
                      }
                    },
                    "note": {
                      "type": "string",
                      "description": "Present when the pagination depth cap was reached."
                    }
                  },
                  "required": [
                    "object",
                    "resource",
                    "limit",
                    "offset",
                    "data"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "403": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/creators/{slug}": {
      "get": {
        "tags": [
          "Creators"
        ],
        "operationId": "getCreator",
        "summary": "One creator profile",
        "description": "Full profile with total and active ads and the 30-day launch cadence. Same data as the MCP tool get_creator.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Creator slug, as returned by /creators.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The creator.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "object": {
                      "const": "creator"
                    },
                    "data": {
                      "$ref": "#/components/schemas/Creator"
                    }
                  },
                  "required": [
                    "object",
                    "data"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "403": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/ads": {
      "get": {
        "tags": [
          "Ads"
        ],
        "operationId": "searchAds",
        "summary": "Search ad creative",
        "description": "One of creator or query is required. Same data as the MCP tool search_ads.",
        "parameters": [
          {
            "name": "creator",
            "in": "query",
            "required": false,
            "description": "Creator slug. Returns that creator's ads.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Text matched against the headline, the body copy, the spoken script and the advertiser name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Market, ISO 2-letter code. Matched through the language of the ad copy.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "required": false,
            "description": "Ad copy language, ISO code.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "active",
            "in": "query",
            "required": false,
            "description": "Only ads currently running.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Rows to return, 1 to 100. Default 25.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Rows to skip. Capped at 2000: filter instead of paging deep.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of ads.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Credits of the billing period.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Credits left.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "object": {
                      "const": "list"
                    },
                    "resource": {
                      "type": "string"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "offset": {
                      "type": "integer"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Ad"
                      }
                    },
                    "note": {
                      "type": "string",
                      "description": "Present when the pagination depth cap was reached."
                    }
                  },
                  "required": [
                    "object",
                    "resource",
                    "limit",
                    "offset",
                    "data"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "403": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/funnels": {
      "get": {
        "tags": [
          "Funnels"
        ],
        "operationId": "searchFunnels",
        "summary": "Search tracked funnels",
        "description": "A funnel groups every page of one creator on one domain. Same data as the MCP tool search_funnels.",
        "parameters": [
          {
            "name": "creator",
            "in": "query",
            "required": false,
            "description": "Creator slug.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "domain",
            "in": "query",
            "required": false,
            "description": "Domain or fragment of one.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "builder",
            "in": "query",
            "required": false,
            "description": "Builder slug, for example clickfunnels, systeme, gohighlevel, kajabi, wordpress.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Funnel type, for example landing, store, booking, lead_form, quiz, messaging.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Creator market, ISO 2-letter code.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "niche",
            "in": "query",
            "required": false,
            "description": "A niche domain (for example Coaching, Trading & Finance, Health & Fitness) or one exact sub-niche (Life Coaching, Crypto Trading). An unknown value returns the full list in the error message.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "required": false,
            "description": "Funnel language, ISO code.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "active",
            "in": "query",
            "required": false,
            "description": "Only funnels with ads currently running.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordering. Default: ads.",
            "schema": {
              "type": "string",
              "enum": [
                "ads",
                "active_ads",
                "reach",
                "recent"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Rows to return, 1 to 100. Default 25.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Rows to skip. Capped at 2000: filter instead of paging deep.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of funnels.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Credits of the billing period.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Credits left.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "object": {
                      "const": "list"
                    },
                    "resource": {
                      "type": "string"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "offset": {
                      "type": "integer"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Funnel"
                      }
                    },
                    "note": {
                      "type": "string",
                      "description": "Present when the pagination depth cap was reached."
                    }
                  },
                  "required": [
                    "object",
                    "resource",
                    "limit",
                    "offset",
                    "data"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "403": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/funnels/{funnel_id}": {
      "get": {
        "tags": [
          "Funnels"
        ],
        "operationId": "getFunnel",
        "summary": "One funnel with its X-Ray teardown",
        "description": "Steps, pixels, payment stack, extracted pricing and scarcity signals when the page has been analysed. Same data as the MCP tool get_funnel.",
        "parameters": [
          {
            "name": "funnel_id",
            "in": "path",
            "required": true,
            "description": "funnel_id returned by /funnels.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The funnel.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "object": {
                      "const": "funnel"
                    },
                    "data": {
                      "$ref": "#/components/schemas/FunnelDetail"
                    }
                  },
                  "required": [
                    "object",
                    "data"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "403": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/creators/{slug}/strategy": {
      "get": {
        "tags": [
          "Creators"
        ],
        "operationId": "getCreatorStrategy",
        "summary": "Creative strategy of one creator",
        "description": "Format mix, ad survival, launches per month, calls to action, placements and recurring hooks, computed over all the ads of the creator. Read from a cache: analysed is false when it is not computed yet. Same data as the MCP tool get_creator_strategy.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Creator slug.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The strategy.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "object": {
                      "const": "creator_strategy"
                    },
                    "data": {
                      "$ref": "#/components/schemas/CreatorStrategy"
                    }
                  },
                  "required": [
                    "object",
                    "data"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "403": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/rising-creators": {
      "get": {
        "tags": [
          "Creators"
        ],
        "operationId": "listRisingCreators",
        "summary": "Creators scaling their ads now",
        "description": "Creators who launched more ads than they stopped over the last 30 days, with at least one ad active; very large advertisers are left out. scope says what the list covers: it widens from niche and country to country, niche, then worldwide when the pair has too few names. Same data as the MCP tool get_rising_creators.",
        "parameters": [
          {
            "name": "niche",
            "in": "query",
            "required": false,
            "description": "A niche domain (for example Coaching, Trading & Finance, Health & Fitness) or one exact sub-niche (Life Coaching, Crypto Trading). An unknown value returns the full list in the error message.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "ISO 2-letter code of the market, for example US, FR, BR.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Rows to return, 1 to 100. Default 25.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Rising creators.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Credits of the billing period.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Credits left.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "object": {
                      "const": "list"
                    },
                    "resource": {
                      "type": "string"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "offset": {
                      "type": "integer"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RisingCreator"
                      }
                    },
                    "note": {
                      "type": "string",
                      "description": "Present when the pagination depth cap was reached."
                    },
                    "scope": {
                      "enum": [
                        "niche_and_country",
                        "country",
                        "niche",
                        "worldwide"
                      ]
                    }
                  },
                  "required": [
                    "object",
                    "resource",
                    "limit",
                    "offset",
                    "data"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "403": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/markets": {
      "get": {
        "tags": [
          "Markets"
        ],
        "operationId": "listMarkets",
        "summary": "Market size by niche and country",
        "description": "One row per niche and country: creators, total ads, active ads, median offer price. Pass niche, country, or both. When the pair is too small to be counted on its own, data is empty and nearby lists the closest markets. Same data as the MCP tool get_market.",
        "parameters": [
          {
            "name": "niche",
            "in": "query",
            "required": false,
            "description": "A niche domain (for example Coaching, Trading & Finance, Health & Fitness) or one exact sub-niche (Life Coaching, Crypto Trading). An unknown value returns the full list in the error message.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "ISO 2-letter code, for example US, FR, BR.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Rows to return, 1 to 100. Default 25.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Markets.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Credits of the billing period.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Credits left.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "object": {
                      "const": "list"
                    },
                    "resource": {
                      "type": "string"
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "offset": {
                      "type": "integer"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Market"
                      }
                    },
                    "note": {
                      "type": "string",
                      "description": "Present when the pagination depth cap was reached."
                    },
                    "nearby": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Market"
                      }
                    },
                    "data_as_of": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "When the market view was last refreshed."
                    }
                  },
                  "required": [
                    "object",
                    "resource",
                    "limit",
                    "offset",
                    "data"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "403": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/analyze": {
      "get": {
        "tags": [
          "Analysis"
        ],
        "operationId": "analyzeUrl",
        "summary": "What is known about a URL or a domain",
        "description": "Reads the database; does not visit the page. Same data as the MCP tool analyze_url.",
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Full URL or bare domain.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The analysis.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "object": {
                      "const": "analysis"
                    },
                    "data": {
                      "$ref": "#/components/schemas/Analysis"
                    }
                  },
                  "required": [
                    "object",
                    "data"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "403": {
            "$ref": "#/components/responses/Error"
          },
          "429": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "API key created in Settings, API. Starts with lsk_."
      },
      "headerKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key"
      }
    },
    "responses": {
      "Error": {
        "description": "Error. The message says how to fix the request.",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "error": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "code",
                    "message"
                  ]
                }
              },
              "required": [
                "error"
              ]
            }
          }
        }
      }
    },
    "schemas": {
      "Creator": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "avatar_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "bio": {
            "type": [
              "string",
              "null"
            ]
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "description": "The market the creator sells to."
          },
          "language": {
            "type": [
              "string",
              "null"
            ]
          },
          "niche": {
            "type": [
              "string",
              "null"
            ]
          },
          "website": {
            "type": [
              "string",
              "null"
            ]
          },
          "platforms": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Hosting platforms, by name."
          },
          "backend_platform": {
            "type": [
              "string",
              "null"
            ]
          },
          "followers": {
            "type": "number"
          },
          "ads": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer"
              },
              "active": {
                "type": "integer"
              },
              "started_last_30d": {
                "type": "integer"
              },
              "started_previous_30d": {
                "type": "integer"
              },
              "net_new_30d": {
                "type": "integer",
                "description": "started_last_30d minus started_previous_30d."
              }
            }
          },
          "socials": {
            "type": "object",
            "properties": {
              "twitter": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "linkedin": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "youtube": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "instagram": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "tiktok": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "badges": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "verified": {
            "type": "boolean"
          },
          "last_activity_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "tracked_since": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "Ad": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "ad_library_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "advertiser": {
            "type": "object",
            "properties": {
              "name": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "page_id": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "copy": {
            "type": "object",
            "properties": {
              "headline": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "body": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "spoken_hook": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "What is said in the first seconds of the video. Null until transcribed."
              },
              "cta": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "cta_type": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "landing_page_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "media": {
            "type": "object",
            "properties": {
              "type": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "image_url": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "thumbnail_url": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "video_url": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "placement": {
            "type": "object",
            "properties": {
              "platform": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "publisher_platforms": {},
              "page_category": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "market": {
            "type": "object",
            "properties": {
              "collected_in_country": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Ad Library region the ad was collected in. Not the advertiser country."
              },
              "language": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "targeted_or_reached_countries": {}
            }
          },
          "eu_total_reach": {
            "type": [
              "number",
              "null"
            ],
            "description": "Unique EU reach published by Meta. Null outside the EU."
          },
          "dsa_categories": {},
          "is_active": {
            "type": "boolean"
          },
          "start_date": {
            "type": [
              "string",
              "null"
            ]
          },
          "end_date": {
            "type": [
              "string",
              "null"
            ]
          },
          "first_seen_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "last_seen_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "days_running": {
            "type": [
              "number",
              "null"
            ]
          },
          "ad_library_url": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "Funnel": {
        "type": "object",
        "properties": {
          "funnel_id": {
            "type": "string"
          },
          "creator": {
            "type": "object",
            "properties": {
              "slug": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "name": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "country": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "niche": {
            "type": [
              "string",
              "null"
            ]
          },
          "domain": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "description": "The page with the most active ads."
          },
          "funnel_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "builder": {
            "type": [
              "string",
              "null"
            ]
          },
          "ads": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer"
              },
              "active": {
                "type": "integer"
              }
            }
          },
          "eu_total_reach": {
            "type": [
              "number",
              "null"
            ]
          },
          "estimated_monthly_visits": {
            "type": [
              "number",
              "null"
            ],
            "description": "An estimate."
          },
          "language": {
            "type": [
              "string",
              "null"
            ]
          },
          "multilingual": {
            "type": "boolean"
          },
          "is_active": {
            "type": "boolean"
          },
          "first_detected_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "pages": {
            "type": "object",
            "properties": {
              "count": {
                "type": "integer"
              },
              "with_active_ads": {
                "type": "integer"
              }
            }
          }
        }
      },
      "Xray": {
        "type": [
          "object",
          "null"
        ],
        "description": "Teardown of the page that receives the ads. Null when the page has not been analysed.",
        "properties": {
          "id": {
            "type": "string"
          },
          "funnel_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "confidence": {},
          "landing": {
            "type": "object",
            "properties": {
              "stack": {},
              "title": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "description": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "headline": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "subheadline": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "steps": {},
          "payment_stack": {},
          "pixels": {},
          "ctas": {},
          "pricing": {},
          "scarcity_signals": {},
          "analyzed_at": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "FunnelDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Funnel"
          },
          {
            "type": "object",
            "properties": {
              "pages_list": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "description": "Pages of the domain, each with its own ads. Present when the funnel spans several pages."
              },
              "xray": {
                "$ref": "#/components/schemas/Xray"
              }
            }
          }
        ]
      },
      "Market": {
        "type": "object",
        "properties": {
          "niche": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "creators": {
            "type": "integer"
          },
          "ads_total": {
            "type": "integer"
          },
          "ads_active": {
            "type": "integer"
          },
          "median_price_usd": {
            "type": [
              "number",
              "null"
            ],
            "description": "Median offer price in USD. Null when fewer than 30 prices were read."
          },
          "priced_offers": {
            "type": "integer"
          },
          "top_language": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "RisingCreator": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "description": "The market the creator sells to."
          },
          "language": {
            "type": [
              "string",
              "null"
            ]
          },
          "niche": {
            "type": [
              "string",
              "null"
            ]
          },
          "website_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "ads_total": {
            "type": "integer"
          },
          "ads_active": {
            "type": "integer"
          },
          "ads_started_30d": {
            "type": "integer"
          },
          "ads_stopped_30d": {
            "type": "integer"
          },
          "ads_started_prev_30d": {
            "type": "integer"
          }
        }
      },
      "CreatorStrategy": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "analysed": {
            "type": "boolean",
            "description": "False when the strategy is not computed yet; the fields below are then absent."
          },
          "note": {
            "type": "string"
          },
          "ads_total": {
            "type": "integer"
          },
          "ads_active": {
            "type": "integer"
          },
          "formats": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "image": {
                "type": "integer"
              },
              "video": {
                "type": "integer"
              },
              "carousel": {
                "type": "integer"
              },
              "dynamic": {
                "type": "integer"
              },
              "catalog": {
                "type": "integer"
              }
            }
          },
          "survival": {
            "type": [
              "object",
              "null"
            ],
            "description": "Among ads launched 90 days ago or more: how many ran at least 7, 30 and 90 days.",
            "properties": {
              "ads_launched_90_days_ago_or_more": {
                "type": "integer"
              },
              "ran_7_days_or_more": {
                "type": "integer"
              },
              "ran_30_days_or_more": {
                "type": "integer"
              },
              "ran_90_days_or_more": {
                "type": "integer"
              }
            }
          },
          "days_running": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "average": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "longest": {
                "type": [
                  "number",
                  "null"
                ]
              }
            }
          },
          "launches_by_month": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "month": {
                  "type": "string"
                },
                "ads": {
                  "type": "integer"
                }
              }
            }
          },
          "top_cta": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "cta": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "ads": {
                  "type": "integer"
                }
              }
            }
          },
          "placements": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "platform": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "ads": {
                  "type": "integer"
                }
              }
            }
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "language": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "ads": {
                  "type": "integer"
                }
              }
            }
          },
          "recurring_hooks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "text": {
                  "type": "string"
                },
                "ads": {
                  "type": "integer"
                }
              }
            }
          },
          "data_as_of": {
            "type": [
              "string",
              "null"
            ],
            "description": "When the strategy was computed."
          }
        }
      },
      "Analysis": {
        "type": "object",
        "properties": {
          "input_url": {
            "type": "string"
          },
          "domain": {
            "type": "string"
          },
          "known": {
            "type": "boolean",
            "description": "False when nothing is tracked on this domain."
          },
          "summary": {
            "type": "object",
            "properties": {
              "funnels_tracked": {
                "type": "integer"
              },
              "ads_tracked": {
                "type": "integer"
              },
              "ads_active": {
                "type": "integer"
              },
              "builders": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "creators": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "creators": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Creator"
            }
          },
          "funnels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Funnel"
            }
          },
          "xray": {
            "$ref": "#/components/schemas/Xray"
          }
        }
      }
    }
  }
}