Pressfront API

Your Trace alerts in Slack, Discord or your own app.

Paste one link and every alert lands there too. Need more? A key lets your bot read your alerts and traces, add names, and start a trace.

Set it up in SettingsComes with Trace, $149 a month.
We spot it 42 posts at @yourname in 15 minutes. Usually about 4.
S
Slack, #alerts@yourname: 42 posts in the last 15 min. Usually about 4. pressfront.co/account…
D
Discord, #mentions@yourname: 42 posts in the last 15 min. Usually about 4.
{}
POST to your server, signed{"type":"alert.spike","data":{"name":"@yourname","count":42,"usual":4}}
  1. 1

    Paste a link

    In Settings, paste a Slack or Discord webhook link (or any https address of yours) and press Send a test. From then on every alert we email you lands there too.

    Slack: Incoming Webhooks, pick a channel, copy the link. Discord: channel settings, Integrations, Webhooks, Copy Webhook URL.

  2. 2

    Make a key

    Same page, Make a key. It starts with pf_live_ and we show it once, so copy it then. Keep it secret like a password. Delete it any time and anything using it stops.

    Tick Read only for a key that can look but never change anything (good for a dashboard). It gets a 403 read_only on anything but GET.

  3. 3

    Make your first call

    Send the key as a header. This one lists the alerts we sent you:

    curl https://pressfront.co/api/v1/alerts \
      -H "Authorization: Bearer pf_live_YOUR_KEY"

    Start a trace of a name, then check on it:

    curl -X POST https://pressfront.co/api/v1/traces \
      -H "Authorization: Bearer pf_live_YOUR_KEY" \
      -H "Content-Type: application/json" \
      -d '{"name":"@yourname"}'
    # {"id":"01J...","status":"queued","link":"https://pressfront.co/trace.html?id=01J..."}
    
    curl https://pressfront.co/api/v1/traces/01J... \n  -H "Authorization: Bearer pf_live_YOUR_KEY"
5 min

How often we check a name on X once it starts picking up (every 30 minutes when it is quiet). Bluesky is counted as posts land. We watch 10 names per plan.

Every endpoint

Base: https://pressfront.co/api/v1. Every call needs Authorization: Bearer pf_live_.... Answers are JSON.

PathWhat it does
GET/meYour plan, names watched of how many, calls today.
GET/alerts?since=&limit=Alerts we sent you, newest first. since is a date (ISO 8601), limit up to 100.
GET/namesThe names we watch for you.
POST/namesWatch one more. Body {"name":"@handle"}: an X @handle, an x.com link, or a Bluesky handle like name.bsky.social.
DELETE/names/:idStop watching it.
GET/traces?limit=Your traces, newest first (up to 50).
POST/tracesStart a full trace of a name. Body {"name":"@handle"}. The same name within the hour gives back the trace you already have ("reused": true). 20 a day per account through the API. Topics and phrases run on the website.
GET/traces/:idWhere it is (queued, running, done, thin, failed). When done: summary with posts, relevant posts, sources reached, confidence, the earliest post and the biggest account that spread it.
An alert, as your server gets it

For your own https link we POST JSON with a Pressfront-Event header and a Pressfront-Signature header. Slack and Discord links get one plain line instead.

{
  "id": "evt_lq3k9x2a7f1c9e",
  "type": "alert.spike",
  "created_at": "2026-11-05T21:14:00.000Z",
  "data": {
    "name": "@yourname", "platform": "x",
    "count": 42, "usual": 4, "window_min": 15,
    "level": 1,
    "link": "https://pressfront.co/account.html?open=01J...#trace"
  }
}
typeWhen
alert.spikePosts at a watched name jump to 3 times its usual 15 minutes (at least 12). level 2, 3... means it doubled again since the last alert.
alert.sweepThe 6 hour check of a name or phrase found it moving.
alert.watchA trace you Watch pinged: a big account replied, quoted or mentioned you, or the pace jumped. data.reason says which.
trace.doneOne of your traces finished (data.status is done, thin or failed; data.started_via is api or site). Sent to your own server only, never to Slack or Discord, so a channel is not filled with every trace you run.
testYou pressed Send a test.

We wait 8 seconds for a 2xx. If it fails we try twice more, after 1 and 5 minutes, with the same id, so you can skip one you already handled. If 3 alerts in a row never land, we pause the link and email you; email alerts keep coming. Fix it and press Send a test in Settings: a test that lands turns it back on.

Check a delivery really came from us

The signature header is t=<unix time>,v1=<hex>, where the hex is HMAC-SHA256 of t + "." + raw body with your signing secret (Settings, under your link). Node:

const crypto = require("crypto");
function fromPressfront(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const want = crypto.createHmac("sha256", secret).update(parts.t + "." + rawBody).digest("hex");
  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
  return fresh && crypto.timingSafeEqual(Buffer.from(want), Buffer.from(parts.v1 || ""));
}
Limits and errors

60 calls a minute and 5,000 a day per key, 5 keys per account. Every answer carries X-RateLimit-Remaining. Over the limit you get a 429 with Retry-After in seconds.

StatuserrorMeans
401missing_key, bad_keyNo key sent, or it was deleted.
402no_plan, names_fullThe account is not on Trace any more, or all 10 names are in use.
403read_onlyA read-only key tried to change something.
404not_foundNo such endpoint, name or trace on your account.
429rate_limited, traces_todaySlow down. Wait Retry-After seconds.
500serverOur side. Try again; if it keeps happening, email support@pressfront.co.

Every error is {"error": "code", "message": "plain words"}.

The rules
  • Keep your key secret. Anything done with it counts as done by you.
  • No harassing, threatening, stalking, doxxing or targeting anyone with alerts, the API or trace results. No building or selling a database of people. No reselling trace results as your own service.
  • Posts in a trace belong to the people who wrote them and the platforms they were posted on. Follow those platforms’ rules for what you do with them.
  • Alerts are an early warning, not a guarantee: we try hard, but we do not promise every alert arrives or every post is counted.
  • We may pause or delete a key or link that breaks these rules. Keys stop working while a plan has ended.
  • v1 stays v1: we give notice here before changing an endpoint in a way that breaks you.

The full wording is in our Terms (section 7) and Privacy Policy (what we log and for how long).

Need more than this?

More names, more calls, or something your team needs wired in: support@pressfront.co. Tell us what you are building.