API reference
Trading intelligence
Generate trading cards: a symbol, a direction, price levels, recent news and indicators.
Generate trading cards
/api/v1/trading/cardsReturns up to `count` trading cards. Each card has a symbol, a BUY or SELL recommendation, a confidence score, price levels, up to three news items and technical indicators. Cards come from the same generator as the Terminal stock deck, without your portfolio as context.
Known issue
Requests that pass the API-key checks currently fail with 401. This endpoint forwards to an internal route that expects a signed-in session, and the forwarded request does not carry one. The failed call still counts against your rate limit and monthly quota. This page will say so when it is fixed.
Request
JSON body
| Field | Description |
|---|---|
countinteger | Most cards to return, 1 to 20. Fewer may come back; see the notes.default 10 · 1 to 20 |
riskTolerancestring | Validated and echoed in metadata.riskTolerance. The generator does not currently read it.one of "low", "medium", "high" · default "medium" |
buyingPowernumber | Capital available, 0 to 10,000,000. Validated, then forwarded; the generator does not currently read it.0 to 10000000 |
excludeSectorsarray of string | Forwarded; the generator does not currently read it.default [] |
preferredSectorsarray of string | Forwarded; the generator does not currently read it.default [] |
Response
200 The cards and request metadata.
| Field | Description |
|---|---|
cardsarray of object | Zero or more cards. |
cards[].symbolstring | Ticker. |
cards[].companyNamestring | Company name. |
cards[].recommendationstring | "BUY" or "SELL". "HOLD" only when the generator returned no direction. |
cards[].confidencenumber | A 0 to 1 signal score from the technical inputs on the card. It is not a calibrated probability and has no floor: values below 0.4 are normal and mean the setup is weak. 0.5 when the generator returned none. Do not size positions from it. |
cards[].currentPricenumber | Last price. |
cards[].targetPricenumber | Suggested target. |
cards[].stopLossnumber | Suggested stop. |
cards[].takeProfitnumber | Suggested take-profit. |
cards[].priceChangenumber | Change on the day. |
cards[].priceChangePercentnumber | Change on the day, in percent. |
cards[].analysisstring | The written reasoning for the card. |
cards[].sentimentstring | News sentiment, when available. |
cards[].newsarray of object | Up to three recent items. |
cards[].news[].titlestring | Headline. |
cards[].news[].summarystring | Summary, when the source provides one. |
cards[].news[].sourcestring | Publisher or data provider. |
cards[].news[].publishedAtstring | Publication time as the provider reports it. |
cards[].news[].urlstring | Link to the article.uri |
cards[].technicalIndicatorsobject | Indicators the card was built from, such as rsi, macd, movingAverage50, movingAverage200 and volume. |
cards[].cardTypestring | Card kind. "standard" unless the generator says otherwise. |
cards[].generatedAtstring | When the card was built.date-time |
metadataobject | Request metadata. |
metadata.totalCardsinteger | Number of cards returned. |
metadata.responseTimeinteger | Milliseconds this request took, measured by the API. |
metadata.cacheHitboolean | Whether the generator served the deck from cache. |
metadata.providersUsedarray of string | Data providers the generator reported. |
metadata.riskTolerancestring | The value you sent. |
metadata.environmentstring | The key's environment.one of "live", "test" |
{
"cards": [
{
"symbol": "AAPL",
"companyName": "Apple Inc.",
"recommendation": "BUY",
"confidence": 0.62,
"currentPrice": 175.43,
"targetPrice": 184.2,
"stopLoss": 171.1,
"takeProfit": 184.2,
"analysis": "...",
"news": [
{
"title": "...",
"source": "...",
"publishedAt": "...",
"url": "https://example.com/article"
}
],
"technicalIndicators": {
"rsi": 58.1
},
"cardType": "standard",
"generatedAt": "2026-10-23T14:02:11.093Z"
}
],
"metadata": {
"totalCards": 1,
"responseTime": 3120,
"cacheHit": false,
"providersUsed": [],
"riskTolerance": "medium",
"environment": "live"
}
}Errors
| Status | When | error |
|---|---|---|
| 403 | The key has neither "trading:cards" nor "*". | Insufficient permissions. Required scope: trading:cards |
| 400 | count is outside 1 to 20. | Invalid count. Must be between 1 and 20 |
| 400 | riskTolerance is another value. | Invalid riskTolerance. Must be "low", "medium", or "high" |
| 400 | buyingPower is outside the range. | Invalid buyingPower. Must be between 0 and 10,000,000 |
| 500 | The generator failed, or the body was not valid JSON. | Failed to generate trading cards. Please try again. |
Errors use the standard error body. Any request can also get the authentication errors (401) and the rate-limit error (429).
Examples
curl -X POST "https://enton.ai/api/v1/trading/cards" \
-H "Authorization: Bearer $ENTON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"count": 5,
"riskTolerance": "medium",
"buyingPower": 10000
}'Notes
- count is an upper bound. Symbols with no actionable setup are left out rather than returned with empty levels, so a response can hold fewer cards than you asked for, occasionally none. An empty cards array is a valid response.
- Fields a provider did not supply are left out, never zero-filled. Treat a missing field as unknown. The exceptions are recommendation and confidence, which have the defaults described above.
- Cards are analysis, not advice, and they are not orders. To trade, use trade execution.