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) andcheckedOn(date confirmed). - Unknown stays empty. What we could not confirm is absent – never 0, never null – and listed with its reason under
open(firm) orgaps(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.
| Path (GET) | Content |
|---|---|
| /api/v1 | List of the endpoints with a description. |
| /api/v1/firms | Every 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/challenges | One row per programme and account size with the rules for a purchase today. |
| /api/v1/changes | The change history of every firm, newest first. |
| /api/v1/openapi.json | This 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
usdfigure. - 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
| Field | Meaning |
|---|---|
| value | The value, in the shape the OpenAPI document names for the field. |
| sources[].url | The page we read the value on. For rules and prices always a page of the firm itself. |
| sources[].kind | Kind of page: firm-page, terms, help-center, faq, pdf, regulator, registry or press. |
| sources[].seenOn | Day we fetched and read the page. |
| checkedOn | Day we last confirmed the value at its source. |
| certainty | official: 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. |
| note | A qualification or calculation basis, in German and English. |
| derived | Challenge 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[].status | current: 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, validUntil | Start according to the firm, day we first observed it, last day for new purchases. |
| appliesTo, grandfathering | Who a rule version applies to (new orders only, all accounts, …) and what happens to accounts bought before. |
| affiliate | Whether we have a partner agreement with the firm. It changes neither order nor content. |
| verified | false, 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:
curl -s https://propcrab.io/api/v1/firms \
| jq '.data[] | {slug, state: .status.value.state, dataAsOf}'curl -s https://propcrab.io/api/v1/firms/ftmo \
| jq '.data.programs[] | {id, name, current: .currentRuleVersionId}'curl -s https://propcrab.io/api/v1/challenges \
| jq '.data[] | select(.listPrice)
| {id, price: .listPrice.value, source: .listPrice.sources[0].url, checkedOn: .listPrice.checkedOn}'curl -s https://propcrab.io/api/v1/changes \
| jq '.data[] | select(.upcoming) | {firm: .firm.name, date, kind}'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.generatedOnnames 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.