Skip to content
CUTAD

CUTAD API Docs

REST API gratis untuk akses data anime, donghua, drama, dan film. Rate limit: 30 request/menit. Tidak perlu registrasi — generate key langsung.

🔑Dapatkan API Key

Gratis, tanpa registrasi. Cukup masukkan nama dan email. Jika email sudah pernah dipakai, key lama akan dikembalikan.

📖Cara Penggunaan

1ī¸âƒŖ

Dapatkan API Key

Masukkan nama & email di atas, klik Generate Key.

2ī¸âƒŖ

Sertakan di Request

Kirim key via header X-API-Key atau query ?api_key=

3ī¸âƒŖ

Ikuti Alur per Provider

Setiap provider punya 3 langkah: Rank → dapat list + id, Detail → pakai id dapat episode, Watch → pakai episode id dapat video URL. Lihat tab provider di bawah.

Alur universal (berlaku untuk semua provider):

1
Rank / Search

Dapat list item + ID

GET /anime/rank → { data: { sections: [{ items: [{ id, title }] }] } }
2
Detail / Episodes

Pakai ID dari langkah 1

GET /anime/detail?id=xxx → { data: { episodes: [{ id, title }] } }
3
Watch

Pakai episode ID dari langkah 2

GET /anime/watch?id=ep-xxx → { data: { videoUrl: "..." } }

đŸ“ĻResponse Format

Semua response dibungkus dalam format { "data": ... }. Isi data bervariasi per endpoint:

Rank / Home (list kategori)

{ "data": { "sections": [{ "name": "Kategori", "items": [{ "id", "title", "cover" }] }] } }

Rank / Search (flat list)

{ "data": [{ "id", "title", "thumbnail/poster/cover" }] }

Detail

{ "data": { "title", "cover", "synopsis/description", "episodes": [{ "id/href", "title" }] } }

Watch (streaming)

{ "data": { "videoUrl": "..." } }  // atau { "data": { "streams": [{ "url", "quality" }] } }

💡 Video URL sudah otomatis di-wrap melalui proxy CUTAD (/api/proxy?url=...&ref=...) agar bisa diakses tanpa CORS/Referer issue.

đŸ’ģContoh Request

cURL — full flow

# 1. Daftar anime populer
curl -H "X-API-Key: YOUR_KEY" \
  "https://www.cutad.web.id/public/api/v1/anime/rank"

# 2. Detail anime (pakai id dari rank)
curl -H "X-API-Key: YOUR_KEY" \
  "https://www.cutad.web.id/public/api/v1/anime/detail?id=my-ridiculous-reincarnation"

# 3. Video URL (pakai episode id dari detail)
curl -H "X-API-Key: YOUR_KEY" \
  "https://www.cutad.web.id/public/api/v1/anime/watch?id=my-ridiculous-reincarnation-episode-1-sub-indo"

JavaScript (fetch) — full flow

const API = "https://www.cutad.web.id/public/api/v1";
const HEADERS = { headers: { "X-API-Key": "YOUR_KEY" } };

// 1. Ambil daftar
const rank = await fetch(`${API}/anime/rank`, HEADERS)
  .then(r => r.json());

// 2. Ambil detail
const animeId = rank.data.sections[0].items[0].id;
const detail = await fetch(
  `${API}/anime/detail?id=${animeId}`, HEADERS
).then(r => r.json());

// 3. Ambil video
const epId = detail.data.episodes[0].id;
const watch = await fetch(
  `${API}/anime/watch?id=${epId}`, HEADERS
).then(r => r.json());
console.log(watch.data.videoUrl);

Python (requests) — full flow

import requests

API = "https://www.cutad.web.id/public/api/v1"
H = {"X-API-Key": "YOUR_KEY"}

# 1. Daftar film
rank = requests.get(f"{API}/film1/rank", headers=H).json()

# 2. Detail film pertama
film_id = rank["data"][0]["id"]
detail = requests.get(
  f"{API}/film1/detail",
  params={"id": film_id}, headers=H
).json()

# 3. Video URL
watch = requests.get(
  f"{API}/film1/watch",
  params={"id": film_id}, headers=H
).json()
print(watch["data"]["streams"][0]["url"])

Response Headers

X-RateLimit-Limit: 30        # Max request per window
X-RateLimit-Remaining: 29    # Sisa request sebelum kena limit
X-RateLimit-Reset: 1712560860 # Unix timestamp kapan counter reset

Rate limit: 30 request per menit, per API key (bukan per IP). Counter auto-reset setiap menit.

âąī¸Rate Limiting

30

request / menit

per key

bukan per IP

auto reset

setiap menit

Jika dapat 429 Too Many Requests, cek header X-RateLimit-Reset untuk tau kapan bisa request lagi. Atau cek X-RateLimit-Remaining sebelum request untuk hindari limit.

📡Endpoints per Provider

Anime Subtitle Indonesia (sumber: otakudesu / animasu)

🔄 Alur Penggunaan

1
rank

Dapatkan daftar anime populer & terbaru

Input: -

Output: id (contoh: my-ridiculous-reincarnation)

2
detail

Pakai id → dapat info anime + daftar episode

Input: id dari step 1

Output: episodes[].id (contoh: my-ridiculous-reincarnation-episode-1)

3
watch

Pakai episode id → dapat URL video streaming

Input: episodes[].id dari step 2

Output: data.videoUrl

đŸ“Ļ Response Schema

1GET/public/api/v1/anime/rank

Daftar anime populer & terbaru dari Otakudesu dan Anoboy

2GET/public/api/v1/anime/detail

Detail anime: judul, sinopsis, cover, genre, status, daftar episode lengkap

id*(animeId)
2GET/public/api/v1/anime/episodes

Daftar episode saja (subset dari detail)

id*(animeId)
3GET/public/api/v1/anime/watch

URL streaming video. âš ī¸ Pakai episode ID, BUKAN anime ID!

id*(episodeId)
1GET/public/api/v1/anime/search

Cari anime berdasarkan judul → hasil format sama dengan rank

q*

âš ī¸Error Codes

CodeMeaningSolusi
401API key tidak disertakanTambahkan X-API-Key header atau ?api_key= query
403API key tidak validGenerate ulang di halaman docs ini
404Provider atau endpoint tidak ditemukanCek penulisan provider/action. GET /public/api/v1/providers untuk list
429Rate limit terlampaui (30 req/menit)Tunggu sampai X-RateLimit-Reset, atau kurangi frekuensi request
500Server error atau upstream timeoutCoba lagi dalam beberapa saat. Jika persisten, sumber data mungkin down

🔧Troubleshooting

Dapat 401 Unauthorized padahal sudah kirim key?

Pastikan key dikirim via header X-API-Key: YOUR_KEY atau query ?api_key=YOUR_KEY. Jangan lupa spasi atau typo.

Dapat 429 Too Many Requests?

Kamu sudah lebih dari 30 request dalam 1 menit. Cek header X-RateLimit-Remaining sebelum request. Tunggu sampai X-RateLimit-Reset (unix timestamp) untuk reset.

Video tidak bisa diputar / CORS error?

Semua video URL sudah otomatis di-wrap melalui proxy CUTAD. Jangan akses URL asli langsung — gunakan videoUrl atau streams[].url dari response watch. URL proxy sudah include Referer yang benar.

Response kosong atau null?

Sumber data mungkin sedang down atau IP VPS diblokir (contoh: Melolo). Coba beberapa saat lagi atau pakai provider lain. Cek /public/api/v1/health untuk status.

Donghua/Film1 watch butuh URL lengkap, bukan slug?

Ya. Untuk Donghua, pakai episodes[].href (URL lengkap). Untuk Film1, pakai URL film dari rank atau episodes[].href untuk series. Slug saja tidak cukup.

Sfilmindo watch return streams kosong?

Parameter dp (detailPath) WAJIB disertakan. Ambil dari response detail → data.detailPath. Tanpa ini, endpoint tidak bisa resolve video.

DramaBox watch butuh 2 parameter?

Ya. Perlu id (bookId) DAN episodeId (chapterId, format: bookId_episodeNum). Ambil keduanya dari rank dan detail.

CUTAD API v1.0.0 — Gratis untuk penggunaan wajar

Powered by Next.js 14 + Express 5