Get an alert when prediction odds move

For the Fed meeting on Wednesday, 28 October 2026, prediction markets put a cut at 0.7%, no change at 91.8% and a rise at 7.5%. A short script on a schedule compares the odds with its previous reading and prints an alert when the move reaches your threshold. For the Fed policy path, compare p_hold, the chance of no change, with the value saved from the previous run.

Do it with the API

Poll GET /v1/predictions/policy-paths/federal-reserve and keep the previous reading in a JSON file. The script reads p_hold from the first meeting in the response. Its alert follows that meeting's chance of no change, so keep that outcome in mind when you choose the threshold.

  1. Set your API key Get a free key and keep it in the NARWHAL_API_KEY environment variable. The request sends it as Authorization: Bearer YOUR_KEY to https://api.narwhalapi.com.
  2. Save the polling script Use the Python script with a 10 point threshold. It compares the absolute difference, so an increase or a decrease can trigger the printed alert.
    Python, alert on a 10 point move
    import json, os, pathlib
    import requests
    
    STATE = pathlib.Path("fed_hold.json")
    MOVE = 0.10                               # alert when the chance of "no change" moves by 10 points or more
    path = requests.get("https://api.narwhalapi.com/v1/predictions/policy-paths/federal-reserve",
                        headers={"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"}, timeout=10).json()
    hold = float(path["meetings"][0]["p_hold"])
    if STATE.exists():
        before = json.loads(STATE.read_text())["hold"]
        if abs(hold - before) >= MOVE:
            print(f"ALERT: chance of no change moved from {before:.1%} to {hold:.1%}")   # email or chat message here
    STATE.write_text(json.dumps({"hold": hold}))
    print(f"hold {hold:.1%}")
  3. Keep the state file between runs The first run saves the reading in fed_hold.json; a later run reads that file before comparing the odds. Every run writes its reading back to the file, including runs that do not print an alert.
  4. Put the script on a schedule On Free, use a daily schedule to match the daily odds update. The code prints the alert; use the marked place in the script for an email or chat message if you want the alert delivered there.

For email or chat delivery, put the message inside the threshold condition marked by the comment. A message outside that condition would be sent even when no move reaches the threshold.

Do it without code

In Zapier, Make or n8n, start with a scheduled trigger and an HTTP request to the same policy path. Store the p_hold reading so the workflow has a value to compare with when it runs again. Add a filter for the difference between the new reading and the stored reading, then an email or chat step for a move that reaches your chosen threshold.

Keep the comparison ahead of the step that replaces the stored value. The alert needs both readings: the saved value from the previous run and the value returned by the new request. After the comparison, save the new reading for the following run, whether or not the filter sends a message. The n8n tutorial and Zapier tutorial are the no-code routes in Narwhal's tutorials.

Which option to use when

SituationBest optionWhy
A daily odds check on FreeThe script on a scheduleFree odds are end-of-day values updated daily.
An alert when a market closes or settlesA webhook on Basic or ProWebhooks send prediction.event.closed and prediction.event.settled for prediction events.
Many questions to followLoop over events from /v1/predictions/eventsApply the comparison to the events you follow.

Webhooks report a prediction event closing or settling. They do not send odds-change notifications, so use polling and a stored reading for the threshold alert described here. A closure or settlement alert answers a different question from whether the chance of an outcome has moved.

What threshold should I use?

Pick a threshold that matches the question you follow. A 10 point move is large for an outcome with a high chance; a quiet question needs a smaller threshold. Think in percentage points when you choose it, because the comparison measures the change between the chances themselves. In the script, MOVE = 0.10 means a 10 point threshold. Keep this setting as a fraction when you change it. The alert text formats the before and after chances as percentages, so the stored fraction and the printed chance have different forms. Either an increase or a decrease can reach the threshold.

Why compare with a stored value?

The API returns the odds at the time of the request; your state file holds the previous reading. The script needs that saved value to calculate a move. On its first run there is no earlier reading in the file, so it stores the value and prints the hold chance without a move alert.

The comparison is with the previous run, even if that run did not trigger an alert. A move smaller than the threshold still replaces the stored reading. Several smaller moves therefore do not accumulate against the first value saved by this script. Keep fed_hold.json available to the scheduled script so it can read the baseline it saved. If the file is absent, the script takes the first-run path again and saves a new baseline. Use the same working directory for scheduled runs so fed_hold.json refers to the same file each time.

How often can I run it?

Run it as often as your quota allows, with a daily schedule on Free because those odds change once a day. Free has 5,000 requests a month, and a daily check uses about 30. More frequent requests on Free compare end-of-day values with the previous reading in your file.

Basic and Pro also have a predictions WebSocket stream at /v1/predictions/stream. That is another route for receiving prediction updates; the polling script here keeps its own comparison and threshold in the saved-state workflow.

Worked example: threshold 10 points

The figures are from 24 October 2026. The second reading is an illustration. The first run reads a hold chance of 91.9%, saves it and prints hold 91.9%. For example, suppose the following day's reading is 79.0%. Subtract that from the saved reading to get a move of 12.9 points.

StepFigure or result
Save the first reading91.9%
Read the following day's illustrative value79.0%
Calculate the absolute move91.9% to 79.0% is a move of 12.9 points
Compare with the threshold12.9 points exceeds 10 points

The move exceeds the threshold, so the script prints the alert and then saves the illustrative reading as the value for its following comparison.

Illustrative alert
ALERT: chance of no change moved from 91.9% to 79.0%

Published .