Bỏ qua điều hướng
DucDZ / Docs
Tài liệu API v1
OpenAPI
Đang kiểm tra dịch vụ

API nhỏ gọn.
Tích hợp dễ dà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.

Phiên bản
v1 · ổn định
Xác thực
Không yêu cầu
Kiểm chứng
Request đầu tiên · curl
# 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}}
Email APIĐang kiểm traTạo địa chỉ, đọc inbox, tải tệp, nhận SSE và gửi thư.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
Bắt đầu

Request đầu tiên trong một phút

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.

Tạo email và đọc inboxEmail API
BASE="https://api.anhduc.tech/v1/email"
ADDRESS=$(curl -s "$BASE/random" | jq -r .address)
curl -s "$BASE/inbox/$ADDRESS?limit=20"
Đọc thông tin mediaDownload API
curl -X POST "https://video.anhduc.tech/api/info" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://youtu.be/dQw4w9WgXcQ"}'
Contract

Quy ước chung

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.

01

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.

02

JSON theo mặc định

Gửi Content-Type: application/json cho POST. Attachment, file media và SSE là ngoại lệ.

03

Không cần token

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.

04

Không cache dữ liệu

API trả Cache-Control: no-store. Đừng đặt CDN cache trước inbox, trạng thái job hoặc file tạm.

Email APIhttps://api.anhduc.tech/v1/email
Download APIhttps://video.anhduc.tech/api
API 01

Email API

Hộp thư tạm công khai, nhận realtime qua SSE và tự hết hạn.

api.anhduc.tech/v1/email

Luồng nhận 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.

  1. 1
    Chọn địa chỉ

    Gọi /random hoặc tự chọn tên trước @anhduc.tech / @duc.baby.

  2. 2
    Nhận thư

    Cloudflare nhận MIME, backend parse, sanitize HTML và lưu dữ liệu có hạn dùng 15 ngày.

  3. 3
    Đọc hoặc subscribe

    Poll /inbox hoặc dùng EventSource với /stream.

Endpoint Email

Tất cả endpoint bên dưới đều public. Địa chỉ hệ thống dành riêng trả 403 MAILBOX_RESERVED.

Danh sách endpoint Email API
MethodPathMục đích
GET/randomSinh địa chỉ ngẫu nhiên
GET/inbox/:addressLiệt kê inbox theo cursor
GET/message/:idĐọc nội dung đầy đủ
GET/attachment/:idTải tệp đính kèm
GET/stream/:addressNhận sự kiện realtime
POST/sendGửi email nội bộ hoặc direct MX
GET/random

Sinh địa chỉ ngẫu nhiên

Trả một địa chỉ có local-part ngẫu nhiên trên domain được hỗ trợ.

Query parameters

Query của GET random
TênKiểuMặc định
domainstringanhduc.tech

Response · 200

application/json
{
  "address": "buimy620@anhduc.tech",
  "domain": "anhduc.tech",
  "domains": ["anhduc.tech", "duc.baby"]
}
GET/inbox/:address

Liệt kê inbox

Phân trang theo ID giảm dần. Đọc next_cursor rồi truyền lại vào before.

Query của GET inbox
TênKiểuMặc địnhGhi chú
limitinteger50Từ 1 đến 100
folderstringinboxinbox hoặc spam
beforestring—Cursor của trang trước
Response · 200
{
  "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
}
GET/message/:id

Đọc một email

Lấ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.
Response · 200
{
  "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"
  }]
}
GET/attachment/:id

Tải tệp đính kèm

Trả binary cùng tên tệp an toàn trong Content-Disposition. Tệp hết hạn cùng email.

curl
curl -J -O "https://api.anhduc.tech/v1/email/attachment/9"
GET/stream/:address

Nhận thư realtime

Mở Server-Sent Events. Server phát ready, message và heartbeat comment mỗi 25 giây.

Browser · EventSource
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));
});
Các event SSE
EventPayload
ready{ mailbox, count, latestId }
messageEmail summary mới
heartbeatComment : hb, không có data
POST/send

Gửi email

Đị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.

JSON body của POST send
FieldBắt buộcGiới hạn
fromCóDomain anhduc.tech hoặc duc.baby
toCóĐịa chỉ email hợp lệ
subjectKhôngTối đa 500 ký tự
text / htmlMột trong haiTổng tối đa 5 MiB
inReplyToKhôngTối đa 998 ký tự
referencesKhôngTối đa 4.000 ký tự
Request
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"
  }'
Gửi nội bộ
{"ok":true,"delivery":"internal","id":144,"messageId":"<...>"}
Gửi ra ngoài
{"ok":true,"delivery":"external","messageId":"<...>","accepted":["friend@example.com"],"rejected":[]}

Giới hạn & lỗi Email

Quota tính theo IP. Khi nhận 429, đọc Retry-After và chờ trước khi thử lại.

60request đọc / phút
10kết nối SSE mới / phút
3email gửi / phút
20email gửi / ngày
15 ngàythời gian lưu email
Mã lỗi Email API
HTTPCodeÝ nghĩa
400INVALID_MAILBOXĐịa chỉ hoặc domain không được hỗ trợ
400INVALID_FOLDER / INVALID_LIMIT / INVALID_CURSORQuery không hợp lệ
403MAILBOX_RESERVEDĐịa chỉ dành riêng cho hệ thống
404MESSAGE_NOT_FOUND / ATTACHMENT_NOT_FOUNDDữ liệu không tồn tại hoặc đã hết hạn
400 / 403 / 413 / 502REQUEST_ERRORValidation hoặc delivery của /send; đọc trường error
429RATE_LIMIT_*Vượt quota, response có retry_after
500+INTERNAL_ERRORLỗi nội bộ; cung cấp request_id khi báo lỗi
Error shape
{
  "error": "limit phải là số nguyên từ 1 đến 100",
  "code": "INVALID_LIMIT",
  "request_id": "6d21d8c8-..."
}
API 02

Download API

Đọc metadata, chọn format, tạo job và tải file tạm.

video.anhduc.tech/api

Một lượt tải, bốn bước

Download chạy bất đồng bộ để request không bị treo khi tải hoặc chuyển mã file lớn.

  1. 1
    Đọc metadata

    POST /info trả title, thumbnail và options.

  2. 2
    Tạo job

    POST /download nhận 202 và job ID.

  3. 3
    Theo dõi

    Poll GET /status/:id mỗi 1–2 giây.

  4. 4
    Lấy file

    Mở downloadUrl khi trạng thái là done.

Endpoint Download

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.

Danh sách endpoint Download API
MethodPathMục đích
POST/infoĐọc metadata và format
POST/downloadTạo job
GET/status/:idĐọc tiến độ
POST/cancel/:idHuỷ job đang chạy
GET/file/:idTải hoặc resume file
GET/health · /platformsMetadata dịch vụ
POST/info

Đọc thông tin media

Nhận URL hoặc đoạn share text có URL đầu tiên. Kết quả cùng URL được cache 10 phút.

Request
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.
Response · 200
{
  "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"}]
    }
  }
}
POST/download

Tạo job tải

Gửi lại URL cùng một optionId thực sự xuất hiện trong response /info.

JSON body của POST download
FieldBắt buộcNguồn
urlCóURL đã kiểm tra bằng /info
optionIdCóinfo.options.video[].id hoặc audio[].id
Request
curl -X POST "https://video.anhduc.tech/api/download" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://youtu.be/dQw4w9WgXcQ","optionId":"video-1080"}'
Response · 202
{"ok":true,"job":{"id":"3f9c1a70b2d4e6f851","status":"queued","percent":0}}
GET/status/:id

Theo dõi job

Poll sau 1–2 giây. Dừng khi trạng thái là done, error hoặc cancelled.

queued→downloading→processing→done
Response · 200
{
  "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
  }
}
POST/cancel/:id

Huỷ job

Chỉ huỷ được job chưa kết thúc. Job xong, lỗi hoặc đã huỷ trả 409.

curl
curl -X POST "https://video.anhduc.tech/api/cancel/3f9c1a70b2d4e6f851"
GET/file/:id

Tải file

Dùng khi job đã done. Hỗ trợ GET, HEAD và byte range để resume.

Header response khi tải file
HeaderÝ nghĩa
Content-DispositionTên file Unicode kèm phần mở rộng đúng định dạng, như .mp3 hoặc .mp4
Accept-Ranges: bytesCho phép resume và tải từng phần
Content-RangeCó trong response 206
Cache-Control: no-storeFile tạm, không cache
Resume download
curl -C - -J -O "https://video.anhduc.tech/api/file/3f9c1a70b2d4e6f851"
GET/health · /platforms

Metadata dịch vụ

Kiểm tra readiness và lấy danh sách platform public tại runtime.

GET /api/health
{
  "ok": true,
  "status": "ready",
  "engine": {"ytdlp": true, "ffmpeg": true, "javascript": true},
  "queue": {"running": 0, "queued": 0}
}
GET /api/platforms
{
  "ok": true,
  "platforms": [
    {"id":"youtube","name":"YouTube","status":"supported"},
    {"id":"tiktok","name":"TikTok","status":"limited"}
  ]
}
Nền tảng đang công bố27 nền tảng
YouTubeTikTok · limitedDouyin · limitedFacebookInstagramSoundCloudX / TwitterBilibiliVimeo · limitedvà nhiều nền tảng khác

Giới hạn & lỗi Download

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.

40request info / phút
20job mới / phút
2job chạy đồng thời
30 phútthời gian giữ file
3 giờthời lượng media tối đa
HTTP error của Download API
HTTPKhi nàoCách xử lý
400URL, JSON, option hoặc job ID saiSửa request theo response error
401Deployment đã bật API keyGửi X-Api-Key được cấp
404Job/file không tồn tại hoặc hết hạnTạo job mới
409File chưa sẵn sàng hoặc job không thể huỷKiểm tra trạng thái trước
416Byte range ngoài kích thước fileKhởi động lại lượt tải
422Nguồn riêng tư, đã xoá, live, quá dài hoặc bị chặnKiểm tra link công khai
429Vượt quota theo IPChờ theo Retry-After
Error shape
{"ok":false,"error":"Job không tồn tại hoặc đã hết hạn"}
Thử trực tiếp

API Console

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.

Request đi thẳng từ trình duyệt tới production API. Không nhập dữ liệu bí mật.

ResponseSẵn sàng
Chọn endpoint rồi bấm “Gửi request”.
Thay đổi

Changelog

Download compatibility

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.

Public docs v2

Tách site docs khỏi web app, sửa platform count và health schema, thêm OpenAPI, search, privacy notice và contract test.

↑↓ di chuyểnEnter mởEsc đóng