The ClaudeWar Prediction Markets API is a read-only feed for approved prediction-market terminals and research platforms. It returns ClaudeWar Signals that are active, unresolved, causally validated, and admitted through publication gates that require measurable forecast edge.
The API provides finished Signals, not the ClaudeWar curation engine. Research Watchlist entries, rejected candidates, raw wallet access, order routing, and custody are outside this product.
Base URL: https://markets.claudewar.info
Method and path: GET /api/v1/signals
Use this endpoint from your backend. The service does not publish browser CORS permission for credentialed cross-origin calls.
Send the issued key in either supported header:
Authorization: Bearer YOUR_API_KEY
or
x-api-key: YOUR_API_KEY
x-api-key takes precedence. Query-string keys are not supported.| Parameter | Required | Accepted values | Behavior |
|---|---|---|---|
source | No | all, polymarket, kalshi | Defaults to all. Values are lowercase and case-sensitive. |
GET /api/v1/signals
GET /api/v1/signals?source=all
GET /api/v1/signals?source=polymarket
GET /api/v1/signals?source=kalshi
There is no pagination, cursor, offset, or published global sort. With source=all, the response contains the Polymarket list followed by the Kalshi list. Each source is deduplicated by normalized question and ranked by volume with recency as the tie-breaker.
Poll the feed and replace your local active-signal snapshot after each successful response. Do not permanently merge old rows into the current feed.
A market absent from a later successful response may have resolved, expired, become inactive, failed a publication or causal gate, been classified as irrelevant, or become unavailable for live quoting.
A returned row may carry live_price_stale=true. Staleness is explicit response metadata and does not by itself guarantee that the row is removed.
200 response.curl "https://markets.claudewar.info/api/v1/signals?source=all" \
-H "Authorization: Bearer $CWM_PREDICTION_API_KEY"
The sanitized response below is representative. Optional fields can be omitted, and nullable fields may contain null.
{
"data": [
{
"question": "Will the specified event occur by the market deadline?",
"slug": "sanitized-market",
"source": "polymarket",
"kalshi_ticker": null,
"polymarket_url": "https://polymarket.com/event/sanitized-market",
"yes_price": 0.54,
"no_price": 0.46,
"volume_24h": 125000,
"end_date": "2026-09-01T00:00:00.000Z",
"claudewar_signal_reason": "Current evidence supports the directional call.",
"cw_call": "YES",
"cw_confidence": "MEDIUM",
"cw_reasoning": "Sanitized causal rationale.",
"forecast_probability": 0.61,
"market_probability": 0.54,
"forecast_edge": 0.07,
"causal_validation_status": "PASSED",
"causal_validation_reason": "passed",
"eligibility_status": "SIGNAL",
"active": true,
"live_yes_price": 0.54,
"live_no_price": 0.46,
"live_price_updated_at": "2026-08-04T21:20:00.000Z",
"live_price_age_ms": 45000,
"live_price_stale": false,
"live_price_source": "gamma",
"evidence_refs": [
{
"evidence_id": "ev_sanitized",
"excerpt": "Sanitized evidence excerpt.",
"source_system": "claudewar",
"event_type": "current_event",
"event_time": "2026-08-04T20:45:00.000Z",
"region": "sanitized",
"role": "direct",
"reliability": "high",
"limited_coverage": false
}
],
"forecast_version_id": "sfv_sanitized",
"revision_history": []
}
],
"meta": {
"product": "signals_only",
"source": "all",
"count": 1,
"generated_at": "2026-08-04T21:20:45.000Z"
}
}
| Field | Type | Meaning |
|---|---|---|
data | Signal[] | Current validated Signals. The array may be empty. |
meta.product | signals_only | Literal product scope. |
meta.source | string | Normalized accepted source filter. |
meta.count | number | Number of rows in data. |
meta.generated_at | ISO-8601 string | UTC response-generation time. |
| Field | Type | Meaning |
|---|---|---|
question | string | Display title with markdown removed. |
slug | string | Registry or venue identifier. |
source | polymarket or kalshi | Normalized venue. |
kalshi_ticker | string or null | Native Kalshi ticker. Null for Polymarket. |
polymarket_url | string | Market URL. For Kalshi rows this field contains the generated Kalshi market URL despite its legacy name. |
category, intel_category, image_url | string, optional | Venue category, ClaudeWar classification, and image URL when available. |
yes_price, no_price | number | Stored YES and NO probabilities from 0 to 1. |
volume_24h | number | Venue ranking metric. Do not treat it as a uniform USD measure across venues. |
end_date | string | Market deadline or expiry, normally ISO-8601. |
market_type | string | Typically binary; producers may also use multiple_choice or scalar. |
outcome_options | array or null | Option labels and 0-to-1 prices for multi-option markets. |
resolved_option, resolved_outcome | string or null | Null in this unresolved-only feed. |
| Field | Type | Meaning |
|---|---|---|
claudewar_signal_reason | string | Short public signal rationale. |
cw_call | string or null | Directional call, normally YES or NO. Consumers should tolerate additional stored values. |
cw_confidence | string or null | Expected HIGH, MEDIUM, or LOW label. |
cw_reasoning | string or null | Detailed causal rationale with markdown removed. |
forecast_probability | number or null | ClaudeWar calibrated probability from 0 to 1. |
market_probability | number | Issue-time venue probability from 0 to 1. |
forecast_edge | number or null | forecast_probability - market_probability. A value of 0.07 is 7 percentage points. |
eligibility_status | string | SIGNAL for selected rows. |
eligibility_reason | string or null | Lifecycle or publication reason. |
causal_validation_status | string | PASSED for selected rows. |
causal_validation_reason | string or null | Validator result context. |
active | boolean | true for selected rows. |
ai_curated | boolean | Whether the registry row was AI-curated. |
| Field | Type | Meaning |
|---|---|---|
entry_yes_price, entry_no_price | number or null | Issue-time YES and NO prices. |
issue_yes_price, issue_no_price | number or null | Aliases of registry entry prices. |
live_yes_price, live_no_price | number or null | Current prices when a live quote timestamp exists. |
live_price_updated_at | ISO-8601 string or null | Last successful quote refresh. |
live_price_age_ms | number or null | Quote age in milliseconds at response time. |
live_price_stale | boolean | True when no timestamp exists or quote age exceeds five minutes. |
live_price_source | string or null | Typically gamma, kalshi, or settlement. |
yes_mint, no_mint | string or null | Optional market identifiers; currently null for registry rows. |
revised_at | ISO-8601 string or null | Most recent signal-call revision time. |
revision_history | array | Revision entries with at, old_call, new_call, and reason. |
evidence_refs | array | Up to five validated evidence references. |
curation_snapshot_id, curation_run_id | string or null | Snapshot and run lineage identifiers. |
curation_provider, curation_model | string or null | Curation provenance when available. |
curation_prompt_hash, curation_prompt_version | string or null | Prompt lineage identifiers, not prompt contents. |
last_curated_at | ISO-8601 string or null | Latest curation timestamp. |
forecast_version_id | string or null | Current forecast revision identifier. |
Each evidence object may include evidence_id, excerpt, source_system, event_type, event_time, region, role, reliability, and limited_coverage. Consumers should tolerate optional fields and additional future fields.
The endpoint does not return generic signal created_at or updated_at fields, forecast issuance time, resolution time, or settlement time.
| Status | Body | Client action |
|---|---|---|
| 400 | {"error":"invalid_source"} | Use an accepted lowercase source value. |
| 401 | {"error":"api_key_required"} | Send an issued key in a supported header. |
| 401 | {"error":"invalid_api_key"} | Check whether the key is invalid, expired, rotated, or revoked. |
| 429 | {"error":"rate_limit_exceeded"} | Wait for the integer seconds in Retry-After. |
| 503 | {"error":"partner_signals_api_not_configured"} | The key service has no usable keys. Contact ClaudeWar support. |
| 503 | {"error":"partner_signals_auth_unavailable"} | Retry with bounded exponential backoff. |
| Other 5xx | Not a stable contract | Keep the last good snapshot and retry with bounded exponential backoff. |
Retry-After; successful responses do not publish remaining or reset headersUse a conservative polling interval, cache the successful snapshot in your backend, and apply bounded retry behavior.
Consumers remain responsible for their own product disclosures, venue terms, jurisdictional requirements, and decisions about how Signals are presented.