# US Public Domain Checker (books, films, music, art) (`robot-supply-store/us-public-domain-checker`) Actor

Returns the US public-domain status of each book, film, song, recording or artwork you list (public domain, likely, check renewal, protected or unknown), the date it enters the public domain, the rule, caveats and a confidence score. Uses Wikidata and US Copyright Office rules.

- **URL**: https://apify.com/robot-supply-store/us-public-domain-checker.md
- **Developed by:** [Robot Supply Store](https://apify.com/robot-supply-store) (community)
- **Categories:** Education, AI, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 public domain checks

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## US Public Domain Checker (books, films, music, art)

**Returns the US public-domain status of each book, film, song, sound recording or artwork you list (`public_domain`, `likely_public_domain`, `check_renewal`, `protected` or `unknown`), with the date it enters the public domain, the rule applied, caveats and a confidence score.**

Give it titles (a spreadsheet, a JSON list, or one work). It fills in missing facts from [Wikidata](https://www.wikidata.org) (first publication year, type, country, authors' death years), applies the US Copyright Office's term rules, and tells you in plain English why. Every answer comes with the caveats that matter: renewals, later editions, trademarks, and recordings versus songs.

### Who it's for

- Publishers, ebook and audiobook producers, and print-on-demand sellers deciding what they can reprint
- YouTubers, podcasters, filmmakers and game studios clearing old films, music and art
- Used-book and vintage-media sellers, archives and libraries tagging catalogs
- Educators and researchers building course packs
- AI agents that need a yes/no/when answer with the reasoning attached

### What you get

One row per work, in your order:

| Field | Meaning |
|---|---|
| `status` | `public_domain`, `likely_public_domain`, `check_renewal`, `protected` or `unknown` (as of `as_of_date`) |
| `us_public_domain_date`, `public_domain_year` | The day it entered or enters the US public domain: usually a January 1 (pre-1972 recordings: Feb 16, 2067). For `check_renewal`, the latest possible date; empty when it can't be dated. |
| `rule`, `explanation` | The rule applied, e.g. `published_1931_1963_renewal_unknown`, and why in plain English |
| `caveats` | What the status doesn't cover, and notes on the facts used |
| `confidence` | 0–1: how sure the checker is of the status, given the facts it found. Below 0.6, check by hand. |
| `publication_year`, `creation_year`, `creator_death_year`, `country_of_origin` | The facts the rules used |
| `facts_from` | `input`, `input + wikidata` or `wikidata` |
| `wikidata_qid`, `wikidata_label`, `wikidata_description`, `wikidata_url` | The Wikidata item matched, so you can confirm it's the right work |
| `wikidata_copyright_status` | Wikidata's own US copyright statement, if it has one |
| `sources`, `source_url`, `retrieved_at` | The legal sources, the main source, and when the work was checked |
| `work_*` | Your input echoed back, including your own `work_id` |

#### Statuses

| Status | Meaning |
|---|---|
| `public_domain` | Its US copyright has expired (or it never had one, like US federal government works). |
| `likely_public_domain` | Probably public domain, but it rests on something to confirm: Wikidata lists it as public domain in the US (usually a 1931–1963 work that wasn't renewed, or a US work published without a copyright notice before March 1989); or it's an unpublished work more than 120 years old whose author's death year is unknown (a legal presumption); or the year that decides it came from Wikidata and might belong to another version. The `explanation` says which. |
| `check_renewal` | A US work published 1931–1963. It's public domain if its copyright wasn't renewed in its 28th year; if it was (most major films, novels and songs were), it's protected until the date shown. Search the [Copyright Office's records](https://publicrecords.copyright.gov/). |
| `protected` | Still under US copyright; `us_public_domain_date` says until when (empty if the author is alive or unknown). |
| `unknown` | Not enough facts: for example no year and no confident Wikidata match, or a bare title that fits several works (the row lists them; add the type, creator or year). Not charged. |

#### The rules (as of 2026)

From the Copyright Office's [Circular 15A](https://www.copyright.gov/circs/circ15a.pdf) and [17 U.S.C. 1401](https://www.copyright.gov/title17/92chap14.html). Every term runs to the end of a calendar year.

| Work | US term |
|---|---|
| Published 1930 or earlier | Public domain (1931 works enter on **Jan 1, 2027**) |
| US works published 1931–1963 | 95 years if renewed; 28 years if not (`check_renewal`) |
| Foreign works published 1931–1963 | 95 years (restored in 1996 even without renewal or notice, if still protected in their home country then) |
| Published 1964–1977 | 95 years from publication (US works published without a copyright notice may be public domain) |
| Created 1978 or later | Author's life + 70 years; works made for hire and anonymous works: 95 years from publication or 120 from creation, whichever ends first |
| Unpublished works and artworks (never sold as copies) | Life + 70 (works made before 1978: never before Jan 1, 2003). Author's death unknown: presumed public domain 120 years after creation (`likely_public_domain`) |
| Sound recordings released before 1923 | Public domain since Jan 1, 2022 |
| Sound recordings 1923–1946 | 100 years (1926 recordings enter on **Jan 1, 2027**) |
| Sound recordings 1947–1956 | 110 years |
| Sound recordings 1957 to Feb 14, 1972 (and unreleased ones made before then) | Through Feb 15, 2067 |
| US federal government works | Public domain |

#### How facts are chosen

- **Your facts win.** A creator, type and first-publication year make the answer fastest and surest.
- **Wikidata fills the gaps**: which work you mean, its type, first publication, country of origin and the authors' death years.
- **Reprint years are corrected.** If you give a later edition's year and Wikidata confidently lists an earlier first publication (two or more years earlier), the first publication counts, and the row says so. Material new to a later edition has its own copyright. If that earlier year is what makes the work public domain, the status is `likely_public_domain`, because it could be a remake with the same title.
- **Wikidata's own copyright statement is a second opinion.** Only a statement that a work is public domain in the US changes anything: it can turn `check_renewal`, or `protected` for a US work from 1964–1989 (no copyright notice), into `likely_public_domain`. It never overrides your facts or a term that has run out.
- **A bare title must point to one work.** "Frankenstein" alone fits the 1818 novel and several films, so it comes back `unknown` (free) with the candidates listed. Add the type, creator or year.
- If your facts already settle the answer (for example a 1920 book), the work isn't looked up.

### Input

```json
{
  "works": [
    { "id": "W-1", "title": "Frankenstein", "creator": "James Whale", "type": "film", "year": 1931 },
    { "id": "W-2", "title": "The Great Gatsby", "creator": "F. Scott Fitzgerald", "type": "book", "year": 1925 },
    { "id": "W-3", "title": "Heebie Jeebies", "creator": "Louis Armstrong and His Hot Five", "type": "sound_recording", "year": 1926 },
    { "id": "W-4", "title": "Beloved", "creator": "Toni Morrison", "type": "book", "year": 1987 }
  ],
  "as_of_date": "",
  "use_wikidata": true
}
```

- `works`: objects with any of `title`, `creator`, `type` (`book`, `film`, `composition`, `sound_recording`, `artwork`, `other`), `year` (first publication or release; for artworks, the year made), `country`, `creator_death_year`, `published`, `work_for_hire`, `renewed`, `us_government_work`, `qid` (Wikidata id) and `id`. Spreadsheet headers like Book Title, Author, Director, Composer, Released or SKU work too, and a plain string is a title.
- `works_url`: a public CSV or JSON link, including Google Sheets share links.
- `preset`: `2027-entrants` adds 27 notable works entering the US public domain on Jan 1, 2027: the 1931 films *Frankenstein*, *Dracula*, *City Lights* and *M*, the novels *The Good Earth* and *Sanctuary*, songs like "As Time Goes By" and "All of Me", and 1926 recordings by Louis Armstrong, Bessie Smith and Jelly Roll Morton.
- `as_of_date`: judge the status on another day, like `2027-01-01`. Empty means today.
- `use_wikidata`: turn off to use only your own facts.

### Output example

The 1931 *Frankenstein*, checked as of Oct 1, 2026 (the country came from Wikidata):

```json
{
  "work_index": 0,
  "work_id": "W-1",
  "work_title": "Frankenstein",
  "work_creator": "James Whale",
  "work_type": "film",
  "status": "check_renewal",
  "us_public_domain_date": "2027-01-01",
  "public_domain_year": 2027,
  "rule": "published_1931_1963_renewal_unknown",
  "explanation": "Published in 1931: public domain if the copyright wasn't renewed; if it was (common for major films, novels and songs), it enters the public domain on Jan 1, 2027.",
  "caveats": "US works published 1931-1963 are public domain if the copyright wasn't renewed in its 28th year; check the Copyright Office renewal records. A film's underlying works (novel, screenplay, music) have their own terms. Titles, characters and logos can still be protected as trademarks. US status only; other countries have different terms.",
  "confidence": 0.5,
  "publication_year": 1931,
  "creation_year": null,
  "creator_death_year": null,
  "country_of_origin": "US",
  "facts_from": "input + wikidata",
  "wikidata_qid": "Q546829",
  "wikidata_label": "Frankenstein",
  "wikidata_description": "1931 film directed by James Whale",
  "wikidata_url": "https://www.wikidata.org/wiki/Q546829",
  "wikidata_copyright_status": null,
  "as_of_date": "2026-10-01",
  "sources": "https://www.copyright.gov/circs/circ15a.pdf; https://publicrecords.copyright.gov/; https://www.wikidata.org/wiki/Q546829",
  "source_url": "https://www.wikidata.org/wiki/Q546829",
  "retrieved_at": "2026-10-01T01:32:10Z",
  "error": null
}
```

### Pricing

Pay per event: **$0.005 per work checked**. Works that come back `unknown` (not enough facts, or Wikidata unavailable) and rows with nothing to check are **not charged**. The Actor stops cleanly at your maximum cost per run.

### Data sources

- **Rules:** US Copyright Office [Circular 15A, Duration of Copyright](https://www.copyright.gov/circs/circ15a.pdf), and Title 17 of the US Code ([§ 1401](https://www.copyright.gov/title17/92chap14.html) for pre-1972 recordings, [§ 104A](https://www.copyright.gov/title17/92chap1.html#104a) for restored foreign works, [§ 105](https://www.copyright.gov/title17/92chap1.html#105) for government works).
- **Facts:** [Wikidata](https://www.wikidata.org), whose data is free to reuse under [CC0](https://www.wikidata.org/wiki/Wikidata:Licensing), through its public API with a declared User-Agent and a modest request rate.

### Limits

- **US status only.** Other countries have different terms (often life + 70 for everything, with no renewal rule).
- **Renewals aren't checked automatically.** For US works from 1931–1963, the answer is `check_renewal` unless you pass `renewed` or Wikidata has a US copyright statement.
- **Copyright notice isn't checked.** Works published without a notice before March 1, 1989 may already be public domain; the checker flags this but can't see the notice.
- **Only the work you name.** Translations, new editions, arrangements, remakes, recordings of a song, and a film's underlying novel, screenplay and music each have their own terms. Characters, titles and logos can be protected as trademarks.
- Wikidata can be wrong or incomplete. Check the matched item (`wikidata_description`, `wikidata_url`) when `confidence` is below 0.8.
- Big lists take about half a second per looked-up work (Wikidata asks for a modest request rate). Up to 10,000 works per run.

### Disclaimer

- **Not legal advice.** This is an informational tool that applies published rules to available facts. Copyright status can turn on details no database has (notices, registrations, renewals, contracts). Before publishing or selling, confirm with the [Copyright Office's records](https://publicrecords.copyright.gov/) or a qualified attorney.
- **Provided "as is."** This Actor and its results come with no warranty of any kind, express or implied, including accuracy, completeness, fitness for a particular purpose or non-infringement. You're responsible for your own decisions.
- **Not affiliated.** Robot Supply Store is not affiliated with, endorsed by or sponsored by the U.S. Copyright Office or the Wikimedia Foundation. Their names describe where the rules and data come from.

### FAQ

**Why is a famous 1931 film `check_renewal` rather than `protected`?** For US works from 1931–1963, protection past 28 years needed a renewal. Most famous works were renewed, but the checker only says so when it has evidence. Either way, it enters the public domain by the date shown.

**Why does my book show a different year than I gave?** You probably gave a later edition's year. The copyright term runs from first publication, so the checker used Wikidata's earlier first-publication year and says so in `caveats`.

**What's the difference between a song and a recording?** They're separate copyrights. "Bye Bye Blackbird" (the 1926 song) has been public domain since 2022, but a 1926 recording of it is protected until Jan 1, 2027.

**Can an AI agent call this?** Yes. It's pay-per-event, so it's available through Apify's MCP server. Every field is flat JSON with stable names.

**Is this legal advice?** No. It's information to support your own decisions.

# Actor input Schema

## `works` (type: `array`):

Works as JSON objects with any of: title, creator, type (book, film, composition, sound\_recording, artwork, other), year (first publication or release; for artworks, the year it was made), country (of first publication), creator\_death\_year, published (true/false), work\_for\_hire, renewed (for 1931-1963 US works, if you know), us\_government\_work, qid (a Wikidata id such as Q12345) and id (your own reference, echoed back). Common spreadsheet headers work too (Book Title, Author, Director, Composer, Released, Pub Year, SKU), and a plain string counts as a title.

## `works_url` (type: `string`):

Optional. A public link to a CSV or JSON list of works, checked after the works above. Google Sheets share links work. Recognized columns include title/name/book/film/song, creator/author/director/composer/artist, type/format, year/published/released, country, creator\_death\_year, qid/wikidata and id/sku/isbn.

## `preset` (type: `string`):

Optional. Adds a ready-made list of works to check. '2027-entrants': notable films, books and songs from 1931 and sound recordings from 1926, which enter the US public domain on Jan 1, 2027 (Frankenstein, Dracula, The Good Earth, As Time Goes By and more).

## `as_of_date` (type: `string`):

The date to judge the status on. Leave empty for today. Set 2027-01-01 to see what becomes public domain on Public Domain Day 2027. Dates from 1999 on (current US law).

## `use_wikidata` (type: `boolean`):

Look works up on Wikidata (CC0) to fill in the type, first-publication year, country and authors' death years you didn't give, and to catch reprint years. Turn off to use only your own facts (faster).

## Actor input object example

```json
{
  "works": [
    {
      "id": "BK-17",
      "title": "The Good Earth",
      "creator": "Pearl S. Buck",
      "type": "book",
      "year": 1931,
      "country": "US"
    }
  ],
  "works_url": "https://docs.google.com/spreadsheets/d/your-sheet-id/edit#gid=0",
  "preset": "2027-entrants",
  "as_of_date": "2027-01-01",
  "use_wikidata": true
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset items with status, us\_public\_domain\_date, public\_domain\_year, rule, explanation, caveats, confidence, publication\_year, creation\_year, creator\_death\_year, country\_of\_origin, facts\_from, wikidata\_qid, wikidata\_label, wikidata\_description, wikidata\_url, wikidata\_copyright\_status, your work fields echoed back, the as-of date, the legal sources and when the facts were retrieved.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "works": [
        {
            "id": "W-1",
            "title": "Frankenstein",
            "creator": "James Whale",
            "type": "film",
            "year": 1931
        },
        {
            "id": "W-2",
            "title": "The Great Gatsby",
            "creator": "F. Scott Fitzgerald",
            "type": "book",
            "year": 1925
        },
        {
            "id": "W-3",
            "title": "Heebie Jeebies",
            "creator": "Louis Armstrong and His Hot Five",
            "type": "sound_recording",
            "year": 1926
        },
        {
            "id": "W-4",
            "title": "Beloved",
            "creator": "Toni Morrison",
            "type": "book",
            "year": 1987
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("robot-supply-store/us-public-domain-checker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "works": [
        {
            "id": "W-1",
            "title": "Frankenstein",
            "creator": "James Whale",
            "type": "film",
            "year": 1931,
        },
        {
            "id": "W-2",
            "title": "The Great Gatsby",
            "creator": "F. Scott Fitzgerald",
            "type": "book",
            "year": 1925,
        },
        {
            "id": "W-3",
            "title": "Heebie Jeebies",
            "creator": "Louis Armstrong and His Hot Five",
            "type": "sound_recording",
            "year": 1926,
        },
        {
            "id": "W-4",
            "title": "Beloved",
            "creator": "Toni Morrison",
            "type": "book",
            "year": 1987,
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("robot-supply-store/us-public-domain-checker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "works": [
    {
      "id": "W-1",
      "title": "Frankenstein",
      "creator": "James Whale",
      "type": "film",
      "year": 1931
    },
    {
      "id": "W-2",
      "title": "The Great Gatsby",
      "creator": "F. Scott Fitzgerald",
      "type": "book",
      "year": 1925
    },
    {
      "id": "W-3",
      "title": "Heebie Jeebies",
      "creator": "Louis Armstrong and His Hot Five",
      "type": "sound_recording",
      "year": 1926
    },
    {
      "id": "W-4",
      "title": "Beloved",
      "creator": "Toni Morrison",
      "type": "book",
      "year": 1987
    }
  ]
}' |
apify call robot-supply-store/us-public-domain-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,robot-supply-store/us-public-domain-checker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VvUNBth8hrYdqlDvk/builds/F3joQKhhsRg77cobr/openapi.json
