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.

Go to sign-up Log in

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

  1. 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.
  2. 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.
  3. Sign in with that password, then set up an authenticator app or a passkey. We do not use SMS codes.
  4. Create your trial key on the API keys page. The key is shown once, with an admission ticket. Store both somewhere safe.
  5. 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.

  1. Download saetta-mcp-0.6.0.tgz (37,175 bytes).
  2. 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.
  3. 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.
  4. Configure your AI app's MCP server: the command is your node and 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/v1 and SAETTA_TRIAL_ADMISSION (your ticket). Fully restart the app, then ask it to use saetta_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

When signals can be read

How to call it

Limits

What you get

Cost, email and eligibility

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:

Signal fields
FieldMeaning
ruleThe identifier of the tested rule behind the signal.
record_shaThe digest of the sealed signal record: your receipt.
seqThe signal's number in Saetta's sealed chain of records.
sealed_atWhen the signal was sealed (UTC).
release_atThe release time (UTC). No signal is shown before it.
act_by_etThe time to act on the entry day (New York time).
statusclosed 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).
tickerThe stock's ticker, one to five capital letters.
issuer_nameThe company name, or null when it cannot be shown safely.
entry_sessionThe entry day (a New York date).
entry_auctionThe auction to enter at on the entry day, as a fixed text value.
exit_sessionThe exit day (a New York date).
exit_auctionThe auction to exit at on the exit day, as a fixed text value.
hold_sessionsThe number of sessions from the entry day to the exit day.
deadline_metWhether 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:

The signals service sends these headers:

Signals response headers
HeaderMeaning
Cache-Controlno-store on every answer: do not store or cache it.
X-Content-Sha256The SHA-256 of the answer body, on every signals answer (200).
X-Request-IdThe signals service's request id, for support. The front door and its safety gate send none.
Retry-AfterSeconds to wait: on 429 rate_limited, and on the front door's and the safety gate's 503 answers.
WWW-AuthenticateOn 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

Trial route answers
Who answersStatusCodeMeaningCounts toward your daily reads
Front door401admission_requiredThe 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 door503outside_release_windowInside the closed time, Monday to Friday 09:25 to 16:00 New York time. Retry-After says when it reopens.No
Front door503temporarily_unavailableThe trial is closed or paused, or the door cannot check admission right now.No
Front door429rate_limitedToo many requests from your network or account, or a fifth network in one UTC day.No
Front door404not_foundNo ticket header, any other path, a query string, another spelling, or a method other than GET.No
Safety gate503alerts_unavailableThe 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 service400invalid_requestThe request does not match the route: for example a body, or two Authorization headers.No
Signals service401unauthenticatedThe 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 service403not_trial_memberThe key is not an active trial key.Only if the read was already admitted
Signals service429rate_limitedMore than 10 reads a minute, or the day's 48 reads are used. Retry-After says when to try again.No
Signals service503lane_offSignals are not open yet, or are paused.Only if the read was already admitted
Signals service503alerts_unavailableThe 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

Portal messages
CodeMessage
signup_temporarily_unavailableSignup temporarily unavailable.
trial_registration_queuedRegistration 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_mismatchThe two email addresses do not match.
email_domain_checkCheck the email domain: it looks mistyped. Correct it, or tick "spelled exactly as typed".
email_not_acceptedThat email address cannot be used for the trial.
challenge_requiredYour browser must finish a short check before this form can be sent. Reload and try again.
trial_signups_endedTrial signups have closed.
trial_ticket_daily_limitAdmission ticket limit reached for today. Try again after 00:00 UTC.
trial_email_change_disabledTrial accounts cannot change their email address.