curl --request GET \
--url https://api.halal.sh/v1/instruments/{symbol}/evidence \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.halal.sh/v1/instruments/{symbol}/evidence"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.halal.sh/v1/instruments/{symbol}/evidence', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.halal.sh/v1/instruments/{symbol}/evidence",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.halal.sh/v1/instruments/{symbol}/evidence"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.halal.sh/v1/instruments/{symbol}/evidence")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.halal.sh/v1/instruments/{symbol}/evidence")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"instrument": {
"symbol": "AI",
"instrument_id": "PAR:AI",
"name": "<string>",
"exchange": "<string>"
},
"as_of": "2023-12-25",
"period": "FY2026",
"currency": "USD",
"methodology": {
"id": "aaoifi-ss21",
"version": "2026.1",
"name": "AAOIFI Shariah Standard No. 21"
},
"determination": {
"status": "compliant",
"confidence": 123,
"reason_codes": [
"all_screens_pass",
"high_data_quality"
],
"purification": {
"required": true,
"percentage": 1.012
}
},
"screens": [
{
"name": "debt_to_market_cap",
"result": "pass",
"structural": {
"criterion": "No lending of deposited metal",
"verdict": "pass",
"evidence": "<string>",
"source": "Base Prospectus",
"note": "<string>"
},
"detail": {
"primary_activities": [
"<string>"
],
"prohibited_activities": [
"<string>"
],
"activity_compliance": "permissible",
"concerns": [
"<string>"
]
},
"metric": {
"value": 123,
"note": "<string>",
"threshold": 123,
"operator": "<=",
"formula": "total_interest_bearing_debt / market_cap",
"numerator": {
"value": 123,
"label": "<string>",
"components": {}
},
"denominator": {
"value": 123,
"label": "Spot Market Cap",
"method": "spot",
"months_used": 123
}
},
"sources": [
{
"filing_type": "10-Q",
"accession_number": "0001045810-26-000052",
"period_end": "2023-12-25",
"filing_date": "2023-12-25",
"xbrl_tags": [
"LongTermDebtNoncurrent",
"LongTermDebtCurrent"
],
"extraction_strategy": "ComponentSum",
"raw_values": {}
}
]
}
],
"confidence_detail": {
"score": 123,
"base_confidence": 123,
"extraction_strategies_used": [
"<string>"
],
"fallbacks_used": [
"<string>"
],
"penalties": [
{
"type": "<string>",
"impact": 123,
"reason": "<string>"
}
],
"boosts": [
{
"type": "<string>",
"impact": 123,
"reason": "<string>"
}
]
},
"stability": {
"quarters_compliant": 123,
"quarters_total": 123,
"flip_rate": 123,
"closest_threshold": {
"screen": "prohibited_revenue",
"current_distance": 0.041,
"trend": "stable"
},
"stability_rating": "stable",
"stability_drivers": [
{
"code": "<string>",
"message": "<string>",
"severity": "info"
}
]
},
"disclosures": [
"<string>"
]
},
"meta": {
"request_id": "req_abc123",
"as_of": "2023-11-07T05:31:56Z",
"methodology": "aaoifi-ss21@2026.1"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or revoked API key."
},
"meta": {
"request_id": "req_abc123"
}
}{
"error": {
"code": "sandbox_restricted",
"message": "Symbol 'COST' is not available in the sandbox. The sandbox includes AAPL, MSFT, NVDA, GOOGL, JPM, GS, META, TSLA, JNJ and AMZN, and the ETFs SPY and HLAL. Full access needs a live key, which the Plus plan includes for $7 a month: https://halal.sh/plans?source=api_refusal. To show results in your own product, you need the Developer plan, at $99 a month: https://halal.sh/developers.",
"upgrade": {
"plan": "plus",
"price_usd_monthly": 7,
"url": "https://halal.sh/plans?source=api_refusal",
"commercial_plan": "developer",
"commercial_price_usd_monthly": 99,
"commercial_url": "https://halal.sh/developers"
}
},
"meta": {
"request_id": "req_abc123"
}
}{
"error": {
"code": "not_found",
"message": "Stock with identifier 'XYZ' not found"
},
"meta": {
"request_id": "req_abc123"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Daily limit of 100 requests reached. It resets at midnight UTC. The Plus plan includes up to 2,000 requests a day on every stock and ETF we cover, for $7 a month: https://halal.sh/plans?source=api_refusal. To show results in your own product, you need the Developer plan, at $99 a month: https://halal.sh/developers.",
"retry_after": 3600,
"upgrade": {
"plan": "plus",
"price_usd_monthly": 7,
"url": "https://halal.sh/plans?source=api_refusal",
"commercial_plan": "developer",
"commercial_price_usd_monthly": 99,
"commercial_url": "https://halal.sh/developers"
}
},
"meta": {
"request_id": "req_abc123"
}
}Get Evidence Packet
Returns a complete compliance audit bundle: the determination, every screen with its calculation, the values it used and its source filing (type, accession number, period), a confidence breakdown, and stability metrics.
Returns 404 while the stock’s analysis is still pending.
curl --request GET \
--url https://api.halal.sh/v1/instruments/{symbol}/evidence \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.halal.sh/v1/instruments/{symbol}/evidence"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.halal.sh/v1/instruments/{symbol}/evidence', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.halal.sh/v1/instruments/{symbol}/evidence",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.halal.sh/v1/instruments/{symbol}/evidence"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.halal.sh/v1/instruments/{symbol}/evidence")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.halal.sh/v1/instruments/{symbol}/evidence")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"instrument": {
"symbol": "AI",
"instrument_id": "PAR:AI",
"name": "<string>",
"exchange": "<string>"
},
"as_of": "2023-12-25",
"period": "FY2026",
"currency": "USD",
"methodology": {
"id": "aaoifi-ss21",
"version": "2026.1",
"name": "AAOIFI Shariah Standard No. 21"
},
"determination": {
"status": "compliant",
"confidence": 123,
"reason_codes": [
"all_screens_pass",
"high_data_quality"
],
"purification": {
"required": true,
"percentage": 1.012
}
},
"screens": [
{
"name": "debt_to_market_cap",
"result": "pass",
"structural": {
"criterion": "No lending of deposited metal",
"verdict": "pass",
"evidence": "<string>",
"source": "Base Prospectus",
"note": "<string>"
},
"detail": {
"primary_activities": [
"<string>"
],
"prohibited_activities": [
"<string>"
],
"activity_compliance": "permissible",
"concerns": [
"<string>"
]
},
"metric": {
"value": 123,
"note": "<string>",
"threshold": 123,
"operator": "<=",
"formula": "total_interest_bearing_debt / market_cap",
"numerator": {
"value": 123,
"label": "<string>",
"components": {}
},
"denominator": {
"value": 123,
"label": "Spot Market Cap",
"method": "spot",
"months_used": 123
}
},
"sources": [
{
"filing_type": "10-Q",
"accession_number": "0001045810-26-000052",
"period_end": "2023-12-25",
"filing_date": "2023-12-25",
"xbrl_tags": [
"LongTermDebtNoncurrent",
"LongTermDebtCurrent"
],
"extraction_strategy": "ComponentSum",
"raw_values": {}
}
]
}
],
"confidence_detail": {
"score": 123,
"base_confidence": 123,
"extraction_strategies_used": [
"<string>"
],
"fallbacks_used": [
"<string>"
],
"penalties": [
{
"type": "<string>",
"impact": 123,
"reason": "<string>"
}
],
"boosts": [
{
"type": "<string>",
"impact": 123,
"reason": "<string>"
}
]
},
"stability": {
"quarters_compliant": 123,
"quarters_total": 123,
"flip_rate": 123,
"closest_threshold": {
"screen": "prohibited_revenue",
"current_distance": 0.041,
"trend": "stable"
},
"stability_rating": "stable",
"stability_drivers": [
{
"code": "<string>",
"message": "<string>",
"severity": "info"
}
]
},
"disclosures": [
"<string>"
]
},
"meta": {
"request_id": "req_abc123",
"as_of": "2023-11-07T05:31:56Z",
"methodology": "aaoifi-ss21@2026.1"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or revoked API key."
},
"meta": {
"request_id": "req_abc123"
}
}{
"error": {
"code": "sandbox_restricted",
"message": "Symbol 'COST' is not available in the sandbox. The sandbox includes AAPL, MSFT, NVDA, GOOGL, JPM, GS, META, TSLA, JNJ and AMZN, and the ETFs SPY and HLAL. Full access needs a live key, which the Plus plan includes for $7 a month: https://halal.sh/plans?source=api_refusal. To show results in your own product, you need the Developer plan, at $99 a month: https://halal.sh/developers.",
"upgrade": {
"plan": "plus",
"price_usd_monthly": 7,
"url": "https://halal.sh/plans?source=api_refusal",
"commercial_plan": "developer",
"commercial_price_usd_monthly": 99,
"commercial_url": "https://halal.sh/developers"
}
},
"meta": {
"request_id": "req_abc123"
}
}{
"error": {
"code": "not_found",
"message": "Stock with identifier 'XYZ' not found"
},
"meta": {
"request_id": "req_abc123"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Daily limit of 100 requests reached. It resets at midnight UTC. The Plus plan includes up to 2,000 requests a day on every stock and ETF we cover, for $7 a month: https://halal.sh/plans?source=api_refusal. To show results in your own product, you need the Developer plan, at $99 a month: https://halal.sh/developers.",
"retry_after": 3600,
"upgrade": {
"plan": "plus",
"price_usd_monthly": 7,
"url": "https://halal.sh/plans?source=api_refusal",
"commercial_plan": "developer",
"commercial_price_usd_monthly": 99,
"commercial_url": "https://halal.sh/developers"
}
},
"meta": {
"request_id": "req_abc123"
}
}Path Parameters
Stock ticker. A US listing is the bare symbol (AAPL, NVDA).
A non-US listing takes a Google-Finance-style exchange prefix:
PAR:AI (Euronext Paris), LON:AZN (London), TYO:7203 (Tokyo),
FRA:AIXA (Frankfurt), AMS:BESI (Amsterdam), MIL:TPRO (Milan),
CPH:VWS (Copenhagen), KRX:005930 (Korea), NSE:RELIANCE (India),
HKG:0669 (Hong Kong), IST:THYAO (Istanbul). The prefix names the listing venue, whatever
the company's domicile: a Cayman-registered company listed in Hong Kong
is HKG:2020. Common alternative spellings of a venue resolve too
(EPA:AI, HKEX:0669, LSE:AZN, NZX:FPH, BME:AMS, NASDAQ:AAPL),
and a Hong Kong code answers to any zero-padding (HKG:992, HKG:0992).
A Yahoo-style vendor suffix (AI.PA) is not an identifier here and
resolves to nothing; the error names the prefixed form to use instead.
Every instrument and search response carries instrument_id, the exact
string to send here.
A dotted share class is written with a dash or a dot (BRK-B, BRK.B);
both resolve.
1 - 20"PAR:AI"

