---
title: "Buy pump.fun and Robinhood Chain alerts for Discord or Telegram"
method: GET
path: "/v1/alerts/webhook"
tags: ["paid"]
---

# Buy pump.fun and Robinhood Chain alerts for Discord or Telegram

`GET /v1/alerts/webhook`

## Request

- Base URL: `https://api.loopholetape.com`
- URL: `https://api.loopholetape.com/v1/alerts/webhook`
- Auth: none required

Use when a Discord or Telegram room wants new pump.fun memecoins with high graduation odds, true graduations, avoid flips or Robinhood Chain ring flags posted to it without running a server; to poll from code use GET /v1/launches/since ($0.001). One payment registers your room's own delivery endpoint for 30 days: a Discord webhook URL, or telegram:<bot_token>:<chat_id> for a Telegram bot you own; any other host is refused unpaid. A test message is posted first and the payment settles when it arrives; a failed test is unpaid. Then every 60 s each new item of the kinds you pick is posted as one plain-text message ending with its public record and paid card links: graduation_odds and graduations are the items of our free Atom feeds (5 minutes delayed), ring_flags the Robinhood Chain pons ring-structure flags, avoid_flips a published graduation candidate whose verdict turns avoid. Filters min_p_grad, max_age_s, pumpfun_only, rhc_only; at most 20 messages an hour and 200 a day. The endpoint is stored encrypted and never echoed or logged: POST it in the JSON body. POST, or GET with the X-Alert-Destination header, is the same purchase. Unsubscribe with the link in the answer.

## Query parameters

- `destination` string, nullable: Your room's delivery endpoint: a Discord webhook URL https://discord.com/api/webhooks/<id>/<token>, or telegram:<bot_token>:<chat_id> for a Telegram bot you own. Send it in the POST JSON body or the X-Alert-Destination header: a query string can be recorded by proxies.
- `kinds` string, nullable: Comma-separated, one or more of graduation_odds, ring_flags, graduations, avoid_flips (POST and MCP accept an array).
- `min_p_grad` string, nullable: graduation_odds and avoid_flips: keep items whose P(true graduation) at publication is at least this (0 = no floor)
- `max_age_s` string, nullable: keep items whose launch was at most this many seconds old when the item was recorded; for graduations the time to graduation (0 = no limit)
- `pumpfun_only` string, nullable: true: leave out the Robinhood Chain kind (ring_flags)
- `rhc_only` string, nullable: true: leave out the pump.fun kinds
- `label` string, nullable: optional name printed at the start of every message (letters, digits, spaces and basic punctuation)

## Response `200`

Paid response (header PAYMENT-RESPONSE carries the settlement)

- Envelope
  - `ok` boolean, required
  - `schema_version` '2.0', required
  - `generated_at` string, date-time, required
  - `t` number, required: unix seconds at generation
  - `coverage` 'full' | 'thin', required: the mint is inside our live window (created while our captur / thin = the mint is not in the live window (older than ~2 h of silen
  - `data` object, required
  - `meta` object, required
    - `source` string
    - `version` string
    - `feed_lag_s` number, nullable: seconds between the newest event in our tape and now (the age of the newest event we ingested; it does not say whether the capture runs behind the chain, see chain_lag_s)
    - `is_stale` boolean: the ingest age (feed_lag_s) exceeds the route's freshness limit (5 s for compact risk checks, 30 s otherwise); a paid or keyed pump.fun request is also refused above 5 s of estimated chain lag when the gate enforces (see chain_lag_s, tape_behind), which this flag does not show
    - `chain_lag_s` number, nullable: estimated seconds the newest slot in our pump.fun tape is behind the Solana RPC's processed tip (slots_behind x the measured slot time, to 0.1 s); null when the tip is unknown; absent on Robinhood Chain answers
    - `slots_behind` integer, nullable: estimated slots between the newest slot in our pump.fun tape and the Solana RPC's processed tip (a tip read every 30 s, carried forward by the wall time since at the slot rate our own reads measure); 0 when the tape is at or ahead of the estimate; null when the tip is unknown
    - `tape_behind` boolean, nullable: true when the estimated chain_lag_s is above 5 s, false within 5 s, null when there is no tip to compare; on pump.fun answers only
    - `last_slot` integer, nullable
    - `price_usd` number, nullable
    - `next` object: related resources worth calling next (paths relative to base_url)
    - `disclaimer` string

## Other responses

- `402`: Payment required (x402 v2): header PAYMENT-REQUIRED = base64 of the body
- `422`: Validation Error

---

[API](https://skmtc.dev/loopholetape/apis/loophole-tape.md) · [All operations](https://skmtc.dev/loopholetape/apis/loophole-tape/llms.txt) · [OpenAPI document](https://skmtc.dev/loopholetape/apis/loophole-tape/revisions/eea099d70151?raw)
