Skip to content

Open data · API v1

Open data: our data as an API

Free, no key, no sign-up, read-only. Every value carries its source URL and the date we confirmed it at that source.

The crab shares. With sources.

The short version

  • Free and openly readable. No key, no sign-up, no cookie. Any website may fetch the data with a GET (CORS *).
  • Every value with a receipt. Each value comes with sources (address, kind of page, date read) and checkedOn (date confirmed).
  • Unknown stays empty. What we could not confirm is absent – never 0, never null – and listed with its reason under open (firm) or gaps (challenge row).
  • Rule versions are kept. Earlier and announced rules sit next to the current ones, with start date, scope and grandfathering.
  • No score, no ranking. The API delivers facts, not a verdict. Partner status is there for transparency only.
  • No click or partner data. No affiliate links, no click counts, no contract data.

Endpoints

Base: https://propcrab.io. Every response is application/json; charset=utf-8.

Endpoints
Path (GET)Content
/api/v1List of the endpoints with a description.
/api/v1/firmsEvery firm: status, markets, programme count, data date, partner status.
/api/v1/firms/{slug}One firm in full, as published: programmes, current and earlier rule versions, account sizes with prices, residence, companies, events, warnings, open items.
/api/v1/challengesOne row per programme and account size with the rules for a purchase today.
/api/v1/changesThe change history of every firm, newest first.
/api/v1/openapi.jsonThis API as an OpenAPI 3.1 document.

Shape of every response

Every response has two parts: meta describes the file, data holds the data. Firms come alphabetically, challenge rows by firm, programme and account size, changes newest first.

generatedOn
Day the file was rendered: at build time, then at most once a day.
count
Number of entries in data.
dataAsOf
Oldest confirmation date in this response. Every value was confirmed on or after that day.
latestCheck
Newest confirmation date in this response.
fxReferenceDate
Challenges only: date of the reference rates behind every usd figure.
licence
The licence of the data. Today null: none has been chosen yet.
citation, notice
How to credit us, and the "not investment advice" notice.

What a value looks like

A real value from today's data (FTMO · FTMO Challenge 2-Step · 10k · listPrice):

{
  "value": {
    "amount": 89,
    "currency": "EUR"
  },
  "sources": [
    {
      "url": "https://ftmo.com/en/",
      "kind": "firm-page",
      "seenOn": "2026-10-29",
      "title": "FTMO home (pricing widget)"
    }
  ],
  "checkedOn": "2026-10-29",
  "certainty": "official"
}

What the fields mean

What the fields mean
FieldMeaning
valueThe value, in the shape the OpenAPI document names for the field.
sources[].urlThe page we read the value on. For rules and prices always a page of the firm itself.
sources[].kindKind of page: firm-page, terms, help-center, faq, pdf, regulator, registry or press.
sources[].seenOnDay we fetched and read the page.
checkedOnDay we last confirmed the value at its source.
certaintyofficial: the firm's page, terms, help centre or PDF. official-extract: the firm's own text, but only as an extract. third-party: press or a regulator, never for rule values. open: with a caveat, never used for filters or sorting.
noteA qualification or calculation basis, in German and English.
derivedChallenge rows only: computed from several values (buffer, entry cost, cost per 1,000 of buffer, target ÷ buffer). The sources are those of the values used.
ruleVersions[].statuscurrent: the rules for a purchase today. upcoming: announced, starting after today. previous: no longer for new purchases, but may still govern accounts already bought.
validFrom, observedFrom, validUntilStart according to the firm, day we first observed it, last day for new purchases.
appliesTo, grandfatheringWho a rule version applies to (new orders only, all accounts, …) and what happens to accounts bought before.
affiliateWhether we have a partner agreement with the firm. It changes neither order nor content.
verifiedfalse, or the date a human checked the whole record against its sources.

Unknown is not 0

When a value is missing, the field is missing. We never put 0, null or an empty string in its place. In a firm record the reason is under open, in a challenge row under gaps – which also lists rules that do not apply to a programme at all (not-applicable, such as no profit target on an instant account).

A real entry from gaps:

{
  "field": "activationFee",
  "state": "unknown",
  "reason": {
    "de": "Nicht erfasst: Für diesen Wert liegt uns keine belegte Angabe der Firma vor.",
    "en": "Not recorded: we hold no sourced statement from the firm for this value."
  }
}

Examples

With curl and jq on the command line, or with fetch in the browser:

Every firm with status and data date
curl -s https://propcrab.io/api/v1/firms \
  | jq '.data[] | {slug, state: .status.value.state, dataAsOf}'
A firm's programmes with the current rule version
curl -s https://propcrab.io/api/v1/firms/ftmo \
  | jq '.data.programs[] | {id, name, current: .currentRuleVersionId}'
List prices with source and date
curl -s https://propcrab.io/api/v1/challenges \
  | jq '.data[] | select(.listPrice)
        | {id, price: .listPrice.value, source: .listPrice.sources[0].url, checkedOn: .listPrice.checkedOn}'
Announced changes
curl -s https://propcrab.io/api/v1/changes \
  | jq '.data[] | select(.upcoming) | {firm: .firm.name, date, kind}'
In the browser (JavaScript)
const response = await fetch("https://propcrab.io/api/v1/firms");
const { meta, data } = await response.json();
console.log(meta.generatedOn, meta.licence, data.length);

Updates and caching

  • Static files. They are rendered at build time and at most once a day after that. meta.generatedOn names the day.
  • Cache-Control: public, max-age=3600, s-maxage=86400. Please fetch each address at most once an hour; the data change at most once a day.
  • /api/v1/challenges is the largest file (about 20.1 MB uncompressed today). If you need one firm only, use /api/v1/firms/{slug}.
  • Read-only. GET, HEAD and OPTIONS; the server answers anything else with 405.
  • Versions. Within v1, fields may only be added. A rename or removal would get a new path (/api/v2).

How to cite

Credit "PropCrab (propcrab.io)" with the data date and the date you retrieved it. For single values, add the firm's source from sources – that is the actual primary source.

Source: PropCrab (propcrab.io), data as of 29 October 2026, retrieved <your retrieval date>; primary source: https://ftmo.com/en/

Licence

No licence has been chosen for these data yet, so the API reports licence: null. Once the operator picks one, it is stated here and in every response. Until then, please ask us before republishing the data in bulk.

Not investment advice

The data describe paid evaluation programmes, mostly on simulated accounts. They are not a recommendation and not investment advice. The firm's own terms at the time of purchase always govern; simulated profits and payouts are not real trading results.