API v3.0

Build with the most comprehensive content sensitivity dataset on the internet.

Base URL: https://www.doesthedogdie.com/api/v3

Quick Start

Terms

TermDescription
ItemA movie, TV show, book, or other piece of media.
ItemTypeThe kind of media — movie, TV show, book, etc. Determines which index and position labels apply.
TopicA type of trigger or content warning (e.g. "a dog dies", "there are jump scares").
TopicCategoryA grouping of related topics (e.g. "Animal Death", "Drugs/Alcohol").
TopicSuperCategoryA high-level grouping of topic categories (e.g. "Animals", "Mental Health").
RatingA single report combining an item, a topic, a yes/no vote, and optional details about a specific instance of a trigger in that item — such as a description, or timestamps.
TopicItemStatRolled-up yes/no vote totals and comment count for an item/topic pair.

Data Model

The API is organized around these core entities:

API Data Model
Tier note: Community-submitted timestamps and comments are available at the Startup tier. Professionally developed Scene Alerts — with precise cue timestamps, trigger descriptions, and safe-to-resume points — are available at the Pro tier and above.

Understanding Indexes & Positions

Ratings have index1, index2, and position fields whose meaning depends on the item type. The /itemtypes endpoint provides labels for each.

FieldMovieTV ShowBookMeaning
index1SeasonChapterSegment of the media the rating applies to. -1 if not set.
index2EpisodeSub-segment. -1 if not set.
position1/2/3H : M : SH : M : STimestamp of the triggering content.
safePosition1/2/3H : M : SH : M : STimestamp where it's safe to resume watching.

Walkthrough

1 Search for an item:

Request
curl -H 'X-API-KEY: YOUR_KEY' 'https://www.doesthedogdie.com/api/v3/items?q=old%20yeller'
Response
[
  {
    "id": 10752,
    "name": "Old Yeller",
    "genres": ["adventure"],
    "releaseYear": 1957,
    "itemTypeId": 15,
    "itemTypeName": "Movie",
    "tmdbId": 22660,
    "imdbId": "tt0050798",
    "posterImage": "https://www.doesthedogdie.com/content/cpmJy...",
    "overview": "Young Travis Coates is left to take care of..."
  }
]

2 Get full details and topic stats:

Request
curl -H 'X-API-KEY: YOUR_KEY' 'https://www.doesthedogdie.com/api/v3/items/10752'
Response
{
  "id": 10752,
  "name": "Old Yeller",
  ...
  "topicItemStats": [
    {
      "topicItemId": 395866,
      "yesSum": 57,
      "noSum": 3,
      "numComments": 7,
      "topicId": 153,
      "topicName": "a dog dies",
      "itemId": 10752
    }
  ]
}

The topicItemStats array shows yes/no vote totals and comment count per topic for the item.

3 Get detailed ratings for a specific topic (Startup tier+):

Request
curl -H 'X-API-KEY: YOUR_KEY' 'https://www.doesthedogdie.com/api/v3/items/10752/ratings?topicId=153'
Response
[
  {
    "id": 3369418,
    "yes": 1,
    "no": 0,
    "triggerDescription": "The dog is shot by his owner...",
    "cueDescription": "Travis picks up the gun.",
    "position1": 1,  // hours
    "position2": 18, // minutes
    "position3": 42, // seconds
    "safePosition1": 1,
    "safePosition2": 20,
    "safePosition3": 5,
    "isSceneAlert": true,
    "itemId": 10752,
    "topicId": 153
  }
]

Ratings where isSceneAlert is true are professionally produced Scene Alerts with precise timestamps and descriptions.

Authentication

All requests require an X-API-KEY header with your API key from your profile page.

curl -H 'X-API-KEY: ddd_abc123...' 'https://www.doesthedogdie.com/api/v3/items?q=jaws'

All responses are JSON. No Accept header required.

Tiers & Rate Limits

Each user account has a tier that determines rate limits and data access. Upgrade your tier →

TierReq / MinReq / MonthRatings Access
Free305,000None
Startup12050,000Community (includes community timestamps)
Pro600500,000Community + Scene Alerts
EnterpriseUnlimitedUnlimitedCommunity + Scene Alerts

Rate limit headers are included on every response:

X-RateLimit-Limit-MinuteYour per-minute limit
X-RateLimit-Remaining-MinuteRequests remaining this minute
X-RateLimit-Limit-MonthYour monthly limit
X-RateLimit-Remaining-MonthRequests remaining this month

When a limit is exceeded you'll receive 429 Too Many Requests with a Retry-After header.

Endpoints

Search Items

GET/api/v3/items?q={searchTerm}

Also accepts ?imdb={id}, ?tmdb={id}, ?name={exactName}, ?name={name}&releaseYear={year}

[
  {
    "id": 10752,
    "name": "Old Yeller",
    "genres": ["adventure"],
    "releaseYear": 1957,
    "itemTypeId": 15,
    "itemTypeName": "Movie",
    "tmdbId": 22660,
    "imdbId": "tt0050798",
    "backgroundImage": "https://www.doesthedogdie.com/content/dYxm...",
    "posterImage": "https://www.doesthedogdie.com/content/cpmJ...",
    "overview": "Young Travis Coates is left to take care of..."
  }
]

Item Detail

GET/api/v3/items/{itemId}
{
  "id": 10752,
  "name": "Old Yeller",
  "genres": ["adventure"],
  "releaseYear": 1957,
  "itemTypeId": 15,
  "itemTypeName": "Movie",
  "tmdbId": 22660,
  "imdbId": "tt0050798",
  "backgroundImage": "...",
  "posterImage": "...",
  "overview": "...",
  "topicItemStats": [
    {
      "topicItemId": 395866,
      "yesSum": 57,
      "noSum": 3,
      "numComments": 7,
      "topicId": 153,
      "topicName": "a dog dies",
      "itemId": 10752
    }
  ]
}

Item Ratings

Startup tier or above required. Free tier receives 403. Startup gets community ratings and timestamps. Pro and Enterprise also get Scene Alerts.
GET/api/v3/items/{itemId}/ratings

Optional: ?topicId={topicId} to filter by topic

Only ratings with substantive content are returned — those with a comment, cue description, or timestamp. Bare yes/no votes are excluded.

[
  {
    "id": 3369418,
    "yes": 1,
    "no": 0,
    "voteSum": 0,
    "triggerDescription": "The dog is shot by his owner...",
    "isRampant": false,
    "index1": -1,
    "index2": -1,
    "position1": 1,
    "position2": 18,
    "position3": 42,
    "safePosition1": 1,
    "safePosition2": 20,
    "safePosition3": 5,
    "cueDescription": "Travis picks up the gun.",
    "itemId": 10752,
    "topicId": 153,
    "isSceneAlert": true
  }
]

Topics

GET/api/v3/topics
[
  {
    "id": 153,
    "name": "a dog dies",
    "notName": "no dogs die",
    "keywords": "Dog death, canine death...",
    "description": "...",
    "doesName": "Does the dog die",
    "listName": "where the dog dies",
    "minimalName": "dogs dying",
    "topicCategoryId": 56,
    "altTopicCategoryId": 22
  }
]

Item Types

Returns all item types with their field labels. Use these to interpret index1, index2, and position fields on ratings.

GET/api/v3/itemtypes
[
  {
    "id": 15,
    "name": "Movie",
    "slug": "movie",
    "verb": "watch",
    "pastTenseVerb": "watched",
    "index1Label": null,
    "index2Label": null,
    "position1Label": "Hours",
    "position2Label": "Minutes",
    "position3Label": "Seconds"
  },
  {
    "id": 16,
    "name": "TV",
    "slug": "tv",
    "verb": "watch",
    "pastTenseVerb": "watched",
    "index1Label": "Season",
    "index2Label": "Episode",
    "position1Label": "Hours",
    "position2Label": "Minutes",
    "position3Label": "Seconds"
  },
  {
    "id": 14,
    "name": "Book",
    "slug": "books",
    "verb": "read",
    "pastTenseVerb": "read",
    "index1Label": "chapter",
    "index2Label": null,
    "position1Label": null,
    "position2Label": null,
    "position3Label": null
  }
]

Topic Categories

GET/api/v3/topiccategories
[
  {
    "id": 56,
    "name": "Animal Injury or Death",
    "topicSuperCategoryId": 3
  },
  {
    "id": 22,
    "name": "Sad & Stressful Themes",
    "topicSuperCategoryId": 2
  }
]

Topic Super Categories

GET/api/v3/topicsupercategories
[
  {
    "id": 2,
    "name": "Emotional Spoilers",
    "shortName": "Emotional"
  },
  {
    "id": 3,
    "name": "Disturbing Content",
    "shortName": "Disturbing"
  }
]

Errors

All error responses follow this format:

{
  "error": "error_code",
  "message": "Human-readable description"
}
StatusCodeDescription
401missing_api_keyNo X-API-KEY header provided
401invalid_api_keyAPI key not found or revoked
403upgrade_requiredEndpoint requires a higher tier
429rate_limit_exceededPer-minute rate limit hit
429monthly_limit_exceededMonthly request limit hit