curl --request GET \
--url 'https://api.edgeful.com/discovery/scan/<market_type>/<ticker>' \
--header 'Authorization: Bearer <api-key>'import requests
url = "https://api.edgeful.com/discovery/scan/<market_type>/<ticker>"
headers = {"Authorization": "Bearer <api-key>"}
response = requests.get(url, headers=headers)
print(response.json())const url = "https://api.edgeful.com/discovery/scan/<market_type>/<ticker>";
const options = {
method: "GET",
headers: { Authorization: "Bearer <api-key>" },
};
const response = await fetch(url, options);
const data = await response.json();
console.log(data);<?php
$ch = curl_init("https://api.edgeful.com/discovery/scan/<market_type>/<ticker>");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer <api-key>"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://api.edgeful.com/discovery/scan/<market_type>/<ticker>", nil)
req.Header.Set("Authorization", "Bearer <api-key>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.edgeful.com/discovery/scan/<market_type>/<ticker>"))
.header("Authorization", "Bearer <api-key>")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());require "net/http"
require "uri"
uri = URI("https://api.edgeful.com/discovery/scan/<market_type>/<ticker>")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer <api-key>"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
http.request(request)
end
puts response.body{
"market": "<string>",
"ticker": "<string>",
"session": "<string>",
"lookback": "<string>",
"minimum_score": 123,
"generated_at": "<string>",
"cached": true,
"coverage": {
"total_outcomes": 123,
"enabled_outcomes": 123,
"catalog_version": "<string>"
},
"rows": [
{
"outcome_id": "<string>",
"family": "<string>",
"family_label": "<string>",
"subreport": "<string>",
"subreport_label": "<string>",
"outcome_label": "<string>",
"description": "<string>",
"denominator": "<string>",
"success_definition": "<string>",
"lookback": "<string>",
"score": 123,
"hit_rate": 123,
"sample_size": 123,
"score_components": {
"edge": 123,
"trend_bonus": 123,
"sample_penalty": 123,
"peak_penalty": 123,
"position": 123,
"range_width": 123
},
"activity": {
"recent_successes": 123,
"recent_sample_size": 123,
"score_30d_ago": 123,
"score_delta_30d": 123
},
"drill_through": {
"href": "<string>",
"report_slug": "<string>",
"report_variant": "<string>",
"params": {}
},
"customizations": [
{
"label": "<string>",
"default_value": "<string>"
}
]
}
],
"status": "ready",
"data_through": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}discovery scan
scores every report outcome for a ticker on a 0-100 scale and ranks them best first — the data behind edgeful’s discovery page. each row carries its score, its raw historical hit rate, sample size, labels, recent activity and trend, and a drill-through href to the underlying report. warm targets return from a precomputed cache; a cold ticker is computed on demand, which can take a few minutes on the first request.
curl --request GET \
--url 'https://api.edgeful.com/discovery/scan/<market_type>/<ticker>' \
--header 'Authorization: Bearer <api-key>'import requests
url = "https://api.edgeful.com/discovery/scan/<market_type>/<ticker>"
headers = {"Authorization": "Bearer <api-key>"}
response = requests.get(url, headers=headers)
print(response.json())const url = "https://api.edgeful.com/discovery/scan/<market_type>/<ticker>";
const options = {
method: "GET",
headers: { Authorization: "Bearer <api-key>" },
};
const response = await fetch(url, options);
const data = await response.json();
console.log(data);<?php
$ch = curl_init("https://api.edgeful.com/discovery/scan/<market_type>/<ticker>");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer <api-key>"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://api.edgeful.com/discovery/scan/<market_type>/<ticker>", nil)
req.Header.Set("Authorization", "Bearer <api-key>")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.edgeful.com/discovery/scan/<market_type>/<ticker>"))
.header("Authorization", "Bearer <api-key>")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());require "net/http"
require "uri"
uri = URI("https://api.edgeful.com/discovery/scan/<market_type>/<ticker>")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer <api-key>"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
http.request(request)
end
puts response.body{
"market": "<string>",
"ticker": "<string>",
"session": "<string>",
"lookback": "<string>",
"minimum_score": 123,
"generated_at": "<string>",
"cached": true,
"coverage": {
"total_outcomes": 123,
"enabled_outcomes": 123,
"catalog_version": "<string>"
},
"rows": [
{
"outcome_id": "<string>",
"family": "<string>",
"family_label": "<string>",
"subreport": "<string>",
"subreport_label": "<string>",
"outcome_label": "<string>",
"description": "<string>",
"denominator": "<string>",
"success_definition": "<string>",
"lookback": "<string>",
"score": 123,
"hit_rate": 123,
"sample_size": 123,
"score_components": {
"edge": 123,
"trend_bonus": 123,
"sample_penalty": 123,
"peak_penalty": 123,
"position": 123,
"range_width": 123
},
"activity": {
"recent_successes": 123,
"recent_sample_size": 123,
"score_30d_ago": 123,
"score_delta_30d": 123
},
"drill_through": {
"href": "<string>",
"report_slug": "<string>",
"report_variant": "<string>",
"params": {}
},
"customizations": [
{
"label": "<string>",
"default_value": "<string>"
}
]
}
],
"status": "ready",
"data_through": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Use your Edgeful API key as the bearer token. In the API Reference authorization drawer, paste only the key (for example, ef_live_<random>).
Path Parameters
ticker symbol. format varies by market_type: stocks use a plain symbol (e.g., SPY), forex uses a 6-character pair (e.g., EURUSD), crypto uses a contract pair (e.g., BTCUSD), futures uses the root symbol (e.g., ES).
"SPY"
"EURUSD"
"BTCUSD"
"ES"
market venue for the ticker. one of: forex, futures, crypto, stock. determines supported symbols and whether session-based intraday aggregation is available.
forex, futures, crypto, stock "stock"
"forex"
Query Parameters
preset session id (or shared id) to scan; defaults to new_york.
optional custom session start time, HH:MM:SS, in the requested timezone; provide together with end_time and timezone.
optional custom session end time, HH:MM:SS, in the requested timezone; provide together with start_time and timezone.
optional IANA timezone used to aggregate a custom session window.
scoring window for the ranking: 1mo, 3mo, 6mo, or 1y; defaults to 6mo.
1mo, 3mo, 6mo, 1y only include reports scoring at least this value (0-100); defaults to 50, lower to 0 to see every scored report.
0 <= x <= 100Response
Successful Response
Show child attributes
Show child attributes
Show child attributes
Show child attributes
"ready"Was this page helpful?