Skip to main content
POST
/
v1
/
signals
Generate AI strategy signal
curl --request POST \
  --url https://api.rekko.ai/v1/signals \
  --header 'Content-Type: application/json' \
  --data '
{
  "force": false,
  "market_id": "KXFED-26MAR19",
  "market_query": "",
  "platform": "kalshi"
}
'
import requests

url = "https://api.rekko.ai/v1/signals"

payload = {
"force": False,
"market_id": "KXFED-26MAR19",
"market_query": "",
"platform": "kalshi"
}
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({force: false, market_id: 'KXFED-26MAR19', market_query: '', platform: 'kalshi'})
};

fetch('https://api.rekko.ai/v1/signals', 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.rekko.ai/v1/signals",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'force' => false,
'market_id' => 'KXFED-26MAR19',
'market_query' => '',
'platform' => 'kalshi'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.rekko.ai/v1/signals"

payload := strings.NewReader("{\n \"force\": false,\n \"market_id\": \"KXFED-26MAR19\",\n \"market_query\": \"\",\n \"platform\": \"kalshi\"\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.rekko.ai/v1/signals")
.header("Content-Type", "application/json")
.body("{\n \"force\": false,\n \"market_id\": \"KXFED-26MAR19\",\n \"market_query\": \"\",\n \"platform\": \"kalshi\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.rekko.ai/v1/signals")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"force\": false,\n \"market_id\": \"KXFED-26MAR19\",\n \"market_query\": \"\",\n \"platform\": \"kalshi\"\n}"

response = http.request(request)
puts response.read_body
{
  "confidence": 0.82,
  "edge": 0.09,
  "expires_at": "2026-03-22T14:30:00Z",
  "generated_at": "2026-03-21T14:30:00Z",
  "market_id": "KXFED-26MAR19",
  "platform": "kalshi",
  "recommendation": "BUY_YES",
  "risk_rating": "low",
  "size_pct": 0.035,
  "target_price": 0.62,
  "time_horizon": "days",
  "title": "Will the Fed cut rates at the March 2026 meeting?"
}
{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}

Query Parameters

wait
boolean
default:false

Block until analysis completes (up to 5 min)

expand
string
default:""

Comma-separated expansions

Body

application/json

Request body for the signal endpoint.

platform
string
default:""

Filter by platform: 'kalshi', 'polymarket', or 'robinhood'

market_id
string
default:""

Platform-specific market identifier

market_query
string
default:""

Free-text market question (used if market_id not provided)

force
boolean
default:false

Force fresh analysis even if a cached result exists

Response

Successful Response

Actionable trading signal with position sizing.

The core product — everything needed to execute a trade.

platform
string
required

kalshi, polymarket, robinhood, or coinbase

market_id
string
required

Platform-specific market identifier

title
string
required

Market question

recommendation
enum<string>
required

Actionable recommendation

Available options:
BUY_YES,
BUY_NO,
NO_TRADE
target_price
number
required

Suggested entry price (0.0-1.0)

Required range: 0 <= x <= 1
edge
number
required

estimated_prob - market_price (positive = underpriced YES)

confidence
number
required

Confidence in the signal

Required range: 0 <= x <= 1
risk_rating
enum<string>
required

Overall risk assessment

Available options:
low,
medium,
high
size_pct
number
required

Kelly-derived position size as fraction of bankroll

Required range: 0 <= x <= 1
time_horizon
string
required

Expected resolution: 'hours', 'days', 'weeks'

expires_at
string<date-time>
required

Signal staleness window — do not trade after this time

hedge
string | null

Suggested hedge, e.g. 'Buy NO on KXFED-26MAR19 at 0.82'

causal
CausalDecomposition · object | null

Causal decomposition (?expand=causal)

Example:
{
"factors": [
{
"claim": "Inflation is within Fed's comfort zone",
"confidence": 0.9,
"direction": "supports_yes",
"evidence": [
"PCE Feb 2026: 2.1%",
"Core CPI declining 3 months"
],
"posterior": 0.82,
"prior": 0.6,
"weight": 0.35
},
{
"claim": "Fed rhetoric is dovish",
"confidence": 0.75,
"direction": "supports_yes",
"evidence": [
"Waller speech March 12",
"Bostic: 'open to adjustment'"
],
"posterior": 0.68,
"prior": 0.5,
"weight": 0.3
},
{
"claim": "Tariff uncertainty creates headwinds",
"confidence": 0.6,
"direction": "supports_no",
"evidence": [
"New tariffs announced March 5",
"Trade deficit widening"
],
"posterior": 0.45,
"prior": 0.4,
"weight": 0.2
}
],
"generated_at": "2026-03-21T12:00:00Z",
"method": "weighted_bayesian",
"overall_confidence": 0.82,
"overall_probability": 0.71
}
freshness
enum<string> | null

Data freshness of the underlying analysis

Available options:
fresh,
stale,
expired
generated_at
string<date-time>

When this signal was produced