Public API · v1

Ciroapp pricing API

Free JSON for the published list prices Ciroapp tracks: plans, monthly and annual prices, free plans, trials, verified price history, and the cheapest tools per category. No key, no sign-up.

Endpoints

  • GET /api/v1/software/{slug}/pricing.json: pricing for one tool. The slug is the last part of its Ciroapp URL (/software/{slug}).
  • GET /api/v1/categories/{slug}/pricing.json: every approved tool in a category with its lowest price, plus the cheapest options for 1, 5, 10 and 25 users.
  • GET /api/pulse/price-changes.json: verified SaaS price changes across all tools (?limit=1..500&category=&direction=increase|decrease).
  • GET /llms-full.txt: one-line pricing summaries of the most-viewed tools, for LLMs and quick scripts.

Unknown or unpublished slugs return 404.

Examples

curl https://ciroapp.com/api/v1/software/{slug}/pricing.json

curl https://ciroapp.com/api/v1/categories/{slug}/pricing.json

curl "https://ciroapp.com/api/pulse/price-changes.json?limit=20&direction=increase"
const res = await fetch('https://ciroapp.com/api/v1/software/{slug}/pricing.json')
if (res.ok) {
  const data = await res.json()
  console.log(data.name, data.fromPrice, data.currency, data.pricesCheckedAt)
}

Tool response

FieldTypeMeaning
name, slugstringTool name and Ciroapp slug.
urlstringCiroapp page for the tool (link here when you attribute).
websitestring | nullVendor website.
categorystring | nullPrimary category.
currencystring | nullISO 4217 code printed on the vendor price list. Null when the vendor shows no currency.
fromPrice, fromPlannumber | null, string | nullLowest paid price per month in `currency` (the monthly-billing price, or the annual price per month when a plan is only billed annually), and its plan. Same figure as "From" on the software page.
plans[]object[]name, currency, monthly (per month, monthly billing), annual (per year), annualPerMonth, perUser, isFree, contactSales, introPrice (vendor intro offer; monthly/annual are always list prices), includedUsers, extraUserPrice (per extra user per month; base price covers includedUsers). Unparseable prices, usage units (per transfer, per hour...) and promo-only prices are null.
freePlanbooleanThe vendor lists a free plan.
trialDays, moneyBackDaysnumber | nullOnly when the vendor states a number of days.
pricesCheckedAtISO date | nullWhen the listed prices were last verified against the vendor page. Null when they do not match the last check.
vendorPageCheckedAtISO date | nullWhen the vendor pricing page was last checked, whether or not the listed prices match it.
pricingPageUrlstring | nullVendor pricing page.
history[]object[]Verified price changes, newest first: capturedAt and per-plan changes (plan, before, after, direction, pctChange).
source, attribution, licensestring, object, stringWhere the data comes from and how to credit it.

Category response

FieldTypeMeaning
name, slug, urlstringCategory and its Ciroapp page.
currencystring | nullMajority currency in the category. Only tools priced in it are ranked.
toolCount, comparableCountnumberApproved tools, and tools that can be ranked in `currency`.
tools[]object[]name, slug, url, currency, fromPrice, freePlan, trialDays, pricesCheckedAt, vendorPageCheckedAt.
cheapest[]object[]For 1, 5, 10 and 25 users: the 3 cheapest tools (plan, perMonth for the whole team, billing, perUser, billedUsers, assumedOneLicencePerUser: flat plan with no stated user limit, priced once for the whole team and never ranked above stated-terms prices).
cheapestPageUrlstring | nullThe matching /cheapest page when it is published.

Attribution and license

Free to use, including commercially, with CC BY-style attribution: credit "Pricing data by Ciroapp" with a link to the source URL.

Show the credit wherever the data appears, next to the data, and link it to the url field of the response:

<a href="https://ciroapp.com/software/{slug}">Pricing data by Ciroapp</a>

Also show pricesCheckedAt with prices: vendors change them, and readers should know how fresh they are.

Caching and rate limits

  • Responses are cached for 1 hour (Cache-Control: public, max-age=3600). Polling more often returns the same data.
  • CORS is open (Access-Control-Allow-Origin: *), so you can call the API from a browser.
  • Up to 120 requests per minute per IP. Over the limit you get 429 with a Retry-After header.
  • For bulk needs, cache on your side and contact us instead of crawling every slug.

What the data is, and is not

  • Published list prices from vendor pricing pages, before taxes, add-ons and discounts.
  • Nothing is estimated: prices we cannot read stay null, and a currency is only given when the vendor prints one.
  • No deals, coupons or discount codes.

Are you a vendor?

Embed the Ciroapp pricing badge on your site, or claim your listing to keep your prices up to date.