Two settings resources — the chatbot and summary scheduling — plus the account read.
## Chatbot settings
```endpoint
GET /manage/chatbot
```
```responses
~~~200 OK
{
"data": {
"enabled": true,
"language": "english",
"messages_sent_today": 4,
"daily_limit": 30
},
"request_id": "5f0c…"
}
~~~
```
`daily_limit` is the plan's chat cap — absent when the plan doesn't set one. `messages_sent_today` is the counter against it.
### Update
`PATCH /v1/manage/chatbot` accepts exactly one field — everything else is rejected:
| Field | Type | Rules |
|---|---|---|
| `enabled` | boolean | **Required.** The chatbot on/off |
The `language` field is **read-only** through the API (`400 manage.field_read_only`); unknown fields are `400 validation.invalid_input`. The response is the updated resource (`200`).
## Summary settings
```endpoint
GET /manage/summaries
```
The schedule that drives automatic daily briefings:
```responses
~~~200 OK
{
"data": {
"automated_daily_summaries": true,
"daily_time": "08:00",
"timezone": "Europe/Istanbul",
"timezone_code": "GMT+03",
"language": "english",
"trigger_early_hours": 2
},
"request_id": "5f0c…"
}
~~~
```
### Update
`PATCH /v1/manage/summaries` — any non-empty subset of the four writable fields; the response is the updated resource (`200`):
| Field | Type | Rules |
|---|---|---|
| `automated_daily_summaries` | boolean | The daily workflow on/off |
| `daily_time` | string | Strict `HH:MM`, 24-hour (`400 manage.invalid_time`) |
| `timezone` | string | One of the supported IANA zones (`400 manage.invalid_timezone`); `timezone_code` is derived server-side and read-only |
| `language` | enum | `english` / `spanish` / `french` / `german` / `italian` / `portuguese` (`400 manage.invalid_language`) |
`trigger_early_hours` is **read-only** (`400 manage.field_read_only`); an empty body or unknown fields are rejected.
### Request
```tabs
~~~curl
curl -X PATCH https://api.daily-tube.com/v1/manage/summaries \
-H "Authorization: Bearer dtk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"daily_time":"08:30","timezone":"Europe/Istanbul"}'
~~~
~~~javascript
const res = await fetch("https://api.daily-tube.com/v1/manage/summaries", {
method: "PATCH",
headers: { Authorization: "Bearer dtk_YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ daily_time: "08:30", timezone: "Europe/Istanbul" }),
});
~~~
~~~python
import urllib.request, json
body = json.dumps({"daily_time": "08:30", "timezone": "Europe/Istanbul"}).encode()
req = urllib.request.Request(
"https://api.daily-tube.com/v1/manage/summaries",
data=body,
headers={"Authorization": "Bearer dtk_YOUR_KEY", "Content-Type": "application/json"},
method="PATCH",
)
with urllib.request.urlopen(req) as r:
print(json.load(r)["data"])
~~~
```
## Account
```endpoint
GET /account
```
Identity plus the Library stats trio (read-only):
```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…"
}
~~~
```
`hours_saved` is a one-decimal number; all three stats are zero-based counts from the same source as the web app's Library band. There is no account write path through the API.
## Errors
Every error returns the same body — `code` is the stable machine string, `message` is human: The full registry of every code lives on [Errors](/docs/errors).
```responses
~~~400 Bad Request
{
"error": { "code": "manage.invalid_time", "message": "daily_time must be strict 24h HH:MM" },
"request_id": "5f0c…"
}
~~~
```
| Code | Status | When |
|---|---|---|
| `manage.invalid_time` / `invalid_timezone` / `invalid_language` | 400 | Field validation |
| `manage.field_read_only` | 400 | Writing chatbot `language`, `trigger_early_hours`, or `timezone_code` |
| `validation.invalid_input` | 400 | Unknown fields, non-boolean `enabled`, empty PATCH body |
> Every keyed endpoint on this page shares the per-key budget — [Rate limits](/docs/rate-limits).
Settings
Two settings resources — the chatbot and summary scheduling — plus the account read.
Chatbot settings
GET /manage/chatbot
~~~200 OK
{
"data": {
"enabled": true,
"language": "english",
"messages_sent_today": 4,
"daily_limit": 30
},
"request_id": "5f0c…"
}
~~~
daily_limit is the plan's chat cap — absent when the plan doesn't set one. messages_sent_today is the counter against it.
Update
PATCH /v1/manage/chatbot accepts exactly one field — everything else is rejected:
| Field | Type | Rules |
|---|---|---|
| enabled | boolean | Required. The chatbot on/off |
The language field is read-only through the API (400 manage.field_read_only); unknown fields are 400 validation.invalid_input. The response is the updated resource (200).
Summary settings
GET /manage/summaries
The schedule that drives automatic daily briefings:
~~~200 OK
{
"data": {
"automated_daily_summaries": true,
"daily_time": "08:00",
"timezone": "Europe/Istanbul",
"timezone_code": "GMT+03",
"language": "english",
"trigger_early_hours": 2
},
"request_id": "5f0c…"
}
~~~
Update
PATCH /v1/manage/summaries — any non-empty subset of the four writable fields; the response is the updated resource (200):
| Field | Type | Rules |
|---|---|---|
| automated_daily_summaries | boolean | The daily workflow on/off |
| daily_time | string | Strict HH:MM, 24-hour (400 manage.invalid_time) |
| timezone | string | One of the supported IANA zones (400 manage.invalid_timezone); timezone_code is derived server-side and read-only |
| language | enum | english / spanish / french / german / italian / portuguese (400 manage.invalid_language) |
trigger_early_hours is read-only (400 manage.field_read_only); an empty body or unknown fields are rejected.
Request
~~~curl
curl -X PATCH https://api.daily-tube.com/v1/manage/summaries \
-H "Authorization: Bearer dtk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"daily_time":"08:30","timezone":"Europe/Istanbul"}'
~~~
~~~javascript
const res = await fetch("https://api.daily-tube.com/v1/manage/summaries", {
method: "PATCH",
headers: { Authorization: "Bearer dtk_YOUR_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ daily_time: "08:30", timezone: "Europe/Istanbul" }),
});
~~~
~~~python
import urllib.request, json
body = json.dumps({"daily_time": "08:30", "timezone": "Europe/Istanbul"}).encode()
req = urllib.request.Request(
"https://api.daily-tube.com/v1/manage/summaries",
data=body,
headers={"Authorization": "Bearer dtk_YOUR_KEY", "Content-Type": "application/json"},
method="PATCH",
)
with urllib.request.urlopen(req) as r:
print(json.load(r)["data"])
~~~
Account
GET /account
Identity plus the Library stats trio (read-only):
~~~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…"
}
~~~
hours_saved is a one-decimal number; all three stats are zero-based counts from the same source as the web app's Library band. There is no account write path through the API.
Errors
Every error returns the same body — code is the stable machine string, message is human: The full registry of every code lives on Errors (/docs/errors).
~~~400 Bad Request
{
"error": { "code": "manage.invalid_time", "message": "daily_time must be strict 24h HH:MM" },
"request_id": "5f0c…"
}
~~~
| Code | Status | When |
|---|---|---|
| manage.invalid_time / invalid_timezone / invalid_language | 400 | Field validation |
| manage.field_read_only | 400 | Writing chatbot language, trigger_early_hours, or timezone_code |
| validation.invalid_input | 400 | Unknown fields, non-boolean enabled, empty PATCH body |
Every keyed endpoint on this page shares the per-key budget — Rate limits (/docs/rate-limits).
daily_limit is the plan's chat cap — absent when the plan doesn't set one. messages_sent_today is the counter against it.
Update
PATCH /v1/manage/chatbot accepts exactly one field — everything else is rejected:
Field
Type
Rules
enabled
boolean
Required. The chatbot on/off
The language field is read-only through the API (400 manage.field_read_only); unknown fields are 400 validation.invalid_input. The response is the updated resource (200).
Summary settings
GET/manage/summariesapi.daily-tube.com/v1
The schedule that drives automatic daily briefings:
hours_saved is a one-decimal number; all three stats are zero-based counts from the same source as the web app's Library band. There is no account write path through the API.
Errors
Every error returns the same body — code is the stable machine string, message is human: The full registry of every code lives on Errors.
{
"error": { "code": "manage.invalid_time", "message": "daily_time must be strict 24h HH:MM" },
"request_id": "5f0c…"
}
{ "error": { "code": "manage.invalid_time", "message": "daily_time must be strict 24h HH:MM" }, "request_id": "5f0c…" }