{
  "$schema": "https://datapackage.org/profiles/2.0/datapackage.json",
  "name": "signal-brief-ai-tool-price-index",
  "title": "Signal Brief AI tool price index",
  "description": "Real annual prices for 65 AI tools at a 20-person product org — the number vendors hide behind \"Contact sales\", researched off their own pricing pages, in one scannable table. The median published annual figure is $9,504/year. Free to read, no signup, no sponsors, no affiliate links. Free, in this dataset: the tool, its category, its one-sentence description, the vendor link and the researched annual price at a 20-person product org. NOT in this dataset: the adopt / pilot / skip verdict, the SSO / SOC 2 / data-handling line and the paste-ready three-line internal pitch — those are the subscriber half of each Adoption Brief, opened by a no-card, email-only 7-issue trial at https://signal-brief19.acoco.ai/trial.",
  "homepage": "https://signal-brief19.acoco.ai/ai-tool-prices",
  "id": "https://signal-brief19.acoco.ai/ai-tool-prices",
  "version": "2026-10-26",
  "created": "2026-10-26T00:00:00Z",
  "keywords": [
    "AI tool pricing",
    "AI tools cost",
    "SaaS pricing",
    "pricing for a 20-person product org",
    "B2B SaaS product management",
    "software budget",
    "price index"
  ],
  "licenses": [
    {
      "name": "CC-BY-4.0",
      "path": "https://creativecommons.org/licenses/by/4.0/",
      "title": "Creative Commons Attribution 4.0 International"
    }
  ],
  "attribution": "Creative Commons Attribution 4.0 International (CC-BY-4.0). Free to quote and recompute, commercially or otherwise; the one condition is attribution. Attribute to Signal Brief and link https://signal-brief19.acoco.ai/ai-tool-prices. Full licence text: https://creativecommons.org/licenses/by/4.0/. An attribution should name Signal Brief, link https://signal-brief19.acoco.ai/ai-tool-prices and carry the revision date, because prices rot and a figure without its date is not a fact.",
  "contributors": [
    {
      "title": "Signal Brief",
      "path": "https://signal-brief19.acoco.ai",
      "email": "signal-brief19@mail.acoco.ai",
      "roles": [
        "author",
        "publisher",
        "maintainer"
      ]
    }
  ],
  "sources": [
    {
      "title": "Signal Brief — the price index as a web page",
      "path": "https://signal-brief19.acoco.ai/ai-tool-prices"
    }
  ],
  "methodology": "Each price is read off the vendor's own published pricing page, where there is one, on the day that tool ran in Signal Brief — or, for a row re-read by hand since, on the day of that re-read, which is the day price_checked_on carries — priced at 20 seats — the tier a 20-person product org actually lands on, including minimums and platform fees — never the headline tier and never a list price nobody pays. Where a vendor publishes no rate card, the row says so instead of carrying an estimate. Where a vendor publishes only a monthly figure, the annual column is that figure × 12 and annual_basis says so. Where the figure is a band buyers or third-party trackers report rather than one the vendor publishes, or our own multiplication on published units, annual_basis says that too — and a figure quoted for one seat, one test or one ticket is never published as the org's annual cost. Every published figure is checked before it is printed: its twelve-month equivalent must fall between $50 and $1,000,000 a year at a 20-person product org, and both ends of it must appear in the stored brief the row links to. A figure that fails either check is not published at all — the row says the vendor publishes no rate card, or that we have not priced the tool yet.",
  "resources": [
    {
      "name": "ai-tool-prices",
      "path": "https://signal-brief19.acoco.ai/ai-tool-prices.csv",
      "type": "table",
      "profile": "tabular-data-resource",
      "title": "Researched annual prices for AI tools at a 20-person product org",
      "description": "RFC 4180, UTF-8, CRLF line endings, one header row, one row per tool, ordered by twelve-month cost (dearest first). Text cells beginning = + @ or - are prefixed with a single apostrophe so spreadsheets cannot evaluate them as formulas; numeric columns are never affected. Revision 2026-10-26.",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 41801,
      "hash": "sha256:0e1844188d624f6d4a2ec46a0019b68b44f77e2c2dd2a6a90c61c061f545782e",
      "dialect": {
        "delimiter": ",",
        "lineTerminator": "\r\n",
        "quoteChar": "\"",
        "doubleQuote": true,
        "header": true
      },
      "schema": {
        "fields": [
          {
            "name": "tool",
            "type": "string",
            "title": "tool",
            "description": "The tool's name, as Signal Brief published it.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "category",
            "type": "string",
            "title": "category",
            "description": "The category the tool was covered under (one per tool).",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "one_line_description",
            "type": "string",
            "title": "one line description",
            "description": "Signal Brief's one-sentence description of what the tool does."
          },
          {
            "name": "price_status",
            "type": "string",
            "title": "price status",
            "description": "Whether this row carries a researched figure (researched), the vendor publishes no rate card at all (vendor_publishes_none), or Signal Brief has not priced the tool yet (not_priced_yet). An empty price is NEVER a zero price — read this column before treating a blank amount as a number.",
            "constraints": {
              "required": true,
              "enum": [
                "researched",
                "vendor_publishes_none",
                "not_priced_yet"
              ]
            }
          },
          {
            "name": "price_label",
            "type": "string",
            "title": "price label",
            "description": "The figure exactly as it is printed on the page, e.g. \"$1,200/year\". Blank when price_status is not `researched`."
          },
          {
            "name": "amount_usd_low",
            "type": "number",
            "title": "amount usd low",
            "description": "The low end of the researched figure, in US dollars, on the period given by price_period (NOT annualised). Blank when no figure was researched."
          },
          {
            "name": "amount_usd_high",
            "type": "number",
            "title": "amount usd high",
            "description": "The high end of the researched figure, in US dollars, on the period given by price_period. Equals amount_usd_low when the figure is a single number rather than a band."
          },
          {
            "name": "price_period",
            "type": "string",
            "title": "price period",
            "description": "The period the researched figure is quoted over: year, month, or other when the source brief states a figure with no period at all. Blank when no figure was researched.",
            "constraints": {
              "enum": [
                "year",
                "month",
                "other"
              ]
            }
          },
          {
            "name": "annual_usd_low",
            "type": "number",
            "title": "annual usd low",
            "description": "The twelve-month cost at 20 seats, low end, in US dollars. ALWAYS read with annual_basis: a monthly figure appears here multiplied by 12 and is flagged as Signal Brief's arithmetic, not the vendor's price. Blank when the source states no period, because no annual number is guessed."
          },
          {
            "name": "annual_usd_high",
            "type": "number",
            "title": "annual usd high",
            "description": "The twelve-month cost at 20 seats, high end, in US dollars. Always read with annual_basis."
          },
          {
            "name": "annual_basis",
            "type": "string",
            "title": "annual basis",
            "description": "Where the annual figure came from. vendor_annual_figure = the vendor's own published yearly price; buyer_reported_annual_figure = a figure buyers, resellers or a third-party tracker report, which the vendor does not publish; signal_brief_arithmetic = our own multiplication on the vendor's published units; annualised_from_monthly_by_signal_brief = the vendor's published monthly price × 12; period_unstated = the brief quotes a figure with no period and we will not call it annual; none = no figure.",
            "constraints": {
              "required": true,
              "enum": [
                "vendor_annual_figure",
                "buyer_reported_annual_figure",
                "signal_brief_arithmetic",
                "annualised_from_monthly_by_signal_brief",
                "period_unstated",
                "none"
              ]
            }
          },
          {
            "name": "seats",
            "type": "integer",
            "title": "seats",
            "description": "The seat count every figure in this dataset is a figure for: 20 seats, i.e. a 20-person product org. Constant across all rows, carried per row so a single row can be quoted without the dataset around it.",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "vendor_url",
            "type": "string",
            "title": "vendor url",
            "description": "The vendor's own URL, as last published by Signal Brief.",
            "format": "uri"
          },
          {
            "name": "signal_brief_url",
            "type": "string",
            "title": "signal brief url",
            "description": "The Signal Brief page for this tool, where the working behind the figure is shown. Unique per row.",
            "format": "uri",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "issue_number",
            "type": "string",
            "title": "issue number",
            "description": "The Signal Brief issue the figure was read for. Blank when no brief is held yet."
          },
          {
            "name": "issue_url",
            "type": "string",
            "title": "issue url",
            "description": "The permalink of that issue.",
            "format": "uri"
          },
          {
            "name": "issue_date",
            "type": "string",
            "title": "issue date",
            "description": "The day that issue was PUBLISHED, as its own human-readable date line (e.g. \"12 October 2026\"). This is not necessarily the day the figure was last checked: for a row re-read against the vendor's page since publication, price_checked_on is later. Quote price_checked_on as the check date, never this."
          },
          {
            "name": "price_checked_on",
            "type": "string",
            "title": "price checked on",
            "description": "The day this figure was last read off the vendor's own page, as ISO YYYY-MM-DD. Equal to the issue's day for a row nobody has re-read since; later for a row re-researched by hand, each of which is logged with the page read and the date at https://signal-brief19.acoco.ai/price-changes. Prices rot: never quote a figure without this."
          }
        ],
        "primaryKey": [
          "signal_brief_url"
        ],
        "missingValues": [
          ""
        ]
      }
    }
  ]
}
