Beta
Core / Summaries

Summaries

List, search, and read daily briefings.

Three endpoints: list, read one, and act on one. Every response is owner-scoped — another account's briefing is indistinguishable from a nonexistent one.

List summaries

GET/summariesapi.daily-tube.com/v1

Returns the account's briefings, newest expected edition first (when filtering by saved, newest saved first). Search results are additionally capped at 50 matches.

Query parameters

ParameterTypeRules
qstringOptional. Full-text search across headline, dek, and story text; non-empty after trim, ≤ 200 chars
is_savedbooleanOptional tri-state — true / false only (anything else is 400)
is_sharedbooleanOptional — true returns shared briefings, false unshared
expectedAftertimestampOptional. Window start (inclusive), RFC 3339
expectedBeforetimestampOptional. Window end (inclusive); must be ≥ expectedAfter
orderenumdate (default) or relevance — relevance requires q
maxResultsinteger1–100, default 20
pageinteger1-based; 0 and negatives are valid and return an empty 200 — see Pagination

Request

curl "https://api.daily-tube.com/v1/summaries?q=telescope&maxResults=5" \
-H "Authorization: Bearer dtk_YOUR_KEY"

Response

{
"data": {
"items": [
{
"id": "7f3a…91",
"expected_datetime": "2026-10-25T14:00:00Z",
"created_at": "2026-10-25T14:02:11Z",
"headline": "Space digest weekly",
"dek": "Orbital roundup",
"language": "english",
"section_count": 2,
"success": true,
"is_saved": true,
"is_shared": true,
"short_id": "a1b2c3d4",
"match_field": "story"
}
],
"pageInfo": { "totalResults": 3, "resultsPerPage": 5, "page": 1, "totalPages": 1 },
"searchInfo": { "suggestions": [ { "query": "telescopes", "result_count": 2, "summary_ids": ["7f3a…91"] } ] }
},
"request_id": "5f0c…"
}
  • match_field appears only when q is set — where the match was found: headline, dek, or story.
  • searchInfo.suggestions appears only on zero-match searches: up to 3 near-miss queries that do have results.
  • With q, results are capped at 50 by the search window; without q, the full account list is paged exactly.

Get a summary

GET/summaries/{id}api.daily-tube.com/v1

Path parameter

ParameterTypeRules
idstringRequired. One of three kinds — see below. Malformed ids are 400; foreign or unknown ids are a uniform 404 summary.not_found
  • Internal id (keyed) — the owner's full projection below. The first owner read of a completed briefing marks it read, and if delivery hasn't started yet, fires it.
  • Share id (short_id, 8-hex) — works with or without a key: your own briefing gives the owner view, another account's gives the public read-only projection (the /s/{short_id} page's data, with a coarse view count).
  • Keyless-run id (bare 10-hex, from keyless Summarize) — content and state only: progress: { overall_percent } while running, a compact completed body (with progress: { sources_total, sources_read }), or state: "failed".

Response

The owner projection varies by lifecycle state — all three are 200:

{
"data": {
"id": "7f3a…91",
"state": "completed",
"expected_datetime": "2026-10-25T14:00:00Z",
"created_at": "2026-10-25T14:02:11Z",
"language": "english",
"trigger_type": "automatic",
"headline": "Space digest weekly",
"dek": "Orbital roundup",
"tags": ["space"],
"plain_text": "# Space digest weekly\n\n…",
"sections": [
{
"emoji": "🛰",
"category": "News",
"summary": "…",
"importance_score": 4,
"plain_text": "…",
"sources": [ { "content_id": "…", "content_title": "…", "source_type": "youtube", "included": true } ]
}
],
"delivery": {
"delivered_at": "2026-10-25T14:05:00Z",
"channels": [ { "type": "email", "success": true } ]
},
"share": { "is_shared": true, "short_id": "a1b2c3d4", "url": "https://daily-tube.com/s/a1b2c3d4", "view_count": 12 },
"is_saved": true
},
"request_id": "5f0c…"
}
  • state on the terminal shape: skipped_no_new_content, skipped_no_sources, skipped_no_feeds, skipped_insufficient_content, or failed — each with its human reason.
  • progress.generation.label is the coarse stage word (starting, reading, writing, finalizing, done); the raw stage strings stay in status.
  • share.url/share.short_id appear only while shared; view_count is the coarse daily-deduped count.

Summary actions

POST/summaries/{id}api.daily-tube.com/v1

Body: { "action": "…" } — the same internal-or-share id kinds as the read.

ActionBodyEffectResponse
share{ "action": "share" }Creates (first time) or reuses the 8-hex short_id and marks shared200 — { short_id, url, is_shared, reused }; first share returns reused: false, repeats return the same id with reused: true
unshare{ "action": "unshare" }Marks unshared, keeps the short_id200 — { short_id, is_shared: false }
save / unsave{ "action": "save" }Toggles the saved (Library) stamp200 — { id, is_saved }; idempotent
send-early{ "action": "send-early" }Dispatches delivery now202 — { summary_id, dispatched: true }

share requires a completed, successful briefing (400 summary.not_completed).

Request — share

curl -X POST https://api.daily-tube.com/v1/summaries/7f3a…91 \
-H "Authorization: Bearer dtk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"action":"share"}'

Response — share

{
"data": { "short_id": "a1b2c3d4", "url": "https://daily-tube.com/s/a1b2c3d4", "is_shared": true, "reused": false },
"request_id": "5f0c…"
}

Errors

Every error returns the same body — code is the stable machine string, message is human:

{
"error": { "code": "summary.not_found", "message": "Summary not found" },
"request_id": "5f0c…"
}
CodeStatusWhen
summary.not_found404Foreign or unknown briefing — uniform across all id kinds
summary.not_completed / not_saveable / not_shared400Action preconditions
summary.already_sent / delivery_in_progress409send-early on a delivered / mid-flight briefing
summary.not_automatic / not_ready422send-early on a non-automatic or still-generating briefing
summary.dispatch_failed502The generation workflow failed to dispatch
validation.invalid_input400Unknown action; malformed filters (see Errors)

Every keyed endpoint on this page shares the per-key budget — Rate limits.