# Streaming Flow Guide
This guide explains how to get streaming URLs from MiruroAPI in 3 steps.
## Overview
```
Step 1: Get Episodes → /api/episodes/:anilistId
Step 2: Get Stream URLs → /api/watch/:provider/:anilistId/:category/:slug
Step 3: Play M3U8 → Use HLS player
```
---
## Step 1: Get Episodes
Each anime has episodes from multiple providers. Fetch the episode list with the AniList ID.
**Request:**
```bash
curl "https://mirurotvapi.vercel.app/api/episodes/20"
```
**Response:**
```json
{
"success": true,
"results": {
"providers": {
"kiwi": {
"meta": { "id": "1571", "title": "Naruto", "type": "TV" },
"episodes": {
"sub": [
{
"id": "watch/kiwi/20/sub/animepahe-1",
"number": 1,
"title": "Enter: Naruto Uzumaki!",
"image": "https://image.tmdb.org/t/p/original/...",
"airDate": "2002-10-03",
"audio": "sub",
"filler": false
}
]
}
}
}
}
}
```
> **Key field:** `id` in each episode — Pass this to the next step.
---
## Step 2: Get Stream URLs
Use the episode `id` from Step 1 to get M3U8 streaming URLs.
**Request:**
```bash
curl "https://mirurotvapi.vercel.app/api/watch/kiwi/20/sub/animepahe-1"
```
**Response:**
```json
{
"success": true,
"results": {
"streams": [
{
"url": "https://vault-01.uwucdn.top/stream/.../uwu.m3u8",
"type": "hls",
"quality": "360p",
"resolution": { "width": 640, "height": 360 },
"codec": "h264",
"audio": "sub",
"fansub": "df68",
"isActive": false,
"referer": "https://kwik.cx/e/..."
}
],
"download": "https://pahe.win/LJmbA"
}
}
```
> **Done!** Use `streams[0].url` in your HLS video player.
---
## Step 3: Play M3U8
### HLS.js (Browser)
```html
```
---
## JavaScript Example
```javascript
async function getStreamUrl(anilistId) {
// Step 1: Get episodes
const episodesRes = await fetch(`https://mirurotvapi.vercel.app/api/episodes/${anilistId}`);
const episodesData = await episodesRes.json();
const providers = episodesData.results.providers;
// Pick first provider with sub episodes
const provider = Object.keys(providers)[0];
const episodes = providers[provider].episodes.sub;
if (!episodes || episodes.length === 0) {
throw new Error('No episodes found');
}
// Use first episode's id
const episodeId = episodes[0].id; // "watch/kiwi/20/sub/animepahe-1"
const parts = episodeId.split('/');
const category = parts[3]; // "sub"
const slug = parts[4]; // "animepahe-1"
// Step 2: Get stream URLs
const streamRes = await fetch(`https://mirurotvapi.vercel.app/api/watch/${provider}/${anilistId}/${category}/${slug}`);
const streamData = await streamRes.json();
return streamData.results.streams[0].url; // "https://...m3u8"
}
// Usage
getStreamUrl(20)
.then(url => console.log('Stream URL:', url))
.catch(err => console.error('Error:', err));
```
---
## Python Example
```python
import requests
def get_stream_url(anilist_id):
base = "https://mirurotvapi.vercel.app/api"
# Step 1: Get episodes
episodes_res = requests.get(f"{base}/episodes/{anilist_id}")
episodes_data = episodes_res.json()
providers = episodes_data['results']['providers']
# Pick first provider
provider = list(providers.keys())[0]
episodes = providers[provider]['episodes']['sub']
if not episodes:
raise Exception("No episodes found")
episode_id = episodes[0]['id'] # "watch/kiwi/20/sub/animepahe-1"
parts = episode_id.split('/')
category = parts[3]
slug = parts[4]
# Step 2: Get stream URLs
stream_res = requests.get(f"{base}/watch/{provider}/{anilist_id}/{category}/{slug}")
stream_data = stream_res.json()
return stream_data['results']['streams'][0]['url']
# Usage
url = get_stream_url(20)
print(f"Stream URL: {url}")
```
---
## Sub & Dub
Providers return both `sub` and `dub` episode lists:
```javascript
const eps = await fetch("/api/episodes/20").then(r => r.json());
const kiwi = eps.results.providers.kiwi.episodes;
// Get sub episodes
const subEps = kiwi.sub; // [{ id: "watch/kiwi/20/sub/animepahe-1", ... }]
// Get dub episodes (if available)
const dubEps = kiwi.dub; // [{ id: "watch/kiwi/20/dub/...", ... }]
```
---
## Available Providers
| Provider | Sub | Dub | Download | Skip Times |
|:---|:---:|:---:|:---:|:---:|
| kiwi | ✅ | ❌ | ✅ | ❌ |
| pewe | ✅ | ❌ | ❌ | ❌ |
| bee | ✅ | ✅ | ❌ | ❌ |
| bonk | ✅ | ✅ | ✅ | ✅ |
| bun | ✅ | ✅ | ❌ | ❌ |
| ally | ✅ | ❌ | ✅ | ❌ |
| nun | ✅ | ❌ | ❌ | ❌ |
| twin | ✅ | ✅ | ❌ | ❌ |
| cog | ✅ | ❌ | ❌ | ❌ |
| moo | ✅ | ❌ | ✅ | ❌ |
| hop | ❌ | ✅ | ❌ | ❌ |
| telli | ✅ | ❌ | ❌ | ❌ |
---
## Troubleshooting
| Issue | Solution |
|-------|----------|
| "No episodes found" | Check the AniList ID is correct (use `/api/search` first) |
| "No providers" | The anime may not be available on any provider |
| Stream URL 403 | Some servers require specific referrer headers |
| CORS error | Use a proxy or access from server-side |