{
  "openapi": "3.1.0",
  "info": {
    "title": "CULT+MATH paid runs",
    "version": "1.0.0",
    "description": "Fresh, citable measurements an agent pays for per run over the Machine Payments Protocol (HTTP 402, Stripe shared payment tokens). The free research, the Decision Briefs and the MCP server are described at https://cultmath.com/llms.txt.",
    "contact": {
      "name": "CULT+MATH",
      "url": "https://cultmath.com",
      "email": "ipalibo@cultmath.com"
    }
  },
  "servers": [
    {
      "url": "https://cultmath.com"
    }
  ],
  "x-service-info": {
    "categories": [
      "research",
      "data"
    ],
    "docs": {
      "homepage": "https://cultmath.com",
      "llms": "https://cultmath.com/llms.txt",
      "apiReference": "https://cultmath.com/openapi.json"
    }
  },
  "paths": {
    "/run/filing-trend": {
      "post": {
        "operationId": "runFilingTrend",
        "summary": "Share of U.S. 10-K filers that mention a phrase, by year, from SEC EDGAR full-text search, with controls",
        "description": "Counts 10-K filings mentioning the phrase each year and reports each count as a share of filers, using \"competition\" as the denominator. A null control (\"shrinkflation\") must return 0. The run executes before the charge: if a control fails, the answer is 422 and nothing is charged. Limits, stated on every result: it counts filings, not companies; a mention is not a meaning; the current year is incomplete; counts over 10,000 are floors. Parameters may also be sent as query parameters (the payment URL from the MCP tool run_filing_trend carries them).",
        "x-payment-info": {
          "amount": "200",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH filing-trend run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "phrase"
                ],
                "properties": {
                  "phrase": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 80,
                    "description": "The phrase to count, without quote marks."
                  },
                  "start": {
                    "type": "integer",
                    "minimum": 2001,
                    "description": "First year. Default: four years ago."
                  },
                  "end": {
                    "type": "integer",
                    "description": "Last year, not in the future. Default: this year. At most 10 years per run."
                  }
                },
                "additionalProperties": false
              },
              "example": {
                "phrase": "tariff",
                "start": 2021,
                "end": 2025
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: by-year counts, denominator and share; both controls; limits; run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run (phrase or years)."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "SEC EDGAR could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/regulatory-trend": {
      "post": {
        "operationId": "runRegulatoryTrend",
        "summary": "Share of U.S. federal final and proposed rules that mention a phrase, by year, from the Federal Register, with controls",
        "description": "Counts final and proposed rules mentioning the phrase each year (optionally for one agency) and reports each count as a share of all final and proposed rules that year. A null control (a string no document contains) must return 0 across the window. The run executes before the charge: if a control fails, the answer is 422 and nothing is charged. Limits, stated on every result: it counts documents, not rulemakings; a mention is not applicability; notices are excluded; wording matters; the current year is incomplete; counts of 10,000 or more are floors. Parameters may also be sent as query parameters (the payment URL from the MCP tool run_regulatory_trend carries them). Switched on separately from the filing-trend run: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "200",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH regulatory-trend run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "phrase"
                ],
                "properties": {
                  "phrase": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 80,
                    "description": "The phrase to count, without quote marks."
                  },
                  "start": {
                    "type": "integer",
                    "minimum": 1994,
                    "description": "First year. Default: four years ago."
                  },
                  "end": {
                    "type": "integer",
                    "description": "Last year, not in the future. Default: this year. At most 10 years per run."
                  },
                  "agency": {
                    "type": "string",
                    "enum": [
                      "fda",
                      "usda",
                      "ftc",
                      "epa",
                      "cpsc",
                      "fcc",
                      "sec",
                      "dol",
                      "treasury"
                    ],
                    "description": "Optional: one agency's rules only."
                  }
                },
                "additionalProperties": false
              },
              "example": {
                "phrase": "front-of-package",
                "start": 2021,
                "end": 2025,
                "agency": "fda"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: by-year counts, denominator and share; the null control; limits; run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run (phrase or years)."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "The Federal Register API could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/spend-trend": {
      "post": {
        "operationId": "runSpendTrend",
        "summary": "Share of U.S. federal prime contract obligations matching a keyword, by federal fiscal year, from USAspending, with controls",
        "description": "Contract obligations matching the keyword each fiscal year as a share of all prime contract obligations. A null control (a string no award contains) must match $0. The run executes before the charge; a failed control is a 422 and nothing is charged. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "200",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH spend-trend run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "phrase"
                ],
                "properties": {
                  "phrase": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 80,
                    "description": "The phrase to measure, without quote marks."
                  },
                  "start": {
                    "type": "integer",
                    "minimum": 2008
                  },
                  "end": {
                    "type": "integer"
                  }
                },
                "additionalProperties": false
              },
              "example": {
                "phrase": "cybersecurity",
                "start": 2021,
                "end": 2025
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: by-year counts, denominator and share; both controls; limits; run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run (phrase or years)."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "USAspending could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/triangulation": {
      "post": {
        "operationId": "runTriangulation",
        "summary": "One phrase in 10-K filings, federal rules and federal contract spending at once, with every source’s controls",
        "description": "Runs the filing-trend, regulatory-trend and spend-trend measurements on the same phrase and years (at most 5), side by side, with the direction of each line and whether they agree. If any source fails its controls the run is unsound: 422, nothing charged. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "500",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH triangulation run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "phrase"
                ],
                "properties": {
                  "phrase": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 80,
                    "description": "The phrase to measure, without quote marks."
                  },
                  "start": {
                    "type": "integer",
                    "minimum": 2008
                  },
                  "end": {
                    "type": "integer"
                  }
                },
                "additionalProperties": false
              },
              "example": {
                "phrase": "PFAS",
                "start": 2021,
                "end": 2025
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: by-year counts, denominator and share; both controls; limits; run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run (phrase or years)."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "A source could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/peer-benchmark": {
      "post": {
        "operationId": "runPeerBenchmark",
        "summary": "One company’s filed metric against 2-6 peers, latest fiscal year, from SEC EDGAR XBRL, with controls",
        "description": "Revenue growth, gross margin, or R&D or sales-and-marketing as a share of revenue, for a company and its peers from a verified list. Identity, freshness, fiscal-year alignment and plausibility controls; exclusions are named. Unsound runs (no value for the company, or fewer than 2 peers left) are a 422 and nothing is charged. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "300",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH peer-benchmark run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "ticker",
                  "peers",
                  "metric"
                ],
                "properties": {
                  "ticker": {
                    "type": "string"
                  },
                  "peers": {
                    "type": "string",
                    "description": "2-6 tickers, comma-separated"
                  },
                  "metric": {
                    "type": "string",
                    "enum": [
                      "revenue_growth",
                      "gross_margin",
                      "rd_intensity",
                      "sm_intensity"
                    ]
                  }
                },
                "additionalProperties": false
              },
              "example": {
                "ticker": "GIS",
                "peers": "CAG,CPB,KHC",
                "metric": "gross_margin"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: by-year counts, denominator and share; both controls; limits; run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run (phrase or years)."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "SEC EDGAR could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/ai-visibility": {
      "post": {
        "operationId": "runAiVisibility",
        "summary": "Is a domain cited when four AI platforms answer a buyer’s question, and does it hold? A derived measurement, not the answers",
        "description": "Asks ChatGPT, Claude, Gemini and Perplexity the question live with web search on: three times each on the everyday model and once on the flagship model, 16 answers. Returns per platform in how many askings the domain was cited and at what positions, whether that held every time, and whether the flagship model agrees; how many platforms cite it; and the other domains cited most, as counts of answers. The answers, URLs and titles are not returned. A platform is measured when at least 2 of its 3 everyday askings answered with sources; fewer than 3 platforms measured is unsound: 422, nothing charged. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "500",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH AI-visibility run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "question",
                  "domain"
                ],
                "properties": {
                  "question": {
                    "type": "string",
                    "minLength": 10,
                    "maxLength": 100
                  },
                  "domain": {
                    "type": "string"
                  }
                },
                "additionalProperties": false
              },
              "example": {
                "question": "What is the best project management software for small agencies?",
                "domain": "example.com"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: per platform, the everyday askings (cited in, positions, verdict) and the flagship asking (cited, agrees); citation rate; stability; model tier; most cited other domains; the controls; limits; run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run (phrase or years)."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "The AI answer API could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/disclosure-check": {
      "post": {
        "operationId": "runDisclosureCheck",
        "summary": "Has anyone started reporting this number? Which filers use a phrase in their SEC filings, with the filings linked",
        "description": "Searches SEC EDGAR full text for the phrase in 10-K, 10-Q or 8-K filings over the years given, across all filers or 2-10 named peers. For peers: who uses it, who does not, and who could not be measured because they filed nothing (positive control). A null phrase must return 0. Using a phrase is not the same as disclosing the figure: the filings are linked to read. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "200",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH disclosure-check run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "phrase"
                ],
                "properties": {
                  "phrase": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 80,
                    "description": "The phrase to search for, without quote marks."
                  },
                  "peers": {
                    "type": "string",
                    "description": "Optional: 2-10 tickers, comma-separated"
                  },
                  "form": {
                    "type": "string",
                    "enum": [
                      "10-K",
                      "10-Q",
                      "8-K"
                    ]
                  },
                  "start": {
                    "type": "integer",
                    "minimum": 2001
                  },
                  "end": {
                    "type": "integer"
                  }
                },
                "additionalProperties": false
              },
              "example": {
                "phrase": "vitality index",
                "peers": "GIS,CAG,CPB,KHC",
                "start": 2024,
                "end": 2026
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: by-year counts, denominator and share; both controls; limits; run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run (phrase or years)."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "SEC EDGAR could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/regulatory-clock": {
      "post": {
        "operationId": "runRegulatoryClock",
        "summary": "Is there still time to respond? U.S. federal documents on a topic open for comment, and final rules waiting to take effect",
        "description": "As of today, Federal Register documents mentioning the phrase whose comment period is still open (with days left), and final rules whose effective date is still ahead, optionally for one agency. A null phrase must return 0, and every returned date must fall on or after today, or the run refuses. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "200",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH regulatory-clock run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "phrase"
                ],
                "properties": {
                  "phrase": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 80,
                    "description": "The phrase to search for, without quote marks."
                  },
                  "agency": {
                    "type": "string",
                    "enum": [
                      "fda",
                      "usda",
                      "ftc",
                      "epa",
                      "cpsc",
                      "fcc",
                      "sec",
                      "dol",
                      "treasury"
                    ]
                  }
                },
                "additionalProperties": false
              },
              "example": {
                "phrase": "front-of-package",
                "agency": "fda"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: by-year counts, denominator and share; both controls; limits; run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run (phrase or years)."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "The Federal Register API could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/deal-activity": {
      "post": {
        "operationId": "runDealActivity",
        "summary": "Is M&A in this sector rising or falling, and who is doing it? 8-K merger agreements mentioning a sector, as a share of all of them, by quarter",
        "description": "For the last 4-12 complete quarters, SEC EDGAR full-text search counts of 8-K documents containing \"agreement and plan of merger\" and the sector phrase, against all 8-K merger-agreement documents; the direction of the share; an industry-code (SIC) cross-check; and the most active filers, linked. A null phrase must return 0 (which also proves both phrases are required), every quarter's denominator must be above 0 and below 10,000, and no sector count may exceed it, or the run refuses. It counts documents, not deals. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "200",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH deal-activity run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "sector": {
                    "type": "string",
                    "enum": [
                      "cybersecurity",
                      "games",
                      "streaming",
                      "film-studios",
                      "cpg",
                      "erp",
                      "saas"
                    ]
                  },
                  "phrase": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 80,
                    "description": "Your own sector phrase, without quote marks. Not with sector."
                  },
                  "sic": {
                    "type": "string",
                    "description": "Optional, with phrase: four-digit SIC codes, comma-separated."
                  },
                  "quarters": {
                    "type": "integer",
                    "minimum": 4,
                    "maximum": 12
                  }
                }
              },
              "example": {
                "sector": "cybersecurity",
                "quarters": 8
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: by-quarter counts, denominator and share; direction by phrase and by industry code; most active filers; the controls; limits; run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run (sector, phrase, sic or quarters)."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "SEC EDGAR full-text search could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/demand-check": {
      "post": {
        "operationId": "runDemandCheck",
        "summary": "Is demand for this real, or is search moving for everyone? Search demand against an everyday control basket, confirmed against SEC filings",
        "description": "Year-on-year Google search change for a category (DataForSEO Labs) against a fixed basket of ten everyday searches, the excess beyond the market, a volume band, and a cross-check against the share of 10-K filers mentioning the phrase (SEC EDGAR). The basket must itself move less than 20% or the run refuses. Changes and bands only, never monthly volumes. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "300",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH demand-check run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "phrase"
                ],
                "properties": {
                  "phrase": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 60
                  },
                  "also": {
                    "type": "string",
                    "description": "Up to 4 more keywords, comma-separated."
                  }
                }
              },
              "example": {
                "phrase": "protein snacks",
                "also": "high protein snacks,protein bars"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: category, market and excess change, direction, volume bands, the filings cross-check and its confirmation, the controls, limits, run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "A source could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/answer-share": {
      "post": {
        "operationId": "runAnswerShare",
        "summary": "Who owns the answer in my category? Domains cited across AI answers to 2-3 buyer questions, each asked twice",
        "description": "Asks ChatGPT, Claude, Gemini and Perplexity 2-3 buyer questions live with web search on, each twice, and returns the ten most-cited domains as counts of answers, the category shape (owned, led, contested, fragmented), stability between askings, and optionally where your domain stands. Domain-level counts only, never the answers. Fewer than half the answers, or under 3 platforms, citing sources: 422, nothing charged. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "800",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH answer-share run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "q1",
                  "q2"
                ],
                "properties": {
                  "q1": {
                    "type": "string",
                    "minLength": 10,
                    "maxLength": 100
                  },
                  "q2": {
                    "type": "string",
                    "minLength": 10,
                    "maxLength": 100
                  },
                  "q3": {
                    "type": "string",
                    "minLength": 10,
                    "maxLength": 100
                  },
                  "domain": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "q1": "What is the best CRM for a small agency?",
                "q2": "Which CRM do marketing agencies use?",
                "domain": "example.com"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: most-cited domains with counts, category shape, stability, by-question leaders, your domain if given, the controls, limits, run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "A source could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/share-of-search": {
      "post": {
        "operationId": "runShareOfSearch",
        "summary": "Who is gaining share of search in this category? Brand share of US Google searches among named rivals",
        "description": "Each brand's share of US Google searches among the brands named (DataForSEO Labs), latest 12 months against the 12 before, the change in points, search growth and a volume band. The brand and at least 2 rivals need 24 clean months or the run refuses. Shares and bands only. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "300",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH share-of-search run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "brand",
                  "rivals"
                ],
                "properties": {
                  "brand": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 40
                  },
                  "rivals": {
                    "type": "string",
                    "description": "2-6 brands, comma-separated."
                  }
                }
              },
              "example": {
                "brand": "Quest Nutrition",
                "rivals": "RXBAR,Clif Bar,KIND Snacks"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: the figures, the controls, limits, run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "A source could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/premium-check": {
      "post": {
        "operationId": "runPremiumCheck",
        "summary": "Is our premium holding? Price-seeking searches as a share of brand searches",
        "description": "Searches for the brand with price, cheap, discount, coupon, dupe, alternative or sale, as a share of searches for the brand alone (DataForSEO Labs), latest 12 months against the 12 before, with a verdict. A null modifier must read zero and the brand must average 1,000 searches a month, or the run refuses. Shares and bands only. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "300",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH premium-check run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "brand"
                ],
                "properties": {
                  "brand": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 40
                  }
                }
              },
              "example": {
                "brand": "Yeti"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: the figures, the controls, limits, run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "A source could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/angle-demand": {
      "post": {
        "operationId": "runAngleDemand",
        "summary": "Which reason to buy do people search for, and which is growing? Buying angles in a category against an everyday control basket",
        "description": "US Google searches for each angle with the category (\"healthy protein snacks\"), share among the angles named, year-on-year change and growth beyond an everyday basket of ten searches (DataForSEO Labs). The basket must move less than 20% and at least 2 angles need 24 clean months, or the run refuses. Shares and bands only. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "300",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH angle-demand run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "category",
                  "angles"
                ],
                "properties": {
                  "category": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 40
                  },
                  "angles": {
                    "type": "string",
                    "description": "2-6 reasons to buy, comma-separated."
                  }
                }
              },
              "example": {
                "category": "protein snacks",
                "angles": "healthy,vegan,keto,cheap"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: the figures, the controls, limits, run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "A source could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/channel-mix": {
      "post": {
        "operationId": "runChannelMix",
        "summary": "Where do buyers find options when they search? The US Google top 10 classed by channel",
        "description": "The organic Google top 10 for 1-3 buyer searches (DataForSEO SERP), United States, each result classed by domain: retailers and marketplaces, reviews and media, brand sites, forums and social, reference, independent and specialist sites. A control search with a known answer must come back retailer-led, or the run refuses. Domains, ranks and counts only. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "300",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH channel-mix run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "q1"
                ],
                "properties": {
                  "q1": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 80
                  },
                  "q2": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 80
                  },
                  "q3": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 80
                  },
                  "brand_domains": {
                    "type": "string",
                    "description": "Up to 10 domains, comma-separated."
                  },
                  "retailer_domains": {
                    "type": "string",
                    "description": "Up to 10 domains, comma-separated."
                  },
                  "media_domains": {
                    "type": "string",
                    "description": "Up to 10 domains, comma-separated."
                  }
                }
              },
              "example": {
                "q1": "best protein bars",
                "q2": "healthy protein snacks",
                "brand_domains": "rxbar.com,questnutrition.com,clifbar.com"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: the figures, the controls, limits, run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "A source could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/claim-check": {
      "post": {
        "operationId": "runClaimCheck",
        "summary": "Is this claim already taken by a competitor? Home pages now against a year ago",
        "description": "Whether 3-5 competitors' home pages lead with a claim, mention it or not, read live (robots.txt obeyed) and from the Internet Archive copy nearest a year earlier. A null claim must match no site and at least 3 pages must be readable, or the run refuses. No page text is returned. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "300",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH claim-check run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "claim",
                  "sites"
                ],
                "properties": {
                  "claim": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 60
                  },
                  "variants": {
                    "type": "string",
                    "description": "Up to 3 other wordings, comma-separated."
                  },
                  "sites": {
                    "type": "string",
                    "description": "3-5 competitor domains, comma-separated."
                  }
                }
              },
              "example": {
                "claim": "plant-based protein",
                "variants": "plant protein",
                "sites": "rxbar.com,questnutrition.com,clifbar.com,kindsnacks.com"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: the figures, the controls, limits, run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "A source could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    },
    "/run/fad-check": {
      "post": {
        "operationId": "runFadCheck",
        "summary": "Is this moment lasting, or past its peak? Search and Wikipedia retention against controls",
        "description": "How much of its best 12 months a subject keeps on US Google Trends (DataForSEO) and English Wikipedia (Wikimedia, against four fixed articles), since January 2016. A control term must hold steady, both signals must be measurable, and not both still at their peak, or the run refuses. Ratios and dates only. Switched on separately: until it is, the endpoint answers 503 and charges nothing.",
        "x-payment-info": {
          "amount": "300",
          "currency": "usd",
          "intent": "charge",
          "method": "stripe",
          "description": "CULT+MATH fad-check run"
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "term",
                  "article"
                ],
                "properties": {
                  "term": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 60
                  },
                  "article": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 100
                  }
                }
              },
              "example": {
                "term": "cottage cheese",
                "article": "Cottage cheese"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The run: the figures, the controls, limits, run_id, ran_at and a cite_as line. A Payment-Receipt header names the payment."
          },
          "400": {
            "description": "The request is not a valid run."
          },
          "402": {
            "description": "Payment required: a WWW-Authenticate: Payment challenge, or a fresh one if the credential was refused."
          },
          "422": {
            "description": "The run failed its own controls. No result is given and nothing was charged."
          },
          "502": {
            "description": "A source could not be read. Nothing was charged."
          },
          "503": {
            "description": "Paid runs are not switched on. Nothing was charged."
          }
        }
      }
    }
  }
}
