Quickstart notes
Smoke-test the Pinnacle drop stream with curl
One curl flag turns the SSE drop stream into lines on your terminal. What you should see, what plan_lacks_sse means, and when to stop watching.
Before writing any stream code, watch the drop stream raw. One curl command with the right flags opens the SSE stream and prints every drop as it lands, which is the fastest way to confirm your key, your plan and the stream's shape before you build on them.
The one command that matters
SSE is a plain HTTP response that never ends, so the flags matter more than the URL. You need -N to stop curl from buffering the response, the Accept header for the event stream, and your key in the header, exactly as the curl quickstart sends it for REST calls:
curl -N -H "x-portal-apikey: $ODDS_API_KEY" \
-H "Accept: text/event-stream" \
"$ODDS_BASE_URL/odds-drop?min_drop=5"
The -N flag is the one people forget. Without it curl collects the stream into a buffer and you see nothing for minutes.
What you should see
The first line is a control message: a JSON object, not a list, starting with the connected greeting. After that, each data: line carries a JSON array of alerts as drops are detected, the same shape the Python quickstart listens to. On a quiet board nothing arrives for minutes, and that is normal: no drops means no lines.
If your key's plan has no stream, the first control object says so: plan_lacks_sse. That is the stream telling you the key works and the plan does not include SSE, which the quickstart notes is the case for the free key, checked 2026-10-01.
Lower the floor while you test
The min_drop parameter sets how large a fall must be to arrive, and it goes down to 1. While you are watching, set it to 1 so a quiet afternoon still produces lines; put it back to your real threshold when the test is done. A smoke test that shows nothing proves nothing.
Reading a live stream without jq
jq wants complete JSON documents, and a stream is a series of lines, so pipe the output through a line reader instead. To see only the alert batches and skip the control objects, filter for the lines that carry arrays:
curl -N -H "x-portal-apikey: $ODDS_API_KEY" \
"$ODDS_BASE_URL/odds-drop?min_drop=1" | grep '^data: \['
For anything richer, fold the line handling into five lines of Python later. The terminal watch exists to confirm the feed, not to run it.
When to stop the test
You are done when you have seen the greeting and one alert batch, or confirmed the plan message. End it with Ctrl+C; the server closes its side when you do. For anything longer than a watch, the REST endpoints for snapshots and on-request drops suit a shell script better than a stream does, and the curl quickstart covers both.
One flag, one stream, one minute of watching. Confirm the shape first, then write the client.