Docs
Product 3

Briefings & Watchlist Digests

Schedule personal watchlist digests and white-label community briefings, delivered before the open and after the close on every NYSE trading day.

A digest is a scheduled market summary that ApexTick builds and delivers for you. There are two kinds:

KindWhat it containsPlans
watchlistYour own symbols (1–20): price, change, day range, volume and market breadth.Hobbyist 1 (email only) · Trader Pro 5 · Quant & Community 20 · Enterprise unlimited
communityA branded briefing for your audience: top gainers, top losers, most active, sector performance at the close, and an optional watchlist.Quant & Community 1 · Enterprise unlimited, with custom layout

Endpoints

MethodPathPurpose
POST/v1/digestsSchedule a digest
GET/v1/digestsList digests, last delivery status and quota usage
DELETE/v1/digests/{id}Stop a digest and free its quota slot
GET/v1/digests/{id}/previewBuild the digest from current data without sending it
POST/v1/digests/{id}/testBuild and deliver the digest immediately

Schedules

Digests are delivered on NYSE trading days in two slots:

schedules valueTimeCommunity briefing contents
premarket08:30 ETTop gainers, top losers, most active, plus your watchlist if you set symbols
close16:30 ETSector performance of the 11 GICS sector ETFs, top gainers, top losers, most active, plus your watchlist
  • Omit schedules to receive both slots.
  • Weekends and full-day NYSE holidays are skipped automatically. Early-close days still receive both slots.
  • Each digest is delivered exactly once per date and slot.
  • These are the only two slots; there is no separate daily or weekly schedule. For a once-a-day digest, choose one slot.

The 11 sector ETFs are XLK, XLV, XLF, XLY, XLP, XLE, XLI, XLB, XLU, XLRE and XLC.

Create a digest

POST/v1/digestsHobbyist+ (watchlist) · Quant+ (community)

A white-label community briefing to Discord:

Shell
curl -s -X POST "https://api.apextick.com/v1/digests" \
  -H "apikey: $APEXTICK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "community",
    "name": "Alpha Traders daily",
    "brand_name": "Alpha Traders",
    "schedules": ["premarket", "close"],
    "channel": "discord",
    "target": "https://discord.com/api/webhooks/123/abc"
  }'

A personal watchlist digest by email, after the close only:

JSON
{
  "kind": "watchlist",
  "name": "Core holdings",
  "symbols": ["AAPL", "MSFT", "NVDA", "BTC-USD"],
  "schedules": ["close"],
  "channel": "email",
  "target": "[email protected]"
}

Request fields

FieldTypeDescription
kindstringRequired. watchlist or community.
namestringRequired. Your label for the digest, up to 80 characters.
symbolsstring[]Up to 20 symbols. Required for watchlist; optional for community, where it adds a watchlist section.
schedulesstring[]premarket, close, or both. Default: both.
channelstringRequired. email, webhook, telegram, discord or slack. The channels follow your plan's alert channels; Hobbyist is email only.
targetstringRequired. Destination, with the same rules as alert targets.
brand_namestringCommunity briefings: the brand shown in the title and as the Discord sender name, up to 60 characters.
accent_colorstringEnterprise custom layout: hex color such as #1F8B4C, used for the Discord embed and email accents.
footerstringEnterprise custom layout: footer text, up to 200 characters, e.g. Not investment advice.
sectionsstring[]Enterprise custom layout: choose and order movers, sectors and watchlist. watchlist requires symbols.

Using accent_color, footer or sections on a plan without custom layout returns 403. So does creating more digests of a kind than your plan includes; the body includes your limit. For webhook digests the 201 response includes a signing_secret, returned only once.

Delivery formats

The same digest is rendered natively for each channel:

ChannelFormat
discordA rich embed with one field per section and your brand as the sender name
telegramHTML message with monospace tables
slackmrkdwn message with code-block tables
emailHTML email with a plain-text alternative
webhookSigned JSON document; see below

Long tables are trimmed automatically to fit Discord's and Telegram's message limits.

Webhook delivery

Webhook digests POST the full digest document, the same JSON that preview returns, with these headers:

HeaderValue
X-ApexTick-Digest-IdThe digest's id
X-ApexTick-Signaturet=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">, keyed with the digest's signing_secret

Verify it exactly like an alert webhook.

Preview

GET/v1/digests/{id}/previewHobbyist+

Builds the digest from current data without sending it. Pass slot=premarket or slot=close; by default you get the closing digest after 12:00 ET and the pre-market briefing before.

JSON
{
  "type": "digest",
  "digest_id": "a3f0c7d2-91b4-4e0f-8c6a-2d7e5b1f9c08",
  "kind": "community",
  "slot": "close",
  "title": "Alpha Traders Closing Bell Digest · Fri Oct 16, 2026",
  "brand": "Alpha Traders",
  "generated_at": "2026-10-16T20:30:00Z",
  "sections": [
    {
      "heading": "Sector Performance",
      "columns": ["Sector", "ETF", "Chg %"],
      "rows": [["Technology", "XLK", "+1.84%"], ["Utilities", "XLU", "-0.96%"]],
      "note": "Leading: Technology · Lagging: Utilities"
    },
    {
      "heading": "Top Gainers",
      "columns": ["Symbol", "Price", "Chg %", "Volume"],
      "rows": [["SMCI", "48.92", "+11.37%", "61.2M"]]
    }
  ],
  "markdown": "## Alpha Traders Closing Bell Digest · Fri Oct 16, 2026\n…"
}

If one section's data is temporarily unavailable, it carries a note instead of rows; the digest fails only when no section has data.

Send a test

POST/v1/digests/{id}/testHobbyist+

Builds and delivers the digest immediately, with [Test] prefixed to the title, so you can check your channel setup. Accepts the same slot parameter as preview.

ResponseMeaning
202 AcceptedDelivered: {"status": "sent"}
429 Too Many RequestsTest sends are limited to one every 5 minutes per digest
502 Bad GatewayThe destination rejected the delivery; the error explains why

List and delete

GET/v1/digestsHobbyist+

Returns your active digests with their last delivery status (last_sent_at, last_status, last_error) and usage per kind. A limit of 0 means unlimited, and included: false means your plan doesn't offer that kind.

JSON
{
  "data": [
    { "id": "a3f0c7d2-…", "kind": "community", "name": "Alpha Traders daily", "symbols": [], "schedules": ["premarket", "close"], "channel": "discord", "target": "https://discord.com/api/webhooks/123/abc", "brand_name": "Alpha Traders", "active": true, "created_at": "2026-10-15T09:12:44Z", "last_sent_at": "2026-10-16T12:30:01Z", "last_status": "delivered" }
  ],
  "quota": {
    "watchlist": { "used": 0, "limit": 20, "included": true },
    "community": { "used": 1, "limit": 1, "included": true }
  }
}
DELETE/v1/digests/{id}Hobbyist+

Stops the digest and frees its quota slot. Returns 204 No Content.