## 1. Get a key
Sign in to the [Developer Console](/) and create an API key on the **API Keys** page. The full key (`dtk_…`) is shown **once** at creation — store it immediately. You can hold up to five active keys and revoke any of them at any time.
> API access requires a plan with API enabled. On a plan without it, every keyed endpoint returns `403 subscription.api_not_enabled`.
## 2. Make your first request
```tabs
~~~curl
curl https://api.daily-tube.com/v1/account \
-H "Authorization: Bearer dtk_YOUR_KEY"
~~~
~~~javascript
const res = await fetch("https://api.daily-tube.com/v1/account", {
headers: { Authorization: "Bearer dtk_YOUR_KEY" },
});
const { data } = await res.json();
console.log(data.email, data.stats);
~~~
~~~python
import urllib.request, json
req = urllib.request.Request(
"https://api.daily-tube.com/v1/account",
headers={"Authorization": "Bearer dtk_YOUR_KEY"},
)
with urllib.request.urlopen(req) as r:
print(json.load(r)["data"])
~~~
```
```responses
~~~200 OK
{
"data": {
"first_name": "Ada",
"last_name": "Lovelace",
"email": "[email protected]",
"stats": {
"sources_summarized": 128,
"hours_saved": 6.4,
"digests_received": 42
}
},
"request_id": "5f0c…"
}
~~~
~~~401
{
"error": { "code": "auth.invalid_key", "message": "Invalid API key" },
"request_id": "5f0c…"
}
~~~
```
## 3. Read a briefing
```tabs
~~~curl
curl "https://api.daily-tube.com/v1/summaries?maxResults=5" \
-H "Authorization: Bearer dtk_YOUR_KEY"
~~~
~~~javascript
const res = await fetch(
"https://api.daily-tube.com/v1/summaries?maxResults=5",
{ headers: { Authorization: "Bearer dtk_YOUR_KEY" } },
);
const { data } = await res.json();
console.log(data.items[0].headline);
~~~
~~~python
import urllib.request, json, urllib.parse
url = "https://api.daily-tube.com/v1/summaries?" + urllib.parse.urlencode({"maxResults": 5})
req = urllib.request.Request(url, headers={"Authorization": "Bearer dtk_YOUR_KEY"})
with urllib.request.urlopen(req) as r:
items = json.load(r)["data"]["items"]
print(items[0]["headline"])
~~~
```
## 4. Generate one on demand
```tabs
~~~curl
curl -X POST https://api.daily-tube.com/v1/summarize \
-H "Authorization: Bearer dtk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"pasted_sources":["https://www.youtube.com/watch?v=…"]}'
~~~
~~~javascript
const res = await fetch("https://api.daily-tube.com/v1/summarize", {
method: "POST",
headers: {
Authorization: "Bearer dtk_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ pasted_sources: ["https://www.youtube.com/watch?v=…"] }),
});
// 202 — poll the run, or watch it appear in GET /v1/summaries
~~~
~~~python
import urllib.request, json
body = json.dumps({"pasted_sources": ["https://www.youtube.com/watch?v=…"]}).encode()
req = urllib.request.Request(
"https://api.daily-tube.com/v1/summarize",
data=body,
headers={"Authorization": "Bearer dtk_YOUR_KEY", "Content-Type": "application/json"},
)
with urllib.request.urlopen(req) as r:
print(r.status, json.load(r)["data"])
~~~
```
The response is `202` with a `summary_id` — the summary generates asynchronously; poll `GET /v1/summaries/{summary_id}` for progress or watch it appear in your briefings list when it completes.
## Next steps
- [Authentication](/docs/authentication) — key handling, rotation, and the uniform 401.
- [Rate limits](/docs/rate-limits) — the 3-second interval and hourly budget you just started spending.
- [Summaries](/docs/summaries) — the full listing contract you used in step 3.
Quickstart
1. Get a key
Sign in to the Developer Console (/) and create an API key on the API Keys page. The full key (dtk_…) is shown once at creation — store it immediately. You can hold up to five active keys and revoke any of them at any time.
API access requires a plan with API enabled. On a plan without it, every keyed endpoint returns 403 subscription.api_not_enabled.
2. Make your first request
~~~curl
curl https://api.daily-tube.com/v1/account \
-H "Authorization: Bearer dtk_YOUR_KEY"
~~~
~~~javascript
const res = await fetch("https://api.daily-tube.com/v1/account", {
headers: { Authorization: "Bearer dtk_YOUR_KEY" },
});
const { data } = await res.json();
console.log(data.email, data.stats);
~~~
~~~python
import urllib.request, json
req = urllib.request.Request(
"https://api.daily-tube.com/v1/account",
headers={"Authorization": "Bearer dtk_YOUR_KEY"},
)
with urllib.request.urlopen(req) as r:
print(json.load(r)["data"])
~~~
~~~200 OK
{
"data": {
"first_name": "Ada",
"last_name": "Lovelace",
"email": "[email protected]",
"stats": {
"sources_summarized": 128,
"hours_saved": 6.4,
"digests_received": 42
}
},
"request_id": "5f0c…"
}
~~~
~~~401
{
"error": { "code": "auth.invalid_key", "message": "Invalid API key" },
"request_id": "5f0c…"
}
~~~
3. Read a briefing
~~~curl
curl "https://api.daily-tube.com/v1/summaries?maxResults=5" \
-H "Authorization: Bearer dtk_YOUR_KEY"
~~~
~~~javascript
const res = await fetch(
"https://api.daily-tube.com/v1/summaries?maxResults=5",
{ headers: { Authorization: "Bearer dtk_YOUR_KEY" } },
);
const { data } = await res.json();
console.log(data.items[0].headline);
~~~
~~~python
import urllib.request, json, urllib.parse
url = "https://api.daily-tube.com/v1/summaries?" + urllib.parse.urlencode({"maxResults": 5})
req = urllib.request.Request(url, headers={"Authorization": "Bearer dtk_YOUR_KEY"})
with urllib.request.urlopen(req) as r:
items = json.load(r)["data"]["items"]
print(items[0]["headline"])
~~~
4. Generate one on demand
~~~curl
curl -X POST https://api.daily-tube.com/v1/summarize \
-H "Authorization: Bearer dtk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"pasted_sources":["https://www.youtube.com/watch?v=…"]}'
~~~
~~~javascript
const res = await fetch("https://api.daily-tube.com/v1/summarize", {
method: "POST",
headers: {
Authorization: "Bearer dtk_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ pasted_sources: ["https://www.youtube.com/watch?v=…"] }),
});
// 202 — poll the run, or watch it appear in GET /v1/summaries
~~~
~~~python
import urllib.request, json
body = json.dumps({"pasted_sources": ["https://www.youtube.com/watch?v=…"]}).encode()
req = urllib.request.Request(
"https://api.daily-tube.com/v1/summarize",
data=body,
headers={"Authorization": "Bearer dtk_YOUR_KEY", "Content-Type": "application/json"},
)
with urllib.request.urlopen(req) as r:
print(r.status, json.load(r)["data"])
~~~
The response is 202 with a summary_id — the summary generates asynchronously; poll GET /v1/summaries/{summary_id} for progress or watch it appear in your briefings list when it completes.
Next steps
• Authentication (/docs/authentication) — key handling, rotation, and the uniform 401.
• Rate limits (/docs/rate-limits) — the 3-second interval and hourly budget you just started spending.
• Summaries (/docs/summaries) — the full listing contract you used in step 3.
Get started / Quickstart
Quickstart
Make your first API request in under a minute.
1. Get a key
Sign in to the Developer Console and create an API key on the API Keys page. The full key (dtk_…) is shown once at creation — store it immediately. You can hold up to five active keys and revoke any of them at any time.
API access requires a plan with API enabled. On a plan without it, every keyed endpoint returns 403 subscription.api_not_enabled.
2. Make your first request
curl https://api.daily-tube.com/v1/account \
-H "Authorization: Bearer dtk_YOUR_KEY"
curl https://api.daily-tube.com/v1/account \
-H "Authorization: Bearer dtk_YOUR_KEY"
const res = await fetch("https://api.daily-tube.com/v1/account", {
headers: { Authorization: "Bearer dtk_YOUR_KEY" },
});
const { data } = await res.json();
console.log(data.email, data.stats);
const res = await fetch("https://api.daily-tube.com/v1/account", {
headers: { Authorization: "Bearer dtk_YOUR_KEY" },
});
const { data } = await res.json();
console.log(data.email, data.stats);
import urllib.request, json
req = urllib.request.Request(
"https://api.daily-tube.com/v1/account",
headers={"Authorization": "Bearer dtk_YOUR_KEY"},
)
with urllib.request.urlopen(req) as r:
print(json.load(r)["data"])
import urllib.request, json
req = urllib.request.Request(
"https://api.daily-tube.com/v1/account",
headers={"Authorization": "Bearer dtk_YOUR_KEY"},
)
with urllib.request.urlopen(req) as r:
print(json.load(r)["data"])
{
"data": {
"first_name": "Ada",
"last_name": "Lovelace",
"email": "[email protected]",
"stats": {
"sources_summarized": 128,
"hours_saved": 6.4,
"digests_received": 42
}
},
"request_id": "5f0c…"
}
{
"data": {
"first_name": "Ada",
"last_name": "Lovelace",
"email": "[email protected]",
"stats": {
"sources_summarized": 128,
"hours_saved": 6.4,
"digests_received": 42
}
},
"request_id": "5f0c…"
}
{
"error": { "code": "auth.invalid_key", "message": "Invalid API key" },
"request_id": "5f0c…"
}
{
"error": { "code": "auth.invalid_key", "message": "Invalid API key" },
"request_id": "5f0c…"
}
3. Read a briefing
curl "https://api.daily-tube.com/v1/summaries?maxResults=5" \
-H "Authorization: Bearer dtk_YOUR_KEY"
curl "https://api.daily-tube.com/v1/summaries?maxResults=5" \
-H "Authorization: Bearer dtk_YOUR_KEY"
const res = await fetch(
"https://api.daily-tube.com/v1/summaries?maxResults=5",
{ headers: { Authorization: "Bearer dtk_YOUR_KEY" } },
);
const { data } = await res.json();
console.log(data.items[0].headline);
const res = await fetch(
"https://api.daily-tube.com/v1/summaries?maxResults=5",
{ headers: { Authorization: "Bearer dtk_YOUR_KEY" } },
);
const { data } = await res.json();
console.log(data.items[0].headline);
import urllib.request, json, urllib.parse
url = "https://api.daily-tube.com/v1/summaries?" + urllib.parse.urlencode({"maxResults": 5})
req = urllib.request.Request(url, headers={"Authorization": "Bearer dtk_YOUR_KEY"})
with urllib.request.urlopen(req) as r:
items = json.load(r)["data"]["items"]
print(items[0]["headline"])
import urllib.request, json, urllib.parse
url = "https://api.daily-tube.com/v1/summaries?" + urllib.parse.urlencode({"maxResults": 5})
req = urllib.request.Request(url, headers={"Authorization": "Bearer dtk_YOUR_KEY"})
with urllib.request.urlopen(req) as r:
items = json.load(r)["data"]["items"]
print(items[0]["headline"])
4. Generate one on demand
curl -X POST https://api.daily-tube.com/v1/summarize \
-H "Authorization: Bearer dtk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"pasted_sources":["https://www.youtube.com/watch?v=…"]}'
curl -X POST https://api.daily-tube.com/v1/summarize \
-H "Authorization: Bearer dtk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"pasted_sources":["https://www.youtube.com/watch?v=…"]}'
const res = await fetch("https://api.daily-tube.com/v1/summarize", {
method: "POST",
headers: {
Authorization: "Bearer dtk_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ pasted_sources: ["https://www.youtube.com/watch?v=…"] }),
});
// 202 — poll the run, or watch it appear in GET /v1/summaries
const res = await fetch("https://api.daily-tube.com/v1/summarize", {
method: "POST",
headers: {
Authorization: "Bearer dtk_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ pasted_sources: ["https://www.youtube.com/watch?v=…"] }),
});
// 202 — poll the run, or watch it appear in GET /v1/summaries
import urllib.request, json
body = json.dumps({"pasted_sources": ["https://www.youtube.com/watch?v=…"]}).encode()
req = urllib.request.Request(
"https://api.daily-tube.com/v1/summarize",
data=body,
headers={"Authorization": "Bearer dtk_YOUR_KEY", "Content-Type": "application/json"},
)
with urllib.request.urlopen(req) as r:
print(r.status, json.load(r)["data"])
import urllib.request, json
body = json.dumps({"pasted_sources": ["https://www.youtube.com/watch?v=…"]}).encode()
req = urllib.request.Request(
"https://api.daily-tube.com/v1/summarize",
data=body,
headers={"Authorization": "Bearer dtk_YOUR_KEY", "Content-Type": "application/json"},
)
with urllib.request.urlopen(req) as r:
print(r.status, json.load(r)["data"])
The response is 202 with a summary_id — the summary generates asynchronously; poll GET /v1/summaries/{summary_id} for progress or watch it appear in your briefings list when it completes.
Next steps
- Authentication — key handling, rotation, and the uniform 401.
- Rate limits — the 3-second interval and hourly budget you just started spending.
- Summaries — the full listing contract you used in step 3.