Events stream
Every webhook event as it happens, over Server-Sent Events, a WebSocket or a GraphQL subscription.
Sign in to see your own test client ID in the samples.
The same events your webhooks hear, as they happen, over a connection you keep open: no public address needed, in order, resumable for 30 days. Needs an API key with the events:read right. The AsyncAPI description describes all of it.
Server-Sent Events
GET https://developers.aton-network.org/api/v1/events
A text/event-stream response that stays open. Each event: id: <event id>, event: <type>, data: the webhook body. Resume with Last-Event-ID or ?after=. A comment every 15 seconds keeps proxies from closing it. ?types=user.signed_in,consent.revoked filters.
# The events stream as Server-Sent Events. Needs events:read. -N keeps it open.
# Resume after the last event you handled: add -H "Last-Event-ID: <its id>" (kept 30 days).
curl -N "https://developers.aton-network.org/api/v1/events?types=user.signed_in,consent.revoked" \
-H "Authorization: Bearer $ATHERON_API_KEY"WebSocket
WebSocket wss://developers.aton-network.org/api/v1/events/ws
Authorization: Bearer on the upgrade request. Frames are JSON: {"type":"ready"}, then {"type":"event","event":<webhook body>}; {"type":"error","error":<code>,"error_description":...} before it closes. The same ?types= and ?after=.
// The events stream over a plain WebSocket, with the ws package. The key goes on the upgrade.
import WebSocket from "ws";
export function followEventsOverSocket(apiKey: string, onEvent: (event: { id: string; type: string; data: Record<string, unknown> }) => void): () => void {
const socket = new WebSocket("wss://developers.aton-network.org/api/v1/events/ws?types=user.signed_in", {
headers: { authorization: `Bearer ${apiKey}` },
});
socket.on("message", (raw) => {
const frame = JSON.parse(raw.toString()) as { type: string; event?: { id: string; type: string; data: Record<string, unknown> }; error?: string };
if (frame.type === "event" && frame.event) onEvent(frame.event);
else if (frame.type === "error") console.error("the events stream ended:", frame.error);
});
return () => socket.close(1000);
}GraphQL subscription
graphql-transport-ws wss://developers.aton-network.org/api/graphql/ws
subscription { events(types, after) { ... } } over the graphql-transport-ws protocol, the key in connection_init's payload as authorization.
# curl does not speak WebSocket. The same events come as Server-Sent Events: -N keeps the stream open.
# Needs events:read. Each event: id, event (its type) and data (the body a webhook would get).
curl -N "https://developers.aton-network.org/api/v1/events?types=user.signed_in,consent.revoked" \
-H "Authorization: Bearer $ATHERON_API_KEY"Which to use
Webhooks when your server has a public address and you want us to retry for a day. The events stream for a laptop, a worker behind a firewall, or a dashboard that shows sign-ins as they happen. The atheron CLI forwards test events to localhost.
Ask Atlas
AI assistantAsk anything about Sign in with Atheron, the API or the portal. You get an answer from our docs, with links to the pages it used.