HTTPS bắt buộc
Base URL production luôn dùng HTTPS. Request HTTP từ trình duyệt có thể bị chặn hoặc chuyển hướng.
Tạo email tạm, đọc thư theo thời gian thực và xử lý media từ nhiều nền tảng bằng API HTTP thuần. Không SDK bắt buộc, không OAuth, dùng được từ bất kỳ ngôn ngữ nào.
# Tạo một địa chỉ email ngẫu nhiên
$ curl -s https://api.anhduc.tech/v1/email/random
{
"address": "buimy620@anhduc.tech",
"domain": "anhduc.tech",
"domains": ["anhduc.tech", "duc.baby"]
}
# Kiểm tra Download API
$ curl -s https://video.anhduc.tech/api/health
{"ok":true,"status":"ready","queue":{"running":0,"queued":0}}
api.anhduc.tech/v1/email
Download APIĐang kiểm traĐọc metadata, tạo job và tải video, audio hoặc bài ảnh.video.anhduc.tech/api
Các ví dụ dưới đây chỉ cần công cụ HTTP có sẵn. Chọn ngôn ngữ rồi sao chép nguyên khối.
BASE="https://api.anhduc.tech/v1/email"
ADDRESS=$(curl -s "$BASE/random" | jq -r .address)
curl -s "$BASE/inbox/$ADDRESS?limit=20"const base = "https://api.anhduc.tech/v1/email";
const { address } = await fetch(`${base}/random`).then(r => r.json());
const inbox = await fetch(`${base}/inbox/${encodeURIComponent(address)}?limit=20`)
.then(r => r.json());
console.log(address, inbox.emails);import requests
base = "https://api.anhduc.tech/v1/email"
address = requests.get(f"{base}/random", timeout=10).json()["address"]
inbox = requests.get(f"{base}/inbox/{address}", params={"limit": 20}, timeout=10).json()
print(address, inbox["emails"])curl -X POST "https://video.anhduc.tech/api/info" \
-H "Content-Type: application/json" \
-d '{"url":"https://youtu.be/dQw4w9WgXcQ"}'
Hai dịch vụ tách biệt, nhưng cùng dùng HTTPS, JSON và CORS để client web có thể gọi trực tiếp.
Base URL production luôn dùng HTTPS. Request HTTP từ trình duyệt có thể bị chặn hoặc chuyển hướng.
Gửi Content-Type: application/json cho POST. Attachment, file media và SSE là ngoại lệ.
Deployment public hiện không yêu cầu API key. Client vẫn nên xử lý 401 nếu policy thay đổi.
API trả Cache-Control: no-store. Đừng đặt CDN cache trước inbox, trạng thái job hoặc file tạm.
https://api.anhduc.tech/v1/emailhttps://video.anhduc.tech/apiHộp thư tạm công khai, nhận realtime qua SSE và tự hết hạn.
api.anhduc.tech/v1/email
Địa chỉ không cần được tạo trước. Chọn local-part hợp lệ, gửi thư tới đó rồi đọc inbox hoặc mở stream để nhận sự kiện mới.
Gọi /random hoặc tự chọn tên trước @anhduc.tech / @duc.baby.
Cloudflare nhận MIME, backend parse, sanitize HTML và lưu dữ liệu có hạn dùng 15 ngày.
Poll /inbox hoặc dùng EventSource với /stream.
Tất cả endpoint bên dưới đều public. Địa chỉ hệ thống dành riêng trả 403 MAILBOX_RESERVED.
| Method | Path | Mục đích |
|---|---|---|
| GET | /random | Sinh địa chỉ ngẫu nhiên |
| GET | /inbox/:address | Liệt kê inbox theo cursor |
| GET | /message/:id | Đọc nội dung đầy đủ |
| GET | /attachment/:id | Tải tệp đính kèm |
| GET | /stream/:address | Nhận sự kiện realtime |
| POST | /send | Gửi email nội bộ hoặc direct MX |
/randomTrả một địa chỉ có local-part ngẫu nhiên trên domain được hỗ trợ.
| Tên | Kiểu | Mặc định |
|---|---|---|
domain | string | anhduc.tech |
{
"address": "buimy620@anhduc.tech",
"domain": "anhduc.tech",
"domains": ["anhduc.tech", "duc.baby"]
}/inbox/:addressPhân trang theo ID giảm dần. Đọc next_cursor rồi truyền lại vào before.
| Tên | Kiểu | Mặc định | Ghi chú |
|---|---|---|---|
limit | integer | 50 | Từ 1 đến 100 |
folder | string | inbox | inbox hoặc spam |
before | string | — | Cursor của trang trước |
{
"mailbox": "demo@anhduc.tech",
"folder": "inbox",
"count": 1,
"emails": [{
"id": 143,
"from": "DucDZ <hello@example.com>",
"subject": "Xin chào",
"received_at": "2026-09-06 20:10:00",
"is_read": false,
"is_starred": false
}],
"next_cursor": null
}/message/:idLấy ID từ inbox. Request này không tự đánh dấu thư đã đọc.
body_textNội dung plain text, luôn là chuỗi.body_htmlHTML đã loại bỏ script, event handler và URL nguy hiểm.attachmentsMảng metadata cùng download_url tương đối.reply_toReply-To nếu có, nếu không dùng địa chỉ người gửi.{
"id": 143,
"mailbox": "demo@anhduc.tech",
"from": "DucDZ <hello@example.com>",
"subject": "Xin chào",
"body_text": "Nội dung thư",
"body_html": "<p>Nội dung thư</p>",
"reply_to": "hello@example.com",
"attachments": [{
"id": 9,
"filename": "guide.pdf",
"mime": "application/pdf",
"size": 48120,
"download_url": "/v1/email/attachment/9"
}]
}/attachment/:idTrả binary cùng tên tệp an toàn trong Content-Disposition. Tệp hết hạn cùng email.
curl -J -O "https://api.anhduc.tech/v1/email/attachment/9"/stream/:addressMở Server-Sent Events. Server phát ready, message và heartbeat comment mỗi 25 giây.
const address = "demo@anhduc.tech";
const stream = new EventSource(
`https://api.anhduc.tech/v1/email/stream/${encodeURIComponent(address)}`
);
stream.addEventListener("ready", event => {
console.log("connected", JSON.parse(event.data));
});
stream.addEventListener("message", event => {
console.log("new email", JSON.parse(event.data));
});| Event | Payload |
|---|---|
ready | { mailbox, count, latestId } |
message | Email summary mới |
| heartbeat | Comment : hb, không có data |
/sendĐịa chỉ from phải thuộc domain DucDZ. Gửi nội bộ được lưu ngay; gửi ra ngoài dùng direct MX.
| Field | Bắt buộc | Giới hạn |
|---|---|---|
from | Có | Domain anhduc.tech hoặc duc.baby |
to | Có | Địa chỉ email hợp lệ |
subject | Không | Tối đa 500 ký tự |
text / html | Một trong hai | Tổng tối đa 5 MiB |
inReplyTo | Không | Tối đa 998 ký tự |
references | Không | Tối đa 4.000 ký tự |
curl -X POST "https://api.anhduc.tech/v1/email/send" \
-H "Content-Type: application/json" \
-d '{
"from": "demo@anhduc.tech",
"to": "friend@example.com",
"subject": "Hello",
"text": "Sent with DucDZ Email API"
}'{"ok":true,"delivery":"internal","id":144,"messageId":"<...>"}{"ok":true,"delivery":"external","messageId":"<...>","accepted":["friend@example.com"],"rejected":[]}Quota tính theo IP. Khi nhận 429, đọc Retry-After và chờ trước khi thử lại.
| HTTP | Code | Ý nghĩa |
|---|---|---|
| 400 | INVALID_MAILBOX | Địa chỉ hoặc domain không được hỗ trợ |
| 400 | INVALID_FOLDER / INVALID_LIMIT / INVALID_CURSOR | Query không hợp lệ |
| 403 | MAILBOX_RESERVED | Địa chỉ dành riêng cho hệ thống |
| 404 | MESSAGE_NOT_FOUND / ATTACHMENT_NOT_FOUND | Dữ liệu không tồn tại hoặc đã hết hạn |
| 400 / 403 / 413 / 502 | REQUEST_ERROR | Validation hoặc delivery của /send; đọc trường error |
| 429 | RATE_LIMIT_* | Vượt quota, response có retry_after |
| 500+ | INTERNAL_ERROR | Lỗi nội bộ; cung cấp request_id khi báo lỗi |
{
"error": "limit phải là số nguyên từ 1 đến 100",
"code": "INVALID_LIMIT",
"request_id": "6d21d8c8-..."
}Đọc metadata, chọn format, tạo job và tải file tạm.
video.anhduc.tech/api
Download chạy bất đồng bộ để request không bị treo khi tải hoặc chuyển mã file lớn.
POST /info trả title, thumbnail và options.
POST /download nhận 202 và job ID.
Poll GET /status/:id mỗi 1–2 giây.
Mở downloadUrl khi trạng thái là done.
API hiện công bố 27 nền tảng đã qua smoke test; mục limited có thể phụ thuộc IP hoặc phiên nguồn. /platforms là nguồn chính xác tại runtime.
| Method | Path | Mục đích |
|---|---|---|
| POST | /info | Đọc metadata và format |
| POST | /download | Tạo job |
| GET | /status/:id | Đọc tiến độ |
| POST | /cancel/:id | Huỷ job đang chạy |
| GET | /file/:id | Tải hoặc resume file |
| GET | /health · /platforms | Metadata dịch vụ |
/infoNhận URL hoặc đoạn share text có URL đầu tiên. Kết quả cùng URL được cache 10 phút.
curl -X POST "https://video.anhduc.tech/api/info" \
-H "Content-Type: application/json" \
-d '{"url":"https://youtu.be/dQw4w9WgXcQ"}'audioOnlyMedia chỉ có audio, không có video option.photoPostBài ảnh; có option ZIP, slideshow hoặc ảnh đơn.durationThời lượng theo giây; có thể là null.optionsCác option.id hợp lệ để gửi sang /download.{
"ok": true,
"info": {
"title": "Example video",
"platform": "youtube",
"platformName": "YouTube",
"duration": 213,
"durationText": "3:33",
"thumbnail": "https://...",
"audioOnly": false,
"photoPost": false,
"options": {
"video": [{"id":"video-1080","label":"1080p","ext":"mp4","quality":1080}],
"audio": [{"id":"audio-mp3-192","label":"MP3 192 kbps","ext":"mp3"}]
}
}
}/downloadGửi lại URL cùng một optionId thực sự xuất hiện trong response /info.
| Field | Bắt buộc | Nguồn |
|---|---|---|
url | Có | URL đã kiểm tra bằng /info |
optionId | Có | info.options.video[].id hoặc audio[].id |
curl -X POST "https://video.anhduc.tech/api/download" \
-H "Content-Type: application/json" \
-d '{"url":"https://youtu.be/dQw4w9WgXcQ","optionId":"video-1080"}'{"ok":true,"job":{"id":"3f9c1a70b2d4e6f851","status":"queued","percent":0}}/status/:idPoll sau 1–2 giây. Dừng khi trạng thái là done, error hoặc cancelled.
{
"ok": true,
"job": {
"id": "3f9c1a70b2d4e6f851",
"status": "downloading",
"percent": 64.2,
"speed": "8.4MiB/s",
"eta": "00:04",
"filename": null,
"ext": "mp4",
"size": null,
"sizeText": null,
"downloadUrl": null,
"error": null
}
}/cancel/:idChỉ huỷ được job chưa kết thúc. Job xong, lỗi hoặc đã huỷ trả 409.
curl -X POST "https://video.anhduc.tech/api/cancel/3f9c1a70b2d4e6f851"/file/:idDùng khi job đã done. Hỗ trợ GET, HEAD và byte range để resume.
| Header | Ý nghĩa |
|---|---|
Content-Disposition | Tên file Unicode kèm phần mở rộng đúng định dạng, như .mp3 hoặc .mp4 |
Accept-Ranges: bytes | Cho phép resume và tải từng phần |
Content-Range | Có trong response 206 |
Cache-Control: no-store | File tạm, không cache |
curl -C - -J -O "https://video.anhduc.tech/api/file/3f9c1a70b2d4e6f851"/health · /platformsKiểm tra readiness và lấy danh sách platform public tại runtime.
{
"ok": true,
"status": "ready",
"engine": {"ytdlp": true, "ffmpeg": true, "javascript": true},
"queue": {"running": 0, "queued": 0}
}{
"ok": true,
"platforms": [
{"id":"youtube","name":"YouTube","status":"supported"},
{"id":"tiktok","name":"TikTok","status":"limited"}
]
}Job vượt slot không bị từ chối mà ở trạng thái queued. File bị dọn sau thời gian TTL.
| HTTP | Khi nào | Cách xử lý |
|---|---|---|
| 400 | URL, JSON, option hoặc job ID sai | Sửa request theo response error |
| 401 | Deployment đã bật API key | Gửi X-Api-Key được cấp |
| 404 | Job/file không tồn tại hoặc hết hạn | Tạo job mới |
| 409 | File chưa sẵn sàng hoặc job không thể huỷ | Kiểm tra trạng thái trước |
| 416 | Byte range ngoài kích thước file | Khởi động lại lượt tải |
| 422 | Nguồn riêng tư, đã xoá, live, quá dài hoặc bị chặn | Kiểm tra link công khai |
| 429 | Vượt quota theo IP | Chờ theo Retry-After |
{"ok":false,"error":"Job không tồn tại hoặc đã hết hạn"}Console chỉ mở các thao tác đọc hoặc metadata an toàn; nó không gửi email và không tạo job tải.
Chọn endpoint rồi bấm “Gửi request”.Bật Node EJS cho YouTube; thêm fallback TikTok, X, Facebook, Bilibili và Rumble; công bố trạng thái platform trung thực theo smoke test 33/33.
Tách site docs khỏi web app, sửa platform count và health schema, thêm OpenAPI, search, privacy notice và contract test.