broadcastwell-com Runs API

The Runs API from broadcastwell-com — 4 operation(s) for runs.

Operations 4

GET /accounts/{account}/runs Runs #
GET /accounts/{account}/runs/{run} One run #
GET /accounts/{account}/runs/{run}/summary Run summary #
GET /accounts/{account}/runs/{run}/compare/{other} Compare two runs #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/broadcastwell-com:broadcastwell-com-runs-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

broadcastwell-com-runs-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Broadcastwell Runs API
  version: 1.0.0
  summary: Read the answers five AI engines gave to your buyers' questions, with every receipt.
  description: 'Read only. Every rate is a five field object: pct, low, high, interval and base, where low and high are the 95% Wilson interval and base states the count. Every headline figure counts scheduled runs only. Adaptive runs are labelled and never pooled. Errors are problem details with a next step. Version 1 changes only by addition.


    The public demo key bwp_demo_kalvenor_sample reads the fictional Kalvenor sample at /accounts/sample.


    The separate commercial Agent Test is run by ChatGPT Work with Cloud browser, two runs per task at least two hours apart. Its ten task results and 20 session receipts are delivered through the owning account after human review; they are not pooled with the five-engine measurements described by this API.'
  contact:
    name: Broadcastwell
    email: hello@broadcastwell.com
    url: https://broadcastwell.com
  termsOfService: https://broadcastwell.com/terms
servers:
- url: https://app.broadcastwell.com/api/v1
security:
- bearer: []
tags:
- name: Runs
paths:
  /accounts/{account}/runs:
    get:
      operationId: listRuns
      summary: Runs
      description: Every measurement the account holds, newest first, with its passes. Scheduled passes carry the figures. Adaptive passes are labelled.
      tags:
      - Runs
      parameters:
      - name: account
        in: path
        required: true
        description: me, your account id, or sample for the fictional Kalvenor sample. Any other id answers 404.
        schema:
          type: string
          maxLength: 200
          examples:
          - sample
          - me
      - name: limit
        in: query
        description: Items per page, 1 to 100. Default 25.
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 25
      - name: cursor
        in: query
        description: The next_cursor from the previous page.
        schema:
          type: string
          maxLength: 40
      responses:
        '200':
          description: A page of runs
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                - pagination
                properties:
                  sample:
                    type: boolean
                    description: Present and true on every sample response.
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Run'
                  pagination:
                    $ref: '#/components/schemas/Pagination'
        '304':
          description: Not modified. The If-None-Match value matched the current ETag.
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
  /accounts/{account}/runs/{run}:
    get:
      operationId: getRun
      summary: One run
      tags:
      - Runs
      parameters:
      - name: account
        in: path
        required: true
        description: me, your account id, or sample for the fictional Kalvenor sample. Any other id answers 404.
        schema:
          type: string
          maxLength: 200
          examples:
          - sample
          - me
      - name: run
        in: path
        required: true
        description: A run id from the runs list.
        schema:
          type: string
          pattern: ^[A-Za-z0-9._:-]{1,200}$
          examples:
          - baseline-kalvenor-v11
      responses:
        '200':
          description: The run
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  sample:
                    type: boolean
                  data:
                    $ref: '#/components/schemas/Run'
        '304':
          description: Not modified. The If-None-Match value matched the current ETag.
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
  /accounts/{account}/runs/{run}/summary:
    get:
      operationId: getRunSummary
      summary: Run summary
      description: Named and own domain cited rates on scheduled passes, overall, per engine and per question type. Adaptive answers are reported separately.
      tags:
      - Runs
      parameters:
      - name: account
        in: path
        required: true
        description: me, your account id, or sample for the fictional Kalvenor sample. Any other id answers 404.
        schema:
          type: string
          maxLength: 200
          examples:
          - sample
          - me
      - name: run
        in: path
        required: true
        description: A run id from the runs list.
        schema:
          type: string
          pattern: ^[A-Za-z0-9._:-]{1,200}$
          examples:
          - baseline-kalvenor-v11
      responses:
        '200':
          description: The summary
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  sample:
                    type: boolean
                  data:
                    $ref: '#/components/schemas/RunSummary'
        '304':
          description: Not modified. The If-None-Match value matched the current ETag.
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
  /accounts/{account}/runs/{run}/compare/{other}:
    get:
      operationId: compareRuns
      summary: Compare two runs
      description: Named rates on the questions and engines both runs measured. A change is called only where the intervals separate, and never across method versions.
      tags:
      - Runs
      parameters:
      - name: account
        in: path
        required: true
        description: me, your account id, or sample for the fictional Kalvenor sample. Any other id answers 404.
        schema:
          type: string
          maxLength: 200
          examples:
          - sample
          - me
      - name: run
        in: path
        required: true
        description: A run id from the runs list.
        schema:
          type: string
          pattern: ^[A-Za-z0-9._:-]{1,200}$
          examples:
          - baseline-kalvenor-v11
      - name: other
        in: path
        required: true
        description: The second run id.
        schema:
          type: string
          pattern: ^[A-Za-z0-9._:-]{1,200}$
      responses:
        '200':
          description: The comparison
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  sample:
                    type: boolean
                  data:
                    type: object
        '304':
          description: Not modified. The If-None-Match value matched the current ETag.
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
components:
  headers:
    RateLimitReset:
      description: Seconds until the window resets.
      schema:
        type: integer
    RateLimitLimit:
      description: Requests allowed in the current window.
      schema:
        type: integer
    RateLimitRemaining:
      description: Requests left in the current window.
      schema:
        type: integer
    ETag:
      description: Strong entity tag. Send it back as If-None-Match.
      schema:
        type: string
  responses:
    Problem429:
      description: Rate limit reached. Retry-After says when to retry.
      headers:
        Retry-After:
          schema:
            type: integer
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    Problem401:
      description: The key is missing, invalid or revoked.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    Problem404:
      description: Nothing with that id is available to this key.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    Problem400:
      description: A parameter is invalid.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
  schemas:
    Rate:
      type: object
      required:
      - pct
      - low
      - high
      - interval
      - base
      additionalProperties: false
      properties:
        pct:
          type: number
        low:
          type: number
        high:
          type: number
        interval:
          type: string
        base:
          type: string
      example:
        pct: 24.1
        low: 20.6
        high: 28
        interval: 20.6 to 28.0
        base: 125 of 518 answers
    Problem:
      type: object
      required:
      - type
      - title
      - status
      - code
      - detail
      properties:
        type:
          type: string
        title:
          type: string
        status:
          type: integer
        code:
          type: string
        detail:
          type: string
    Pagination:
      type: object
      required:
      - limit
      - next_cursor
      - total
      properties:
        limit:
          type: integer
        next_cursor:
          type:
          - string
          - 'null'
        total:
          type: integer
    RunSummary:
      type: object
      properties:
        run_id:
          type: string
        method_version:
          type: string
        scheduled:
          $ref: '#/components/schemas/Counted'
        adaptive:
          anyOf:
          - $ref: '#/components/schemas/Counted'
          - type: 'null'
    Counted:
      type: object
      properties:
        observed:
          type: integer
        scored:
          type: integer
        excluded:
          type: integer
        named:
          type: integer
        named_rate:
          $ref: '#/components/schemas/Rate'
        own_domain_cited:
          type: integer
        cited_rate:
          $ref: '#/components/schemas/Rate'
    Run:
      type: object
      required:
      - run_id
      - kind
      - status
      properties:
        run_id:
          type: string
        kind:
          type: string
        status:
          type: string
        method_version:
          type: string
        immutable:
          type: boolean
        question_count:
          type: integer
        engines:
          type: array
        passes:
          type: array
          items:
            $ref: '#/components/schemas/Pass'
    Pass:
      type: object
      properties:
        pass_id:
          type: string
        kind:
          type: string
          enum:
          - scheduled
          - adaptive
          - monitor
        scheduled:
          type: boolean
        started_at:
          type: string
        completed_at:
          type: string
        observed:
          type: integer
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
      description: An account API key, or the public demo key.
x-changelog:
- date: '2026-10-15'
  version: 1.1.0
  change: 'Added POST /accounts/me/questions: a live question, by a key whose account allowed live questions when creating it. Without preview_hash it previews and spends nothing; with it, it asks and uses one credit.'
- date: '2026-10-14'
  version: 1.0.0
  change: 'Added the public tier, no key needed: GET /index/categories, GET /index/categories/{category} and GET /public-fix, GET /public-fix/{slug}, the same reads as the public connector at /mcp/public. 60 requests a minute and 1,000 a day per address.'
- date: '2026-10-07'
  version: 1.0.0
  change: 'Added read-only GET /kpi: organic evidence, sponsored presence and permissioned AI referrals with sources and dates. The demo key returns fictional SAMPLE DATA.'
- date: '2026-10-06'
  version: 1.0.0
  change: 'Agent Test: ten tasks run by ChatGPT Work with Cloud browser, two runs per task at least two hours apart. Account findings require all 20 receipts and human review. The separate Agent Gap study uses one primary run per task with a repeat sample.'
- date: '2026-09-21'
  version: 1.0.0
  change: 'Version 1 published: runs, run summary, questions, receipts, displacement, sources, fixes, history, alerts, proof and method. Account API keys, the public demo key and webhooks.'
- date: '2026-09-28'
  version: 1.0.0
  change: Added GET /index/lookup, the public Absence Index lookup by website or name. No key needed.
x-rate-limits:
  key_per_minute: 60
  key_per_day: 5000
  demo_per_address_minute: 30
  note: Defaults. The live values are returned on every response in the RateLimit headers.