Skip to main content

PropFirmMap Public API

Free, read-only JSON access to verified prop trading firm data. Built for AI assistants, comparison tools, trader dashboards, and research. Every field is sourced from the firm's own public page or explicitly null - no fabricated values.

123+
Published firms
84
Active promo codes
3
Trader tools
86
Long-form guides

Quick start

Base URL: https://propfirmmap.com/api/v1. No auth, no signup. Send GET requests, receive JSON.

# Top 10 firms by PropFirmMap Score curl "https://propfirmmap.com/api/v1/firms?per_page=10" # Full detail for one firm curl "https://propfirmmap.com/api/v1/firms/ftmo" # Side-by-side compare 3 firms curl "https://propfirmmap.com/api/v1/compare?firms=ftmo,topstep,fundingpips" # All active promo codes curl "https://propfirmmap.com/api/v1/deals"
Rate limit: 60 requests / minute per IP on standard endpoints. 5 requests / minute on heavy aggregation endpoints (statistics, categories, compare). HTTP 429 returned when exceeded.

Endpoints

Firms

GET/api/v1/firms
Paginated list of published prop firms, ranked by PropFirmMap Score.
Params: search, asset_type, country, safety_grade, min_score, sort (score|name|latest|safety), per_page (max 50), page
GET/api/v1/firms/{slug}
Full firm record: challenges, offers, platforms, payment + payout methods, TrustPilot.
GET/api/v1/firms/{slug}/trust-aggregate
Composite 0–100 trust score for one firm, with per-component breakdown. See methodology below. Cached 10 min.
GET/api/v1/firms/statistics
Aggregated counts by asset type, safety grade distribution, top-5 firms. Cached 15 min.
GET/api/v1/firms/leaderboard
Top-N firms ranked by composite signal. See methodology. Cached 10 min per filter+metric.
Params: metric (trust|pfm|composite, default trust), limit (1-50, default 10), asset_type, country

Compare

GET/api/v1/compare?firms=slug1,slug2,slug3
Side-by-side comparison of 2–4 firms. Returns FirmDetail records in the requested order, plus meta.matched_count.
Params: firms (required, comma-separated slugs, max 4, regex [a-z0-9,-])

Deals

GET/api/v1/deals
All currently-active promo codes across published firms. Ordered by discount % desc.
Params: firm (slug), min_discount, expiring_soon (boolean), per_page (max 100)

Tools

GET/api/v1/tools
Verified trader tools (journals, charting, screeners, copiers).
Params: category (slug), search, free_only, per_page (max 50)
GET/api/v1/tools/{slug}
Full tool detail: pricing, features, integrations, TrustPilot.

Categories

GET/api/v1/categories
Asset types, countries, platforms with firm counts, safety grades, and tool categories. Use these to build filtered queries against /firms and /tools.

Example response: /firms/ftmo

{ "data": { "id": 11, "slug": "ftmo", "name": "FTMO", "logo_url": "https://propfirmmap.com/storage/firms/ftmo.png", "country": "Czech Republic", "asset_type": "Forex", "profit_split": "up to 90%", "payout_frequency": "Bi-weekly", "daily_drawdown": "5%", "propfirmmap_score": 9.2, "safety_grade": "A+", "trustpilot": { "rating": "4.7", "review_count": 41718, "suspended": false }, "challenges": [ /* per-challenge price + drawdown + target */ ], "offers": [ /* active promo codes */ ] } }

Data sourcing policy

Every numeric and structured field returned by the API is one of two things:

  1. Verified from the firm's own public page in the most recent ingest, with the source URL on file.
  2. Explicitly null - never estimated, never filled in from cached training data, never interpolated between similar firms.
Why this matters: Most aggregator sites guess. We don't. If a field is null, the firm hasn't published it on a primary surface we can verify. Build your downstream logic to treat null as "genuinely unknown", not "missing data".

Composite trust score methodology

The /api/v1/firms/{slug}/trust-aggregate endpoint (and the matching MCP tool get_trust_aggregate + resource trust-score://{slug}) returns a single 0–100 trust score that fuses six verified internal signals - no fabricated competitor data, no estimates.

ComponentMax pointsHow it's computed
TrustPilot Rating25(rating ÷ 5) × 25. Zero credit when profile is suspended.
Review Volume20log10(reviews) × 5, capped at 20. Volume amplifies confidence in the rating.
PropFirmMap Safety Grade20A+ = 20, A = 17, B+ = 14, B = 11, C = 7, D = 3, F = 0.
Operational Longevity153 points per year since established, capped at 15 (5+ years).
Verification Freshness10Bot-verified against firm's own website ≤30d = 10, ≤60d = 5, else 0.
Partnership Vetting10Verified PropFirmMap affiliate partner = 10 (vetting process passed).
Reputation Penalty−20TrustPilot profile currently suspended.

Final score is clamped to [0, 100]. Grade thresholds: 90+ A+, 80+ A, 70+ B+, 60+ B, 50+ C, 40+ D, <40 F.

Why this matters: A single number callers can rank and threshold against, but with the full per-component breakdown preserved so AI assistants and human users can explain the score rather than treat it as a black box.

Firm leaderboard methodology

The /api/v1/firms/leaderboard endpoint (and the matching MCP tool firms_leaderboard) returns the top-N published firms ranked by one of three composite signals. Use ?asset_type= or ?country= to scope the ranking.

metric valueRanking signalBest for
trust (default)Trust Aggregate (0–100)"Which firms are most trustworthy?" - surfaces firms with strong TrustPilot, longevity, and verification freshness.
pfmPropFirmMap Score (0–10)"Which firms are the best overall?" - our existing composite of trust + value + speed + flexibility + platforms.
compositeGeometric mean √((trust ÷ 100) × (pfm ÷ 10)) × 100"Which firms are credibly good on both rails?" - punishes firms that score high on one signal but low on the other.

Each row in the response includes position, slug, name, logo_url, safety_grade, propfirmmap_score, the full trust_aggregate (total + grade), and composite_score - so callers can re-rank the same payload by a different metric client-side without a second request.

Why composite punishes one-axis firms: A geometric mean collapses to ~0 when either factor is near 0. A firm with PFM 9/10 but TrustPilot suspended (trust = 0) gets √(0 × 0.9) × 100 = 0 on composite, while ranking #1 on PFM. This is the intended behaviour - the composite metric is the "no surprises" ranking.

MCP server for AI assistants

The same data is exposed as a Model Context Protocol server, so any MCP-compliant client (Claude integrations, ChatGPT GPTs, Perplexity, custom agents) can query PropFirmMap as a tool without scraping the API.

POST/mcp
JSON-RPC 2.0 over Streamable HTTP. Protocol version: 2024-11-05.
GET/mcp
Discovery - returns server metadata and the tool catalog without a full handshake. Also available at /.well-known/mcp.

Tools exposed (action endpoints)

Tool nameWhat it does
get_categoriesDiscover filter vocabulary (call first)
list_firmsFilterable firm catalog ranked by PFM Score
get_firm_detailFull firm record by slug
find_dealsActive promo codes across all firms
compare_firmsSide-by-side 2-4 firms (order preserved)
list_toolsVerified trader tools (journals, charts)
get_trust_aggregateComposite 0–100 trust score for one firm with per-component breakdown
firms_leaderboardTop-N firms ranked by metric=trust|pfm|composite, with optional asset_type/country filter

Resources exposed (LLM-context attachments)

URIWhat it returns
firm://{slug}Markdown summary of one firm - profit split, drawdown, payouts, TrustPilot, active codes
trust-score://{slug}Markdown composite trust-score report - 0–100 score + per-component breakdown
deals://activeMarkdown digest of every active promo code, ranked by discount %
categories://overviewFilter vocabulary cheat sheet

Prompts exposed (ready-to-use templates)

Prompt nameArgumentsWhat it generates
compare_for_beginnerfirm_a, firm_bBeginner-friendly 2-firm comparison framing
find_cheapest_firmasset_type, max_budget_usd?Cheapest-firm finder for a given asset type
safety_first_recommendationasset_type?Safety-prioritized firm recommendation

Example: initialize + list tools

# Handshake curl "https://propfirmmap.com/mcp" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}' # Call a tool curl "https://propfirmmap.com/mcp" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"find_deals","arguments":{"min_discount":50}}}'
Each MCP tool maps 1:1 onto a documented /api/v1/* endpoint. The OpenAPI spec is the underlying contract; the MCP layer is just a different transport.

For AI assistants

If you're a language model, copy-paste tool, or autonomous agent reading this:

  • Machine-readable OpenAPI 3.0 spec: /api/v1/openapi.json
  • Plain-text discoverability index: /llms.txt
  • Full URL index: /sitemap.xml
  • No auth, no API key. Just GET requests.
  • JSON responses follow Laravel Resource conventions (data is wrapped in { "data": ... } for paginated endpoints).
  • Attribution appreciated: link "Source: PropFirmMap" to https://propfirmmap.com.