# ANNIE Signal API The public endpoint overview is at [/home/api-docs](/home/api-docs). The page links directly to this Markdown guide. Use the ANNIE Signal API to retrieve daily buy signals, check signals for your chosen tickers, and follow the completed buys and sells in ANNIE's Trade-Along portfolio. You can also register a webhook to receive a notification when Trade-Along results are ready. **Base URL:** `https://www.annietrades.com` | Method | Endpoint | Returns | | --- | --- | --- | | GET | `/api/signals/buys` | Up to 20 daily Buy signals | | POST | `/api/signals/sells` | Current signals for up to 100 requested tickers, or your current portfolio when tickers are omitted | | GET | `/api/trade_along` | Today's completed buy and sell ticker lists for the Trade-Along portfolio | | POST | `/api/portfolio/buy` | Record one or more bought tickers in your portfolio | | POST | `/api/portfolio/sell` | Record one or more sold tickers, removing them from active holdings | ## ANNIE API vs. Automatic Brokerage Trading This API provides signals for your own application or trading workflow. It does not connect to your brokerage account or place orders for you. It is not a turnkey service where you provide an account number and ANNIE trades for you; you are responsible for your integration and order execution. For automatic trading, sign up at [Collective2.com](https://collective2.com/) and set up AutoTrading with a supported brokerage account. You can [view ANNIE on Collective2](https://collective2.com/details/153023696) to get started. ## User agreement reminder You may use this API only for your own accounts. You may not use it to trade other people's accounts. Every API user must have an active subscription to ANNIE. ## Getting started Your account must be active and have API access enabled. On the dashboard, go to **Account > Signal API** and select **Create API Key**. If this section is unavailable, contact ANNIE about API access. Create and rotate keys on this page; key management is not available through the API. Copy the key when it appears; it is shown only once. Keep it private. If you lose it, select **Rotate API Key** on the same page. Rotation immediately invalidates the previous key, so update your application with the replacement. Include your key in the Authorization header of every API request: ```http Authorization: Bearer your_annie_api_key_here Accept: application/json ``` ## Timing and limits On regular trading days, ANNIE's daily evaluation normally starts around **3 p.m. Eastern** and takes about two to three minutes. If scheduling a daily fetch, allow until about **3:04 p.m. Eastern**. Completion times can vary; register a webhook to be notified when Trade-Along results are ready. Each signal-reading endpoint (`/api/signals/buys`, `/api/signals/sells`, and `/api/trade_along`) allows **one successful request per minute per API key**. The endpoints have separate limits, so a Trade-Along request does not use your Buy or Sell request allowance. Successful empty responses and partial Sell responses also count toward the one-minute limit. The Sell signal endpoint allows **100 distinct tickers per API key per Eastern calendar day**, resetting at midnight Eastern. Repeating a ticker already requested that day does not use additional allowance. Trade-Along requests do not use this ticker allowance. Buy signals remain limited to the top **20**. Contact ANNIE to request access beyond the standard limits; clients cannot raise them using request parameters. Portfolio buy/sell recording has no one-minute throttle or daily ticker quota. It does not consume your signal-reading allowance. ANNIE records API activity, including request times, IP addresses, and outcomes. API activity records do not include your full API key or request/response bodies. Using a key from more than two distinct IP addresses in one day triggers an email warning. Requests are not blocked solely because the IP address changes, and additional addresses do not trigger another warning that day. ## Using signals with your own portfolio The Trade-Along portfolio shows what ANNIE traded today and is useful as a reference. Although the Trade-Along endpoint exposes these trades, copying them alone does not provide a reliable way to establish or maintain a separate portfolio. The first problem occurs at startup. To begin with an exact copy of ANNIE’s portfolio, you would have to purchase every stock she already owns. Some of those positions may have been opened several days earlier and may have already risen substantially. A stock that was attractive when ANNIE bought it may no longer be one of her best available purchases today. A better starting point is to use the current signals and select the top x buy signals for that day. This creates a portfolio from stocks ANNIE currently considers worth buying rather than from positions she entered under earlier market conditions. The second problem is synchronization. A trade may fail because of price movement, insufficient buying power, broker restrictions, a missed signal, or an unfilled order. Once that happens, your holdings no longer match ANNIE’s holdings. Continuing to copy her Trade-Along activity can then produce trades that do not make sense for your portfolio. The more reliable approach is to apply ANNIE’s signals to your own current holdings: 1. Sell stocks you currently hold that have a sell signal today. 2. Review the day’s buy signals from top to bottom. 3. Add positions until your portfolio reaches the number of holdings you have chosen to maintain. ANNIE maintains 10 equally weighted positions. That describes how ANNIE manages her own portfolio. It is not a recommendation for how API users should size or allocate their positions. ## Trade-Along portfolio Retrieve today's completed buys and sells for ANNIE's Trade-Along portfolio: ```http GET /api/trade_along Authorization: Bearer your_annie_api_key_here Accept: application/json ``` Example response: ```json { "trades completed at": "2026-09-08T15:02:00-04:00", "buys": ["AAPL", "MSFT"], "sells": ["NVDA"] } ``` The lists contain unique ticker symbols in alphabetical order for the current Eastern calendar day. `trades completed at` is the time ANNIE finished calculating the Trade-Along portfolio's trades. It uses ISO 8601 in Eastern time, including seconds and the daylight-saving offset: `-04:00` in summer or `-05:00` in winter. Before today's results are ready, both lists are empty. The timestamp may show the most recent completed calculation or be `null` if no completion is currently available. During a recalculation, it may temporarily return to `null`. Check that the timestamp is dated today before treating the lists as today's completed results. Use the webhook to know when the calculations are ready for the day. A completed day with no trades returns today's completion timestamp and empty lists: ```json { "trades completed at": "2026-09-08T15:02:00-04:00", "buys": [], "sells": [] } ``` ## Buy signals Retrieve 20 of the day's strongest Buy signals: ```http GET /api/signals/buys Authorization: Bearer your_annie_api_key_here Accept: application/json ``` Example response with one available signal: ```json { "date": "2026-09-08", "count": 1, "signals": [ { "ticker": "AAPL", "signal": "Buy", "confidence": 0.99, "quote_time": "2026-09-08T15:00:10-04:00", "signal_time": "2026-09-08T15:02:35-04:00" } ] } ``` If a returned stock is already held in your portfolio and its stop is triggered, its `signal` is `"Stop"`, overriding the Buy recommendation. The top-20 selection and ranking still use the model's Buy recommendations. `count` is the number of returned signals. `quote_time` identifies the quote's time, and `signal_time` is when ANNIE generated the signal. Both use Eastern ISO 8601 timestamps and may be `null` when unavailable. Positive Buy `confidence` ranges from `0.01` to `0.99` and is used to order the buys from strongest to weakest. ## Signals for your tickers Use the Sell endpoint to check specific tickers. A requested ticker can return `Stop`, `Sell`, `Buy`, `Hold`, or `No Signal`: ```http POST /api/signals/sells Authorization: Bearer your_annie_api_key_here Content-Type: application/json Accept: application/json { "tickers": ["AAPL", "MSFT", "NVDA"] } ``` Example response: ```json { "date": "2026-09-08", "count": 3, "remaining_sell_tickers": 97, "signals": [ {"ticker": "AAPL", "signal": "Sell", "confidence": -0.44, "found": true}, {"ticker": "MSFT", "signal": "Buy", "confidence": 0.99, "found": true}, {"ticker": "NVDA", "signal": "Hold", "confidence": 0.0, "found": true} ] } ``` You can send tickers as a JSON array. Names are trimmed, converted to uppercase, and deduplicated while preserving order. The endpoint considers the first 100 distinct tickers in each request. To check your current portfolio, omit `tickers` entirely or send an empty array, null, or an empty string: ```http POST /api/signals/sells Authorization: Bearer your_annie_api_key_here Content-Type: application/json Accept: application/json {} ``` ANNIE checks up to 100 distinct tickers from the API user's active portfolio, in alphabetical order. Closed positions and other users' portfolios are excluded. An empty or missing portfolio returns HTTP 200 with `count: 0` and `signals: []`. This uses the same daily ticker allowance and one-minute request limit as an explicit list. An explicit nonempty list always takes precedence over portfolio holdings. `remaining_sell_tickers` tells you how many additional distinct tickers you can request that day. Unknown tickers return `found: false`, `signal: "No Signal"`, and `confidence: 0.0`; they still count toward your daily allowance when returned. Buy confidence uses the same positive scale as the Buy endpoint. Sell confidence is negative, and Hold confidence is zero. For stocks in your active portfolio, a triggered stop takes precedence over Buy, Sell, and Hold: the `signal` field contains only `"Stop"`. This applies to both explicit ticker lists and requests that default to your portfolio, as well as held stocks returned by the Buy endpoint. ## Record bought and sold tickers Use these endpoints after you have bought or sold stocks to update the portfolio shown in your ANNIE account. They record portfolio actions; they do not place orders with a broker. The API key determines the account and portfolio. You cannot select another account or portfolio by supplying an ID. ```http POST /api/portfolio/buy Authorization: Bearer your_annie_api_key_here Content-Type: application/json Accept: application/json {"tickers":["AAPL","MSFT","UNKNOWN"]} ``` ```json { "completed_tickers": ["AAPL", "MSFT"], "error_tickers": ["UNKNOWN"] } ``` To record sales, send the same body format to `POST /api/portfolio/sell`. Both endpoints accept an array of ticker strings or one comma-separated string under `tickers`. A single ticker can be sent as `{"tickers":"AAPL"}`. Tickers are trimmed, uppercased, and deduplicated in input order. Unlike signal lookups, portfolio recording actions do not truncate the batch to a signal limit. Buy adds each known ticker that is not already held, creating your normal portfolio if needed. An already-held ticker is returned in `error_tickers` without adding another position. The action uses the same one-share recording behavior as the website's Bought It button. Buying never adds stocks to your watchlist; existing watchlist entries remain unchanged. Sell checks your active holdings before closing each position. A ticker not held is returned in `error_tickers`. Closing removes it from active holdings and retains the closed position in your portfolio history, just like Sold It on the website. Each ticker commits separately. Unknown symbols, invalid symbol text, duplicate buys, missing holdings, and failed saves are returned in `error_tickers`; the other tickers are still attempted. Both arrays contain ticker strings. Each distinct normalized input appears in exactly one array, preserving its order within that array. No prices are returned. **HTTP 200 does not mean every ticker succeeded.** Check both arrays, including when `completed_tickers` is empty. Empty requests and invalid containers (such as an object instead of a ticker array/string) return HTTP 422 before any portfolio changes. After a timeout, inspect your portfolio before retrying: the request may already have committed some tickers. ## Trade completion webhook To receive a notification when today's signals are ready, go to **Account > Signal API > Trade completion webhook** and register your HTTPS URL. Each account can register one URL. Registration and removal use the dashboard controls and are not available through the API. Use a publicly reachable HTTPS endpoint on port 443, without embedded login credentials. Supply the final destination URL; redirects are not followed. ANNIE sends an HTTPS POST with `Content-Type: application/json` and this payload: ```json {"trades completed at":"2026-09-08T15:02:00-04:00"} ``` Notifications begin with the next calculation completed after you register. Each completed calculation gets **one delivery attempt**, with no automatic retries. Return an HTTP 2xx response promptly to acknowledge delivery. Connection and read/write timeouts are three seconds, with a ten-second overall request limit. The notification contains only the timestamp; it does not include your API key or a signature. ## HTTP statuses and errors Error messages appear in the JSON `error` field: ```json {"error":"Invalid API key."} ``` | Status | Meaning | | --- | --- | | `200 OK` | Request completed. Sell signals may include an `error` for omitted tickers. Portfolio actions always return `completed_tickers` and `error_tickers`; inspect both. | | `401 Unauthorized` | The API key is missing or invalid, or API access is unavailable for the account. | | `422 Unprocessable Entity` | A signal request has malformed nonempty ticker input, or a portfolio recording request has empty or malformed ticker input. | | `429 Too Many Requests` | A signal-reading endpoint's one-minute request limit was reached. | | `503 Service Unavailable` | Signal or Trade-Along data is currently unavailable. | A 429 response includes a `Retry-After` header specifying how many seconds to wait before another successful request is allowed.