Dashboard
Total Items
all sources
New (24h)
first seen today
Updated (24h)
new links added
Removed
call-added
New (7d)
this week
📡 Sources
SourceActiveRemovedLast Seen
Loading…
📋 Recent Changelog
Loading…
📚 Library 📱 Mobile App ✈ Telegram App
Loading…
#SourceTypeStatusProgressNewUpdatedStartedDuration
Loading…

API Reference

Library

GET/api/librarypublic
Paginated list of all items. Query params: source, type (movie/tv), search, page, per_page (max 500, default 48).
Request
curl "/api/library?type=movie&search=batman&page=1&per_page=48"
Response
{
  "success": true,
  "data": {
    "total": 1854, "page": 1, "per_page": 48, "pages": 39,
    "items": [{
      "imdb_id": "tt0903747", "post_id": "breaking-bad",
      "source_slug": "movieland", "title": "Breaking Bad",
      "year": "2008", "type": "series", "poster": "https://...",
      "rating": "9.5", "is_added": false, "enriched": true,
      "file_count": 62, "sources": ["movieland"],
      "resolutions": ["1080p","720p"], "qualities": []
    }]
  }
}
GET/api/library/:imdbpublic
Full detail by IMDB ID (tt…) or TMDB ID (tmdb:12345). Returns title, poster, rating, description, genres, dubbed flags, sources, and grouped download links.
Request
curl "/api/library/tt0903747"
Response
{
  "success": true,
  "data": {
    "imdb_id": "tt0903747", "tmdb_id": "1396",
    "title": "Breaking Bad", "year": "2008", "type": "series",
    "poster": "https://...", "rating": "9.5",
    "description": "A chemistry teacher...", "country": "USA",
    "genres": ["drama","crime"], "dubbed": false,
    "bilingual": false, "has_subtitle": true,
    "duration_h": null, "duration_m": null,
    "cover_url": "https://...", "trailer_url": "https://...",
    "sources": ["movieland"], "enriched_from": "tmdb",
    "file_count": 62, "resolutions": ["1080p","720p"],
    "is_added": false, "added_at": null,
    "groups": [{"quality":"1080p","resolutions":[{
      "resolution":"1080p","files":[{
        "id":1,"href":"https://cdn1.movieland.af/...",
        "name":"file","file_type":"dubbed","codec":"",
        "resolution":"1080p","quality":"1080p",
        "season":"01","episode":"01","size_human":"537 MB",
        "source_slug":"movieland","fs_status":null
      }]
    }]}]
  }
}
GET/api/library/:imdb/subspublic
Subtitles for an item from YTS-Subs. Returns list of subtitle objects with language, uploader, rating, download URL, and caption lines.
Response
{
  "success": true,
  "data": { "subtitles": [{
    "language": "English", "lang_emoji": "🇬🇧",
    "uploader": "user123", "rating": "Trusted",
    "hearing_impaired": false,
    "url": "https://yts-subs.com/subtitles/...",
    "url_file": "https://cdn.yts-subs.com/...",
    "captions": ["Movie.2023.1080p.WEB-DL"]
  }]}
}
GET/api/library-post/:source/:post_idpublic
Detail for items with no IMDB/TMDB ID — looked up by scraper source slug + post_id. Redirects internally to /api/library/:imdb if the item later gains an IMDB ID.
Request
curl "/api/library-post/movieland/constantinople"
POST/api/library/:imdb/enrich
Trigger TMDB enrichment for an item. Stores title, poster, type, overview from TMDB. Auto-triggered on first GET /api/library/:imdb for real IMDB IDs.

Items

GET/api/items/stats
Aggregate counts: total items, new this week, by_source breakdown with active/removed counts.
Response
{
  "success": true,
  "data": {
    "total": 1854, "new_this_week": 42,
    "by_source": [{"slug":"movieland","active":1854,"removed":0}]
  }
}
GET/api/items
Raw item list with full DB row data. Params: source, type, search, page, limit.
GET/api/items/new
Items added in the last N days. Param: since (ISO date), limit.
GET/api/items/updated
Items with new links since a date. Param: since (ISO date), limit.
GET/api/items/:id
Single item by database ID.
GET/api/items/:id/links
All download links for an item by database ID.
GET/api/imdb/:imdb/links
All download links for an IMDB ID across all sources.
POST/api/items/mark-added
Mark an item as added/unadded. Body: {"imdb_id":"tt…","added":true}
POST/api/items/mark-added/bulk
Bulk mark items as added. Body: {"imdb_ids":["tt…"],"added":true}
POST/api/links/:id/mark-added
Mark a single link as added. Body: {"added":true}
DELETE/api/items/:id
Soft-delete (mark as removed) an item by ID.
POST/api/items/bulk
Bulk action on items. Body: {"ids":[1,2,3],"action":"remove"|"restore"}
POST/api/links/scan-sizes
HEAD-request links to detect file sizes. Body: {"imdb_id":"tt…"} or {"link_ids":[1,2,3]}
POST/api/links/:id/scan-size
HEAD-request a single link to detect its file size.
GET/api/changelog
Recent add/update/remove events. Param: limit, source.
POST/api/maintenance/normalize-links
Re-parse and normalize all link quality/resolution/codec fields from stored raw_urls.

Scraper

POST/api/scrape
Start a scrape job. Body: {"source":"movieland","type":"incremental","pages":3}. Type is incremental or full.
Request
curl -X POST "/api/scrape" -H "Content-Type: application/json" \
  -d '{"source":"movieland","type":"incremental","pages":3}'
Response
{"success":true,"data":{"job_id":42,"status":"running"}}
GET/api/jobs
List recent scrape jobs. Param: limit (default 20). Returns status, progress, new/updated counts, duration.
GET/api/jobs/:id
Single job detail by ID.
GET/api/jobs/:id/logs
Log lines for a job. Returns JSON array of {level, message, created_at}.
GET/api/jobs/:id/stream
SSE stream of live job log lines. Content-Type: text/event-stream. Each event is a JSON log line.
DELETE/api/jobs/:id
Cancel a running or pending job.

Filestore

POST/api/filestore/push/:link_id
Push a single link to filestore by link database ID.
POST/api/filestore/push-imdb/:imdb
Push all links for an IMDB ID to filestore. Body: {"only_unadded":true}
POST/api/filestore/sync-imdb/:imdb
Pull filestore status back into local link rows. Updates fs_status, fs_file_uuid on each link.
GET/api/filestore/status/:link_id
Filestore push status for a single link. Returns pending, running, done, or failed.
0 selected
Scraping…
New 0 Updated 0 Failed 0 Total 0/0 Phase idle