FaithScreener
REST API

FaithScreener API

Screen any stock against 10 faith-based compliance frameworks via REST API. 124,000+ tickers. 46 markets. Point-in-time history back to 2009.

Base URL: https://faithscreener.com

Prefer a machine-readable spec? Download the OpenAPI spec

Authentication

All authenticated requests send your API key in the X-API-Key header.

X-API-Key: fsk_live_your_key

Manage your API keys at /account/api-keys. Keys start with fsk_live_ and are tied to your subscription tier.

Screen a single stock

GET/api/screen/{market}/{ticker}

Screen a single stock against all 10 compliance frameworks. Serves a cached result when fresh (stale-while-revalidate) and re-screens otherwise. Statuses are lowercase: compliant, non_compliant, questionable, insufficient_data.

Path Parameters

market*stringMarket slug, e.g. us, uk, japan, malaysia. Use market_key values from List markets.
ticker*stringTicker symbol, e.g. AAPL.

Query Parameters

frameworkstringComma-separated framework ids to return. Response filter only - all 10 are always computed. Unknown ids return 400 listing the valid ids.
as_ofstringYYYY-MM-DD. Returns the point-in-time verdict from compliance history instead of a live screen. Charged 2 units on API keys (endpoint tag screen/history).
force_refreshbooleantrue bypasses the cache and re-screens from source data.

Response

200 OK
{
  "ticker": "AAPL",
  "market": "us",
  "report": {
    "ticker": "AAPL",
    "company_name": "Apple Inc.",
    "catholic_usccb": {
      "status": "compliant",
      "reasons": [/* ... */]
    },
    "christian_bri": {
      "status": "compliant"
    },
    "financial_data": { /* market_cap, ratios, provenance ... */ },
    "frameworks_returned": ["catholic_usccb", "christian_bri"]
  },
  "from_cache": true,
  "cache_age_days": 2,
  "stale": false
}

Framework scoping

Every screen computes all 10 frameworks. The framework query parameter filters the response down to the ids you name - it never changes what is computed or how results are cached.

Partner keys can be provisioned with allowed_frameworks. Such a key gets every response scoped to its grant automatically, and an explicit framework= ask outside the grant returns 403 naming the denied ids.

madhhab_views is derived from the five Shariah methodologies and is only included when at least one shariah_* framework is returned. faithscreener_consensus blends Shariah signal and requires its own grant.

IDFrameworkTradition
shariah_aaoifiAAOIFI Standard 21Islamic
shariah_djimDow Jones Islamic MarketIslamic
shariah_spS&P ShariahIslamic
shariah_ftseFTSE YasaarIslamic
shariah_msciMSCI IslamicIslamic
christian_briBiblically Responsible InvestingChristian
catholic_usccbUSCCB 2021 GuidelinesCatholic
jewish_halakhicHalakhic InvestingJewish
lds_mormonWord of Wisdom (D&C 89)LDS
faithscreener_consensusFaithScreener Consensus ScoreProprietary

Point-in-time (as_of)

Add as_of=YYYY-MM-DD to read the verdict FaithScreener's compliance history holds for that date - 872,000+ snapshots reaching back to 2009. The response is snapshot-shaped (per-framework status plus key ratios) with historical: true.

Available to API keys (endpoint tag screen/history, 2 units per call) and Pro/Enterprise accounts (counts as one screen). Malformed dates, dates before 2009-01-01, and future dates return 400; a date before the ticker's first snapshot returns 404.

Engine eras and data quality

Snapshots taken before 2026-07-04 come from earlier engine revisions with known verdict defects. Every such response carries era: "legacy" plus a data_quality.warning; snapshots from 2026-07-04 onward carry era: "current" and no warning.

This snapshot predates the 2026-07-04 screening-engine revision. Earlier engine versions carried known verdict defects; treat pre-cutoff verdicts as indicative rather than authoritative. Current verdicts and history from 2026-07-04 onward are unaffected.

Response

GET /api/screen/us/AAPL?as_of=2024-06-01 — 200 OK
{
  "ticker": "AAPL",
  "market": "us",
  "as_of": "2024-06-01",
  "snapshot_date": "2024-05-31",
  "screened_at": "2024-05-31T00:00:00",
  "source": "historical_backfill",
  "era": "legacy",
  "data_quality": {
    "warning": "This snapshot predates the 2026-07-04 screening-engine revision. ...",
    "engine_current_since": "2026-07-04"
  },
  "frameworks": {
    "catholic_usccb": { "status": "compliant" },
    "christian_bri": { "status": "compliant" }
  },
  "historical": true
}

Bulk screening

POST/api/screen/batch

Screen multiple (market, ticker) pairs in one request. Up to 100 per call; each ticker charges one unit against your quota.

Request Body

tickers*object[]Array of {market, ticker} objects. Maximum 100 per request; each ticker charges 1 unit.
frameworksstring[]Optional array of framework ids to return (response filter). Omit for all 10.
force_refreshbooleantrue bypasses the cache and re-screens from source data.

Request example

curl -X POST "https://faithscreener.com/api/screen/batch" \
  -H "X-API-Key: fsk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"tickers":[{"market":"us","ticker":"AAPL"},{"market":"uk","ticker":"ULVR"}],"frameworks":["catholic_usccb"]}'

Returns requested / succeeded / failed counts plus results[] (each result carries the same report shape as the single-screen endpoint) and errors[].

ETF screening

POST/api/screen/etf

Screen an ETF/fund by aggregating verdicts across its top holdings. Returns framework_stats (pass/fail/unknown counts per framework) and per-holding verdicts.

Request Body

etf_ticker*stringFund ticker, e.g. SPY.
marketstringMarket slug. Defaults to us.
max_holdingsintegerTop holdings to screen (1-50, default 15).

Request example

curl -X POST "https://faithscreener.com/api/screen/etf" \
  -H "X-API-Key: fsk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"etf_ticker":"SPY","market":"us","max_holdings":15}'

Compare stocks

GET/api/screen/compare

Screen 2-4 tickers in one call and return combined results for side-by-side comparison. Counts as one screen.

Query Parameters

tickers*stringComma-separated tickers, 2 to 4.
marketstringMarket slug. Defaults to us.

Request example

curl "https://faithscreener.com/api/screen/compare?tickers=AAPL,MSFT,GOOG&market=us" \
  -H "X-API-Key: fsk_live_your_key"

List frameworks

GET/api/screen/frameworks

List the 10 canonical framework ids with labels and traditions. Public and never counted against any quota. With a valid X-API-Key header the response also includes key_scope - your key's allowed_frameworks, allowed_markets, and allowed_endpoints.

Response

200 OK
{
  "count": 10,
  "frameworks": [
    { "id": "catholic_usccb", "label": "USCCB 2021 Guidelines", "tradition": "Catholic" },
    { "id": "christian_bri", "label": "Biblically Responsible Investing", "tradition": "Christian" }
    // ... 8 more
  ],
  "key_scope": {
    "allowed_frameworks": ["catholic_usccb", "christian_bri"],
    "allowed_markets": null,
    "allowed_endpoints": ["screen", "screen/history"]
  }
}
GET/api/universe/search

Search the 124,000+ ticker universe by ticker prefix or company name. Public; returns up to 50 matches.

Query Parameters

q*stringSearch query. Matches against ticker symbols and company names.
marketstringFilter results to a specific market. Omit to search all markets.
limitintegerMax results (1-50, default 20).

Response

200 OK
{
  "query": "APP",
  "count": 2,
  "results": [
    { "ticker": "AAPL", "name": "Apple Inc.", "market": "us", "exchange": "NASDAQ" },
    { "ticker": "APP", "name": "AppLovin Corporation", "market": "us", "exchange": "NASDAQ" }
  ]
}

List markets

GET/api/markets

List all supported markets with slugs, names, exchange codes, and live listing counts. Use market_key as the {market} path segment when screening.

Response

200 OK
{
  "count": 46,
  "markets": [
    {
      "slug": "usa-nyse-nasdaq",
      "name": "NYSE & Nasdaq",
      "market_key": "us",
      "total_listed": 8942
    }
    // ... use market_key as the {market} path segment
  ]
}

Partner keys

Partner keys are admin-minted B2B credentials with their own quotas and access control, independent of subscription tiers. They power framework-scoped integrations - for example a Catholic robo-advisor whose key only ever sees catholic_usccb verdicts.

Available scopes: allowed_markets (market slugs), allowed_endpoints (endpoint tags: screen, screen/history, screen/batch, screen/etf, screen/compare), allowed_frameworks (framework ids), plus custom daily limits, rolling 30-day monthly quotas, and per-endpoint cost weights.

Attestations

Mint machine-verifiable, HMAC-SHA256-signed compliance certificates from the current verdict — “as of DATE, TICKER was AAOIFI-compliant, purification Y/share”. Each certificate is stored permanently, addressable at an unguessable URL, and can be independently re-checked at any later date against the immutable snapshot written at mint time. Negative verdicts (questionable, non_compliant) are attestable too — a negative cert is still an audit-grade statement. insufficient_data is not (422).

POST/api/attest/{market}/{ticker}

Mint a signed compliance attestation from the current screening verdict. Costs 5 quota units per certificate (vs 1 per screen). Requires an API key on a paid tier; partner keys need the attest endpoint grant. Minting never triggers a screen: if the ticker has no current screening (404) or it is older than 30 days (409), run GET /api/screen/{market}/{ticker} first, then mint.

Path Parameters

market*stringMarket slug, e.g. us, uk, japan, malaysia. Use market_key values from List markets.
ticker*stringTicker symbol, e.g. AAPL.

Query Parameters

standard*stringOne of the 10 canonical framework ids (see the frameworks table above). Custom frameworks are never attestable.

Request example

curl -X POST "https://faithscreener.com/api/attest/us/AAPL?standard=shariah_aaoifi" \
  -H "X-API-Key: fsk_live_your_key"

Response

200 OK
{
  "cert_id": "fsat_9f2c41d0a3b45e6f7a8b9c0d",
  "payload_version": 1,
  "ticker": "AAPL",
  "market": "us",
  "standard": "shariah_aaoifi",
  "verdict": "compliant",
  "score": null,
  "purification_per_share": 0.0412,
  "as_of": "2026-07-04T18:22:07Z",
  "minted_at": "2026-07-04T18:22:07Z",
  "snapshot_ref": { "source": "runtime", "day": "2026-07-04" },
  "key_id": "2026-07-a",
  "sig": "3f6a...c9",
  "company_name": "Apple Inc.",
  "issuer_type": "api_key",
  "verify_url": "https://faithscreener.com/api/attest/verify/fsat_9f2c41d0a3b45e6f7a8b9c0d",
  "cert_url": "https://faithscreener.com/attest/fsat_9f2c41d0a3b45e6f7a8b9c0d"
}
GET/api/attest/verify/{cert_id}

Public verification — no auth, no quota, never cached. Recomputes the HMAC signature over the stored certificate AND cross-checks the referenced compliance-history snapshot. Rate limited to 60 requests/minute per IP.

Response

200 OK
{
  "cert_id": "fsat_9f2c41d0a3b45e6f7a8b9c0d",
  "status": "valid",
  "valid": true,
  "sig_valid": true,
  "snapshot_check": "match",
  "revoked": false,
  "revoked_at": null,
  "revocation_note": null,
  "checked_at": "2026-07-05T09:00:00Z",
  "attestation": { /* the full public cert incl. sig */ }
}
statusMeaning
validSignature authentic AND the referenced snapshot still matches the certified values.
valid_snapshot_divergedSignature authentic, but the referenced day-snapshot was later superseded (e.g. a same-day re-screen after new filings).
valid_snapshot_missingSignature authentic, but the referenced day-snapshot is no longer present.
invalid_signatureThe stored certificate does not match the signature FaithScreener issued. Treat as invalid.
unknown_signing_keyThe certificate references a signing key that is no longer trusted (rotated out after compromise).
revokedRevoked by FaithScreener with a dated note (bad data discovered post-issuance). Certs are never deleted.

Every certificate also has a print-friendly public page at /attest/{cert_id} (unlisted, never indexed). Partner keys are provisioned for attestation with allowed_endpoints: ["attest"]. Authenticity is proven by the verify endpoint; the audit value comes from the snapshot cross-check against the 872k+ snapshot history — a claim, once issued, can be re-checked years later.

Code examples

Screen Apple (AAPL) and return only the Catholic USCCB and Christian BRI verdicts:

curl "https://faithscreener.com/api/screen/us/AAPL?framework=catholic_usccb,christian_bri" \
  -H "X-API-Key: fsk_live_your_key"

Rate limits

Rate limits are applied per API key on a rolling 24-hour window; partner keys can also carry a rolling 30-day monthly quota.

Quotas are charged in units: a single screen is 1 unit, a batch charges 1 unit per ticker, and a point-in-time (as_of) read is 2 units. There are no X-RateLimit response headers; exceeding a quota returns 429 with details in the body.

PlanDaily LimitBulk Max
Pro1,000100
Team10,000100
Enterprise100,000100
Partnercustom100

The Free tier does not include API access - keys are available from Pro upward. Partner quotas and cost weights are set per contract.

Error codes

All errors return a JSON body with a detail field. Some 403 and 429 responses carry a structured detail object with limits and an upgrade_url.

StatusDescription
400Invalid market, ticker, framework id, or as_of date. The detail message names the valid values.
401Missing or invalid API key.
403Key not provisioned for this market, endpoint, or framework - or the key owner's tier lapsed.
404Ticker not found, no data available, not in cache, or no compliance history at or before as_of.
422Malformed request body or query parameter shape.
429Quota exhausted - key daily limit, partner monthly quota, or account screen window.
500Internal server error. Retry after a moment or contact support.
Example error response
{
  "detail": "This API key is not provisioned for framework(s): shariah_aaoifi."
}

Ready to integrate?

Create an account and get your API key in under a minute.