Copyright APIpublicrecords.copyright.gov ↗
Search and retrieve U.S. Copyright Office registration and recordation records via 2 endpoints. Get titles, claimants, authors, dates, and structured catalog data.
What is the Copyright API?
The Copyright Office Public Records API provides access to the U.S. Copyright Office's CPRS database through 2 endpoints, returning registration and recordation records with fields including registration numbers, claimants, authors, titles, and structured catalog properties. The search_copyright endpoint accepts keyword queries across registration numbers, author names, titles, and publishers, while get_record_details returns the full catalog entry for any matched record.
curl -X GET 'https://api.parse.bot/scraper/3714fec5-cf40-4b14-964e-b162a7ac0dbd/search_copyright?query=RE0000897325' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace publicrecords-copyright-gov-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: U.S. Copyright Office Public Records — search, browse, and fetch full details."""
from parse_apis.publicrecords_copyright_gov_api import CopyrightOffice, RecordNotFound
client = CopyrightOffice()
# Search for copyright records by keyword; limit= caps total items fetched.
for summary in client.record_summaries.search(query="Hotel California", limit=5):
print(summary.title, "|", summary.type_of_record, "|", summary.representative_date)
# Drill-down: take the first result and navigate to its full detail record.
hit = client.record_summaries.search(query="Hotel California", limit=1).first()
if hit is not None:
record = hit.details()
print("Title:", record.title)
print("Registration:", record.registration_number, record.registration_date)
print("Class:", record.registration_class, "| Status:", record.registration_status)
print("Claimants:", record.claimants)
for person in record.names:
print(f" {person.name} — {', '.join(person.roles)}")
if record.properties.renewal_registration_for:
print("Renews:", record.properties.renewal_registration_for)
# Point lookup by a known public_records_id discovered from the search.
if hit is not None:
try:
detail = client.records.get(public_records_id=hit.public_records_id)
print("Fetched:", detail.record_type_label)
except RecordNotFound:
print("Record no longer available")
print("exercised: record_summaries.search / details / records.get")
Search copyright records by keyword (registration numbers, authors, publishers, claimants, titles, etc.). Returns paginated results sorted by relevance. Each result includes a public_records_id that can be passed to get_record_details for full information.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (1-based). |
| limit | integer | Number of results per page (1-50). |
| queryrequired | string | Search query — copyright registration numbers (e.g. RE0000897325), author names, titles, publishers, or claimants. |
{
"type": "object",
"fields": {
"page": "Current page number",
"limit": "Results per page",
"results": "Array of copyright records with public_records_id, type_of_record, title, registration_number, registration_date, recordation_date, recordation_number, type_of_work, representative_date, claimants, names, and system_of_origin",
"total_results": "Total number of matching records"
},
"sample": {
"data": {
"page": 1,
"limit": 10,
"results": [
{
"names": [
{
"name": "Felder, Don",
"roles": [
"author"
]
},
{
"name": "Henley, Don",
"roles": [
"author",
"claimant"
]
}
],
"title": "Hotel California. w & m Don Henley, Glenn Frey & Don Felder.",
"claimants": [
"Don Henley & Glenn Frey (A)"
],
"type_of_work": "Music",
"type_of_record": "registration",
"recordation_date": null,
"system_of_origin": "voyager",
"public_records_id": "voyager_7778017",
"registration_date": "2004-02-09",
"recordation_number": null,
"registration_number": "RE0000897325",
"representative_date": "2004-02-09"
}
],
"total_results": 5
},
"status": "success"
}
}About the Copyright API
What the API covers
This API exposes records from the U.S. Copyright Office Public Records System (CPRS), covering both copyright registrations and recordations. Records include metadata such as registration_number, registration_date, recordation_date, type_of_work (e.g. Music, Literary Work), and type_of_record (either registration or recordation). Each record originates from a named source system (the system_of_origin field, e.g. voyager) and carries a stable public_records_id used for detail lookups.
Searching records
The search_copyright endpoint accepts a required query string and supports pagination via page (1-based) and limit (1–50 results per page). Queries can target registration numbers like RE0000897325, author names, titles, publishers, or claimants. The response includes total_results so you can calculate page counts, and each result in the results array carries a public_records_id to pass to the detail endpoint.
Retrieving full record details
Passing a public_records_id to get_record_details returns the complete catalog entry: a names array with associated persons and their roles, a claimants array, variant_titles for alternate or translated titles, a type_of_work classification, and a properties object containing all structured fields from the copyright catalog. This is where granular registration data — not surfaced in search results — becomes accessible.
The Copyright API is a managed, monitored endpoint for publicrecords.copyright.gov — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when publicrecords.copyright.gov changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official publicrecords.copyright.gov API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Verify copyright ownership for a specific work by querying the claimants and registration_date fields
- Look up all registrations associated with a given author or publisher using search_copyright with a name query
- Retrieve variant titles for a work to identify alternate or translated versions via get_record_details
- Build a rights clearance tool that checks registration status before licensing content
- Cross-reference registration numbers found in contracts against CPRS records for due diligence
- Catalog the type_of_work distribution across a set of queried records (Music, Literary Work, etc.)
- Identify recordation dates for copyright transfers and assignments to track chain of title
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.