DramaBox API endpoint
Returns one page of DramaBox titles carrying a tag, as the Android app shows them: each title's id, title, description, cover, website link, episode count, tags with their tag ids, protagonist, library flag and listing times, plus the tag's own name. Get tag ids from any title result's tag_refs (dramabox-rank, dramabox-search, dramabox-category-books and the other list endpoints all expose them). An unknown tag id returns an empty list rather than an error. Only public catalog metadata is read; no playable video is returned.
/dramabox/tagThis endpoint reads DramaBox's Android app API rather than its website pages. It needs no device, emulator or app at request time: the service reproduces the app's request signature and state header from public app material and keeps the anonymous guest session the app uses for catalogue calls internally. Only public catalog metadata is read, and no playable video is ever returned.
Query parameters:
tag_id: required. A tag id from any title result's tag_refs (dramabox-rank, dramabox-search,
dramabox-category-books, dramabox-performer and the other list endpoints all expose them).page: optional, 1 to 1000. Defaults to 1.limit: optional, 1 to 50. Defaults to 20.Notable response behavior:
tag_refs on any title is the discovery surface.tag_id returns HTTP 200 with titles: [] and has_more: false, not 404 — the app
API answers an empty page for a tag it does not know.tag_name is the tag's display name when the upstream knows the id.tag_refs, so a lookup can be walked from tag to tag.has_more is true when a later page exists.Example response (lists shortened):
{
"code": 200,
"msg": "OK",
"data": {
"tag_id": 1379,
"tag_name": "Forbidden Love",
"page": 1,
"limit": 20,
"has_more": false,
"titles": [
{
"id": "42000028173",
"title": "Love Is A Dangerous Game",
"description": "Olivia is dragged by her husband Ryan to a couples-swapping getaway…",
"cover_url": "https://hwztchapter.dramaboxdb.com/data/cppartner/4x2/42x0/420x0/42000028173/42000028173.jpg",
"url": "https://www.dramabox.com/drama/42000028173",
"episodes": 43,
"tags": ["Forbidden Love", "Hidden Identity"],
"tag_refs": [
{ "id": 1379, "name": "Forbidden Love" },
{ "id": 1395, "name": "Hidden Identity" }
],
"in_library": false
}
]
}
}
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| id | 20 | |
| title | 20 | “Love Is A Dangerous Game” and 19 other values |
| description | 20 | median 403 characters |
| cover_url | 20 | hwztchapter.dramaboxdb.com |
| url | 20 | dramabox.com |
| episodes | 20 | 30 to 60, median 50 |
| tags | 20 | median 6 entries |
| tag_refs | 20 | median 6 entries |
| in_library | 20 | true in 0 of 20 |
| shelf_time | 20 | 2026-08-01 to 2026-10-24 |
| shelf_time_ms | 20 | 2026-07-31 to 2026-10-24 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| tag_id | integer | Yes | Tag id from any title result's tag_refs | 1379 | |
| page | integer | No | 1 | Page number, 1 to 1000; defaults to 1 | 1 |
| limit | integer | No | 20 | Page size, 1 to 50; defaults to 20 | 20 |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/dramabox/tag?tag_id=1379&page=1&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"tag_id": 1379,
"tag_name": "Forbidden Love",
"page": 1,
"limit": 20,
"has_more": false,
"titles": [
{
"id": "42000028173",
"title": "Love Is A Dangerous Game",
"description": "Olivia is dragged by her husband Ryan to a couples-swapping getaway…",
"cover_url": "https://hwztchapter.dramaboxdb.com/data/cppartner/4x2/42x0/420x0/42000028173/42000028173.jpg",
"url": "https://www.dramabox.com/drama/42000028173",
"episodes": 43,
"tags": [
"Forbidden Love",
"Hidden Identity"
],
"tag_refs": [
{
"id": 1379,
"name": "Forbidden Love"
},
{
"id": 1395,
"name": "Hidden Identity"
}
],
"in_library": false
}
]
}
}Request schema
No body schema
Response schema
#/definitions/dramabox.tagResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | dramabox.TagResponse | No | ||||
| data.has_more | boolean | No | ||||
| data.limit | integer | No | ||||
| data.page | integer | No | ||||
| data.tag_id | integer | No | ||||
| data.tag_name | string | No | ||||
| data.titles | array | No | ||||
| data.titles[].cover_url | string | No | ||||
| data.titles[].description | string | No | ||||
| data.titles[].episodes | integer | No | ||||
| data.titles[].id | string | No | ||||
| data.titles[].in_library | boolean | No | InLibrary is always false for the shared guest session. | |||
| data.titles[].play_count | integer | No | PlayCount is the app's displayed play count where the route carries it. | |||
| data.titles[].protagonist | string | No | Protagonist lists the cast names as the app prints them. | |||
| data.titles[].shelf_time | string | No | ShelfTime is the app's listing time as printed ("2026-09-27 16:42:18"). | |||
| data.titles[].shelf_time_ms | integer | No | ShelfTimeMS is the same listing time as Unix milliseconds. | |||
| data.titles[].tag_refs | array | No | TagRefs pairs each tag with its id; pass an id to dramabox-tag. | |||
| data.titles[].tag_refs[].id | integer | No | ||||
| data.titles[].tag_refs[].name | string | No | ||||
| data.titles[].tags | array | No | ||||
| data.titles[].title | string | No | ||||
| data.titles[].url | string | No | URL is the public DramaBox website page for the title. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/dramabox/tag?tag_id=1379&page=1&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"