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_keyManage your API keys at /account/api-keys. Keys start with fsk_live_ and are tied to your subscription tier.
Screen a single stock
/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* | string | Market slug, e.g. us, uk, japan, malaysia. Use market_key values from List markets. |
| ticker* | string | Ticker symbol, e.g. AAPL. |
Query Parameters
| framework | string | Comma-separated framework ids to return. Response filter only - all 10 are always computed. Unknown ids return 400 listing the valid ids. |
| as_of | string | YYYY-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_refresh | boolean | true bypasses the cache and re-screens from source data. |
Response
{
"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.
| ID | Framework | Tradition |
|---|---|---|
| shariah_aaoifi | AAOIFI Standard 21 | Islamic |
| shariah_djim | Dow Jones Islamic Market | Islamic |
| shariah_sp | S&P Shariah | Islamic |
| shariah_ftse | FTSE Yasaar | Islamic |
| shariah_msci | MSCI Islamic | Islamic |
| christian_bri | Biblically Responsible Investing | Christian |
| catholic_usccb | USCCB 2021 Guidelines | Catholic |
| jewish_halakhic | Halakhic Investing | Jewish |
| lds_mormon | Word of Wisdom (D&C 89) | LDS |
| faithscreener_consensus | FaithScreener Consensus Score | Proprietary |
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
{
"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
/api/screen/batchScreen 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. |
| frameworks | string[] | Optional array of framework ids to return (response filter). Omit for all 10. |
| force_refresh | boolean | true 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
/api/screen/etfScreen 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* | string | Fund ticker, e.g. SPY. |
| market | string | Market slug. Defaults to us. |
| max_holdings | integer | Top 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
/api/screen/compareScreen 2-4 tickers in one call and return combined results for side-by-side comparison. Counts as one screen.
Query Parameters
| tickers* | string | Comma-separated tickers, 2 to 4. |
| market | string | Market 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
/api/screen/frameworksList 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
{
"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"]
}
}Search companies
/api/universe/searchSearch the 124,000+ ticker universe by ticker prefix or company name. Public; returns up to 50 matches.
Query Parameters
| q* | string | Search query. Matches against ticker symbols and company names. |
| market | string | Filter results to a specific market. Omit to search all markets. |
| limit | integer | Max results (1-50, default 20). |
Response
{
"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
/api/marketsList all supported markets with slugs, names, exchange codes, and live listing counts. Use market_key as the {market} path segment when screening.
Response
{
"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).
/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* | string | Market slug, e.g. us, uk, japan, malaysia. Use market_key values from List markets. |
| ticker* | string | Ticker symbol, e.g. AAPL. |
Query Parameters
| standard* | string | One 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
{
"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"
}/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
{
"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 */ }
}| status | Meaning |
|---|---|
| valid | Signature authentic AND the referenced snapshot still matches the certified values. |
| valid_snapshot_diverged | Signature authentic, but the referenced day-snapshot was later superseded (e.g. a same-day re-screen after new filings). |
| valid_snapshot_missing | Signature authentic, but the referenced day-snapshot is no longer present. |
| invalid_signature | The stored certificate does not match the signature FaithScreener issued. Treat as invalid. |
| unknown_signing_key | The certificate references a signing key that is no longer trusted (rotated out after compromise). |
| revoked | Revoked 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.
| Plan | Daily Limit | Bulk Max |
|---|---|---|
| Pro | 1,000 | 100 |
| Team | 10,000 | 100 |
| Enterprise | 100,000 | 100 |
| Partner | custom | 100 |
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.
| Status | Description |
|---|---|
| 400 | Invalid market, ticker, framework id, or as_of date. The detail message names the valid values. |
| 401 | Missing or invalid API key. |
| 403 | Key not provisioned for this market, endpoint, or framework - or the key owner's tier lapsed. |
| 404 | Ticker not found, no data available, not in cache, or no compliance history at or before as_of. |
| 422 | Malformed request body or query parameter shape. |
| 429 | Quota exhausted - key daily limit, partner monthly quota, or account screen window. |
| 500 | Internal server error. Retry after a moment or contact support. |
{
"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.