Deal and pricing changes

Returns tracked pricing and tier changes across vendors. Filter by date, change type, vendor, or category. A tracked pricing change is a change a vendor made to published terms, which we recorded, still stands, and we have not withdrawn. Most carry the date the terms took effect; the rest carry the date we read the page. The rule and the four totals it separates are at /changes#what-counts, and every response carries them as change_census.

get/api/changes

Request

  • Base URL: https://agentdeals.dev
  • URL: https://agentdeals.dev/api/changes
  • Auth: none required

Query parameters

sincestring date

Only return changes dated on or after this date. Accepts a calendar date (YYYY-MM-DD) or an ISO-8601 timestamp, which is narrowed to the date it names — the whole of that day is returned either way. A date that does not exist answers 400. Default: 30 days ago, and only when no other filter is passed — a request carrying type, vendor, vendors, categories or category searches the whole change log unless since says otherwise. The filter compares against each record's date. Where date_meaning is "effective", that is the day the change took effect; where it is "discovered", it is the day we recorded the change, and when it took effect is unknown. Every response states the window it applied under date_window.

type'free_tier_removed' | 'open_source_killed' | 'product_deprecated' | 'limits_reduced' | 'restriction' | 'pricing_restructured' | 'pricing_model_change' | 'limits_increased' | 'new_free_tier' | 'new_tier' | 'startup_program_expanded' | 'pricing_postponed' | 'rebranded' | 'record_corrected'

Filter by change type. Every type a record can carry is accepted; the same list types the change_type field on the records that come back.

vendorstring

Filter by vendor name. Matched by case-insensitive substring, not by exact name: vendor=Pilot returns GitHub Copilot's records and category=ai returns Email's. Nothing is narrowed on your behalf, so read name_match, which every response carries: it names what this filter matched and whether each match was exact.

vendorsstring

Comma-separated vendor names to filter by (e.g. 'Vercel,Supabase,Clerk'). Matched by case-insensitive substring, not by exact name: vendor=Pilot returns GitHub Copilot's records and category=ai returns Email's. Nothing is narrowed on your behalf, so read name_match, which every response carries: it names what this filter matched and whether each match was exact.

categorystring

Comma-separated category names to filter by (e.g. 'Database,Cloud Hosting'). Matched by case-insensitive substring, not by exact name: vendor=Pilot returns GitHub Copilot's records and category=ai returns Email's. Nothing is narrowed on your behalf, so read name_match, which every response carries: it names what this filter matched and whether each match was exact.

categoriesstring

Comma-separated category names to filter by (e.g. 'Database,Cloud Hosting'). Matched by case-insensitive substring, not by exact name: vendor=Pilot returns GitHub Copilot's records and category=ai returns Email's. Nothing is narrowed on your behalf, so read name_match, which every response carries: it names what this filter matched and whether each match was exact.

limitinteger

Max results per page

offsetinteger

Number of results to skip

include_retractedboolean

Records we have withdrawn as our own error (standing 'retracted') are left out unless you ask for them. Set true to receive them alongside the rest; they arrive carrying standing 'retracted' and impact 'none'. Either way, retracted_excluded reports how many your query matched and did not receive. Anything other than 'true' or 'false' answers 400 rather than being ignored.

include_index_housekeepingboolean

Records of our own index housekeeping (reports 'our_index') are left out unless you ask for them. They say we stopped listing an offer of ours, not that the vendor changed anything, so counting them as vendor activity overstates it. Set true to receive them alongside the rest. Either way, index_housekeeping_excluded reports how many your query matched and did not receive. Anything other than 'true' or 'false' answers 400 rather than being ignored.

Response

List of deal changes

totalinteger

Records matching your query before paging, counting only the ones served. Retracted records are outside this count unless include_retracted is true, and our own index housekeeping is outside it unless include_index_housekeeping is true. Measured over the same population as all_time_total, so a type-filtered total and the whole-log figure can be compared.

returnedinteger
limitinteger
offsetinteger
include_retractedboolean

The value this response was built with, echoed back.

retracted_excludedinteger

How many records matched your query and were withheld for carrying standing 'retracted'. Zero when include_retracted is true, because nothing was withheld. Read this before comparing a count against an earlier one.

include_index_housekeepingboolean

The value this response was built with, echoed back.

index_housekeeping_excludedinteger

How many records matched your query and were withheld for carrying reports 'our_index'. Zero when include_index_housekeeping is true, because nothing was withheld. Read this before comparing a count against an earlier one.

all_time_totalinteger

The whole change log measured by the published rule, unaffected by your query. Equal to change_census.tracked_pricing_changes. A tracked pricing change is a change a vendor made to published terms, which we recorded, still stands, and we have not withdrawn. Most carry the date the terms took effect; the rest carry the date we read the page.

Changes

No recorded changes to this operation across all 1 revision of this API.