Free trial
A free trial of Saetta Signals, by API, for people in Australia and the United States. Information only, not personal advice. Free: no card is asked for and nothing is charged.
Sign-up and API keys: available now, unless paused. Saetta AI can pause sign-up at any time; while it is paused, sign-up is refused as temporarily unavailable (signup_temporarily_unavailable).
How long your trial lasts: 14 days from your first trial key. There is no common end date: whenever you sign up, your trial ends 14 days after your own first key, and the API keys page of your portal shows when.
What the trial gives you
Saetta Signals come from a tested rule. Each signal names a stock, the day to enter and the day to exit. By default you first see a new signal after its entry has passed. Tested record, 2006-2009, after fees: win rate 53.8%, average return per pick +0.76%. Past results do not guarantee future results.
Read them with your trial key and ticket at GET /api/v1/signals, any time except Monday to Friday 09:25 to 16:00 New York time, or in your AI app with the Saetta plug-in (saetta-mcp 0.6.0). Information only, not personal advice.
How sign-up works
- Sign-up form, in the portal. Your email address twice, Australia or the United States, and your name and company if you want. Tick the three acknowledgements below. Your browser then solves a short check: it needs JavaScript, and without it the form is refused rather than the check skipped. There is no password on this form.
- The email link. We email you a link that lasts up to 24 hours; if it is not in your inbox within a few minutes, check your spam or junk folder. It opens a page where you choose your password (at least 12 characters), confirm your name, company and country, and tick the same three acknowledgements again. If the link has expired, sign up again with the same address.
- Sign in with that password, then set up an authenticator app or a passkey. We do not use SMS codes.
- Create your trial key on the API keys page. The key is shown once, with an admission ticket. Store both somewhere safe.
- Read the signals with both headers, outside the closed time. Examples.
Calling the Saetta Signals API
Create your trial key in the portal. The API keys page shows the API address, the key (once) and an admission ticket. Send the key in the Authorization header using the Bearer scheme, and the ticket in the X-Trial-Admission header. The trial route needs both on every request. Never put a key or a ticket in the web address. The trial request is:
curl -sS "$SAETTA_API_BASE/signals" \ -H "Authorization: Bearer $SAETTA_API_KEY" \ -H "X-Trial-Admission: $SAETTA_TRIAL_ADMISSION"
No other API route is on the trial route. The trial front door refuses every other path, a query string and every method other than GET with not_found.
Every sample below sends both headers. Copy the three values from the API keys page of your portal.
curl
# Saetta AI free trial API: Saetta Signals. One GET, no query, two headers.
# Copy the three values from the API keys page of your Saetta AI portal.
# SAETTA_API_BASE is the API address shown there, up to and including /api/v1.
# The key is shown once, with an admission ticket that lasts at most 24 hours; for a fresh one, replace the key there.
export SAETTA_API_BASE="PASTE_THE_API_ADDRESS_FROM_YOUR_SAETTA_PORTAL"
export SAETTA_API_KEY="PASTE_YOUR_KEY_HERE"
export SAETTA_TRIAL_ADMISSION="PASTE_YOUR_ADMISSION_TICKET_HERE"
# Readable outside 09:25-16:00 New York time on weekdays. A key or ticket in the address is refused.
curl -sS "$SAETTA_API_BASE/signals" \
-H "Authorization: Bearer $SAETTA_API_KEY" \
-H "X-Trial-Admission: $SAETTA_TRIAL_ADMISSION"Python
# Saetta AI free trial API: Saetta Signals (Python standard library).
# Set SAETTA_API_BASE, SAETTA_API_KEY and SAETTA_TRIAL_ADMISSION from the API keys page of your portal.
import json
import os
from urllib.error import HTTPError
from urllib.request import Request, urlopen
env = os.environ
request = Request(env.get("SAETTA_API_BASE", "") + "/signals",
headers={"Authorization": "Bearer " + env.get("SAETTA_API_KEY", ""),
"X-Trial-Admission": env.get("SAETTA_TRIAL_ADMISSION", "")})
try:
with urlopen(request, timeout=15) as response:
body = json.load(response)
except HTTPError as response:
with response:
err = json.load(response).get("error", {})
raise SystemExit(f"{response.code} {err.get('code')}: {err.get('message')}")
print("as of:", body.get("as_of"), "| signals:", body.get("count"))
for signal in body.get("alerts", ()):
print(signal.get("ticker"), signal.get("status"), "entry", signal.get("entry_session"),
"exit", signal.get("exit_session"))TypeScript
// Saetta AI free trial API: Saetta Signals. Node 18 or later: fetch is built in.
// Set SAETTA_API_BASE, SAETTA_API_KEY and SAETTA_TRIAL_ADMISSION from the API keys page of your portal.
async function getSignals(): Promise<void> {
const res = await fetch(`${process.env.SAETTA_API_BASE}/signals`, {
headers: {
Authorization: `Bearer ${process.env.SAETTA_API_KEY}`,
"X-Trial-Admission": process.env.SAETTA_TRIAL_ADMISSION ?? "",
},
});
const body = await res.json();
if (!res.ok) {
throw new Error(`${res.status} ${body.error.code}: ${body.error.message}`);
}
console.log("as of:", body.as_of, "| signals:", body.count);
for (const signal of body.alerts) {
console.log(signal.ticker, signal.status, "entry", signal.entry_session, "exit", signal.exit_session);
}
}
getSignals().catch((err) => {
console.error(err);
process.exitCode = 1;
});Claude
{
"mcpServers": {
"saetta": {
"command": "/ABSOLUTE/PATH/TO/node",
"args": ["/ABSOLUTE/PATH/TO/node_modules/saetta-mcp/bin/saetta-mcp.js"],
"env": {
"SAETTA_API_KEY": "PASTE_YOUR_KEY_HERE",
"SAETTA_API_BASE": "PASTE_THE_API_ADDRESS_FROM_YOUR_SAETTA_PORTAL",
"SAETTA_TRIAL_ADMISSION": "PASTE_YOUR_TRIAL_TICKET_HERE"
}
}
}
}Every sample sends both headers. The Claude tab is the Claude Desktop configuration of the Saetta MCP plug-in (saetta-mcp 0.6.0). Its launcher needs Node.js 22.23.4 or later, and its signals tool (saetta_signals) sends your key and your ticket on the signals request. Download, check and install it as shown in The Saetta plug-in. Do not paste a key or a ticket into a chat.
The Saetta plug-in (saetta-mcp 0.6.0)
The Saetta MCP plug-in reads your trial signals inside an AI app that runs MCP servers, for example Claude Desktop. Version 0.6.0 reads the timed signals feed, GET /api/v2/signals, and shows each new signal with its order deadline, its entry delay and its exit, labelled "new signal, live record building, not a tested record". Information only, not personal advice.
- Download saetta-mcp-0.6.0.tgz (37,175 bytes).
- Check its SHA-256 before you install it. It must be exactly
d9d609582d2cdf65666ab05cf385f4038ab53fb743980ad66a2bc09d6475ebc5
macOS:shasum -a 256 saetta-mcp-0.6.0.tgz. Linux:sha256sum saetta-mcp-0.6.0.tgz. If it differs, do not install it. - Install it with Node.js 22.23.4 or later, in a private local folder:
npm install /ABSOLUTE/PATH/saetta-mcp-0.6.0.tgz. - Configure your AI app's MCP server: the command is your
nodeand its argument/ABSOLUTE/PATH/TO/node_modules/saetta-mcp/bin/saetta-mcp.js, with three environment values:SAETTA_API_KEY(your trial key),SAETTA_API_BASE=https://saettaai.com/api/v1andSAETTA_TRIAL_ADMISSION(your ticket). Fully restart the app, then ask it to usesaetta_signals.
A fresh ticket
Your admission ticket lasts at most 24 hours and never past the end of your own trial, and the plug-in stops sending it when it expires. To keep reading, sign in and open the API keys page: choose Revoke on your trial key, then Create key. The new key is shown once, with a new admission ticket (the text after X-Trial-Admission:). Put the key in SAETTA_API_KEY and the ticket in SAETTA_TRIAL_ADMISSION in the same private configuration and fully restart the AI app. You can create or replace the key up to 3 times a UTC day; replacing it does not reset your daily reads or the end of your trial. Never paste a key or a ticket into a chat.
Plug-in 0.5.8 stops sending the ticket at Sun 1 Nov 2026, 00:00 Sydney time. Install 0.6.0 and use a fresh ticket.
The rules
Dates
- Sign-up and API keys: available now, unless paused. While sign-up is paused it is refused as temporarily unavailable (
signup_temporarily_unavailable). - Signals: readable now, outside the closed time below. While signals are paused, the signals address answers 503
lane_off. - Your trial lasts 14 days from your first trial key. There is no common end date: each member's trial ends exactly 14 days after their own first trial key, whenever they signed up.
- Your trial keys and admission tickets end when your trial ends. The API keys page of your portal shows the end of your own trial, in Sydney and New York time.
When signals can be read
- Any time except Monday to Friday, 09:25 to 16:00 New York time. During this trial that closed time is 00:25 to 07:00 Sydney time, Tuesday to Saturday. Weekends are open.
- In the closed time the address answers 503
outside_release_windowwithRetry-After. Those requests do not count toward your daily reads. - Each read gives the signals in view at that moment, at most 25, the most recent entry day first. There is no archive and no date lookup: a signal leaves the list at its exit.
- Delivery can be paused for safety at any time, without notice. While it is paused the address answers 503
temporarily_unavailable,lane_offoralerts_unavailable. Sign-in and keys keep working.
How to call it
- One request only:
GET /api/v1/signalson this site, with no query string. - Two headers on every request: your trial key as
Authorization: Bearer, and your admission ticket asX-Trial-Admission. Copy the API address, the key and the ticket from the API keys page of your portal. Examples. - The ticket lasts at most 24 hours, and never past the key's end. For a fresh one, replace the key on the same page (A fresh ticket). A ticket alone reads nothing. Keep the key and the ticket secret.
- One active trial key per account. You can create or replace it up to 3 times a UTC day. The key is shown once. Replacing it retires the old key and its tickets. It does not reset the daily reads or the end time.
Limits
- 10 reads a minute (burst 10) for the account and for its key, and at most 48 reads per account per UTC day. The UTC day turns at 20:00 New York, 11:00 Sydney.
- A read counts once the signals service has checked your key and admitted it, before it reads the signals, so an answer that then fails still counts. There is no refund. A key error, a refusal for membership and every front-door refusal do not count.
- At the front door: at most 48 attempts per account per UTC day, and at most 4 networks per account per UTC day. A network is one IPv4 address, or one IPv6 /64. If your address changes, for example on mobile data or a VPN, each new network counts.
- Each network can make at most 60 requests a minute (burst 20) and 500 a UTC day to this address, shared with anyone else on that network. A limit answers 429
rate_limitedwithRetry-After.
What you get
- Saetta Signals from a tested rule. Each signal names a stock, the day to enter and the day to exit.
- For each signal: the ticker, the company name, the entry day and the exit day, its status, when it was sealed, its release time and a record digest. All fields.
- By default a signal is shown from the time to act on its entry day, once that time has passed, until its exit; its status is then
closed. Because the address is closed on weekdays from 09:25 to 16:00 New York time, you first see a new signal after its entry. The other status,actionable(the entry is still ahead), is used only if Saetta AI switches to showing signals before the entry. - No prices, no share counts, no source links and no account data. At most 25 signals per answer.
- Tested record, 2006-2009, after fees: win rate 53.8%, average return per pick +0.76%. Past results do not guarantee future results.
- Information only, not personal advice. It does not place trades and it does not connect to your broker.
Cost, email and eligibility
- Free. No card is asked for and nothing is charged. The trial does not turn into a paid plan, and it does not reserve a price or a place.
- Signing up for the trial does not sign you up for marketing email. We send only the email the trial needs: the verification link, and a password reset link if you ask for one.
- Australia and the United States only. One trial per email address: aliases of one mailbox, such as +tags and Gmail dots, count as the same address. Up to 2,000 trial accounts in total, with a daily limit on new ones.
- Trial accounts cannot change their email address. Support can help revoke a key or recover access for the original address, but cannot move a trial to another mailbox.
- You accept three acknowledgements at sign-up: the trial terms, the risk notice and the data licensing terms. Their text is on the free trial page.
What an answer holds
Every answer is JSON with exactly these keys: schema, as_of, now_session_rule, count, excluded_unservable, alerts, request_id. alerts is the list, at most 25 items, and count is its length. Each signal has exactly these fields:
| Field | Meaning |
|---|---|
rule | The identifier of the tested rule behind the signal. |
record_sha | The digest of the sealed signal record: your receipt. |
seq | The signal's number in Saetta's sealed chain of records. |
sealed_at | When the signal was sealed (UTC). |
release_at | The release time (UTC). No signal is shown before it. |
act_by_et | The time to act on the entry day (New York time). |
status | closed once the time to act has passed (always, by default); actionable while the entry is still ahead (only if signals are shown before the entry). |
ticker | The stock's ticker, one to five capital letters. |
issuer_name | The company name, or null when it cannot be shown safely. |
entry_session | The entry day (a New York date). |
entry_auction | The auction to enter at on the entry day, as a fixed text value. |
exit_session | The exit day (a New York date). |
exit_auction | The auction to exit at on the exit day, as a fixed text value. |
hold_sessions | The number of sessions from the entry day to the exit day. |
deadline_met | Whether the signal was sealed before the study's decision deadline. |
Limits and response headers
The trial signals route has its own limits, kept apart from every other API budget:
- Reads: 10 a minute, burst 10, for the account and for its key, and at most 48 a UTC day per account (resetting at 00:00 UTC, which is 20:00 New York and 11:00 Sydney during the trial).
- Counted when admitted: a read counts once the signals service has checked your key and admitted it, before it reads the signals, so an answer that then fails still counts. There is no refund. A key error (401), a refusal for membership (403) and every front-door refusal do not count.
- Key lifetime: every trial key ends when your trial ends, 14 days after your first trial key (the API keys page shows when). One active key per account; up to 3 creations or replacements per UTC day.
- Front-door limits: per network (one IPv4 address or one IPv6 /64), 60 requests a minute (burst 20) and 500 a UTC day to the signals route, shared with anyone on that network; per account, 48 attempts and at most 4 networks a UTC day. These answer 429
rate_limitedand are not counted.
The signals service sends these headers:
| Header | Meaning |
|---|---|
Cache-Control | no-store on every answer: do not store or cache it. |
X-Content-Sha256 | The SHA-256 of the answer body, on every signals answer (200). |
X-Request-Id | The signals service's request id, for support. The front door and its safety gate send none. |
Retry-After | Seconds to wait: on 429 rate_limited, and on the front door's and the safety gate's 503 answers. |
WWW-Authenticate | On 401 unauthenticated: Bearer. |
When a limit is reached the answer is 429 rate_limited with a Retry-After header: either the per-minute bucket is empty or the day's reads are used.
What the signals address can answer
| Who answers | Status | Code | Meaning | Counts toward your daily reads |
|---|---|---|---|---|
| Front door | 401 | admission_required | The ticket is malformed, expired, renewed or replaced, or revoked, or more than one was sent. Replace the key on the API keys page for a fresh one (A fresh ticket). | No |
| Front door | 503 | outside_release_window | Inside the closed time, Monday to Friday 09:25 to 16:00 New York time. Retry-After says when it reopens. | No |
| Front door | 503 | temporarily_unavailable | The trial is closed or paused, or the door cannot check admission right now. | No |
| Front door | 429 | rate_limited | Too many requests from your network or account, or a fifth network in one UTC day. | No |
| Front door | 404 | not_found | No ticket header, any other path, a query string, another spelling, or a method other than GET. | No |
| Safety gate | 503 | alerts_unavailable | The answer failed the trial's checks, or the signals service could not be reached. Nothing partial is sent. | Yes, if the read was admitted |
| Signals service | 400 | invalid_request | The request does not match the route: for example a body, or two Authorization headers. | No |
| Signals service | 401 | unauthenticated | The key is missing, not valid, revoked or expired. Every trial key ends when your trial ends, 14 days after your first trial key. | Only if the read was already admitted |
| Signals service | 403 | not_trial_member | The key is not an active trial key. | Only if the read was already admitted |
| Signals service | 429 | rate_limited | More than 10 reads a minute, or the day's 48 reads are used. Retry-After says when to try again. | No |
| Signals service | 503 | lane_off | Signals are not open yet, or are paused. | Only if the read was already admitted |
| Signals service | 503 | alerts_unavailable | The sealed signals could not be verified right now. Nothing partial is sent. | Only if the read was already admitted |
The three acknowledgements
The sign-up form and the set-password page show the same three acknowledgements, each with its own unticked box. The portal records which text you accepted, by version and SHA-256 digest. If you accepted the earlier trial terms (version trial-terms-2026-10-19), you keep your trial and do not need to accept again; your trial also lasts 14 days from your first trial key.
I accept the trial terms: The Saetta AI free trial is free and asks for no payment details. I am 18 or over and I live in the country I chose at sign-up. My account, my keys and everything the trial shows or sends me are for my own evaluation only. My trial lasts 14 days from my first trial key; there is no common end date, and my keys end when my trial ends. Saetta AI can change, pause or end the trial, my account or my keys at any time. The Terms of use, the disclaimer and the risk warning on saettaai.com apply.
Version trial-terms-2026-11-01. SHA-256 7eccc737b41356e8be271b28c6f1d5ce8baef89c8e373116fd36171be3fdf0f3.
I have read the risk notice: Everything Saetta AI shows or sends me is general information. It is not personal financial advice, an offer or a recommendation to buy or sell any security. Rankings and lists can be wrong, sometimes for long periods, and past or modelled results are not a reliable guide to future results. If I trade, I can lose some or all of my money. Every decision is mine alone, and I can speak to a licensed financial adviser.
Version trial-risk-2026-10-19. SHA-256 ee6f3c96115e04017be6c7683b2ccfa9b6533f3d6de16afb67bc3a3c24d7ab78.
I accept the data licensing terms: Saetta AI licenses the trial outputs to me only for my own personal, non-commercial evaluation until my key ends. I will not resell, redistribute, publish, sublicense or share them, or use them to build or train another product or model, without Saetta AI's written agreement. Market data inside the outputs comes from third-party providers and remains subject to their rights.
Version trial-licensing-2026-10-19. SHA-256 329fcad9f89325d3e1a3d6a238bbbed4b32c3e85fffb1554b7fcc3c572b83de7.
Messages the sign-up and key pages can show
| Code | Message |
|---|---|
signup_temporarily_unavailable | Signup temporarily unavailable. |
trial_registration_queued | Registration received. If a verification email is due, it is on its way: open the link to choose your password and confirm your address. Links expire after 24 hours. If it is not in your inbox within a few minutes, check your spam or junk folder. |
email_confirmation_mismatch | The two email addresses do not match. |
email_domain_check | Check the email domain: it looks mistyped. Correct it, or tick "spelled exactly as typed". |
email_not_accepted | That email address cannot be used for the trial. |
challenge_required | Your browser must finish a short check before this form can be sent. Reload and try again. |
trial_signups_ended | Trial signups have closed. |
trial_ticket_daily_limit | Admission ticket limit reached for today. Try again after 00:00 UTC. |
trial_email_change_disabled | Trial accounts cannot change their email address. |