PMG Notes APIpmgnotes.com ↗
Access PMG banknote population report data: grading census by country, denomination, and grade level. Retrieve over 200 countries plus PMG news articles.
What is the PMG Notes API?
This API exposes 6 endpoints covering the PMG Population Report, the primary grading census for world banknotes. Starting with get_population_report_countries, which returns over 200 country and region entries each with a NoteCensusCount, you can drill down through categories and subcategories to pull per-note grade distributions across all PMG grade levels — down to exact counts for every grade a note has received.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/7431b8eb-aeb8-4f8d-b609-40931e9461ab/get_population_report_countries' \ -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 pmgnotes-com-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: PMG Banknote API — population reports, note census, and news."""
from parse_apis.pmg_banknote_api import PMG, SubcategoryNotFound
client = PMG()
# List all countries in the population report, capped at 5.
for country in client.countries.list(limit=5):
print(country.name, country.note_census_count)
# Drill into a specific country's categories and subcategories.
afghanistan = client.country(id=1)
for cat in afghanistan.categories(limit=3):
print(cat.name, cat.total_graded)
# Get denominations for a country + category.
for subcat in afghanistan.subcategories(category_id=1, limit=3):
print(subcat.name, subcat.total_graded)
# Fetch notes for a subcategory with grade distributions.
denom = client.subcategory(id=8655)
try:
note = denom.notes(limit=1).first()
if note:
print(note.note_number_display, note.denomination, note.total_graded)
except SubcategoryNotFound as exc:
print(f"Subcategory gone: {exc}")
# Search for notes by keyword within a country.
for result in afghanistan.search(query="50", limit=3):
print(result.note_number_display, result.denomination, result.url)
# Latest news articles.
for article in client.articles.list(limit=3):
print(article.title, article.post_date)
print("exercised: countries.list / country.categories / country.subcategories / subcategory.notes / country.search / articles.list")
Retrieve the top-level list of all countries and regions available in the PMG Population Report. Returns over 200 entries with note census counts and identifiers for drilling into categories. Each country carries a CCGResourceCountryID used to fetch its categories and subcategories.
No input parameters required.
{
"type": "object",
"fields": {
"data": "object containing items array of country objects with Name, SeoName, CCGResourceCountryID, NoteCensusCount, PMGCode"
},
"sample": {
"data": {
"items": [
{
"Name": "Afghanistan",
"PMGCode": "AFG",
"SeoName": "afghanistan",
"NoteCensusCount": 5669,
"CCGResourceCountryID": 1
}
]
},
"status": "success"
}
}About the PMG Notes API
Navigation Hierarchy
The PMG population report is structured as a three-level hierarchy. get_population_report_countries returns the top level: all countries and regions with fields like Name, SeoName, CCGResourceCountryID, and NoteCensusCount. Pass a CCGResourceCountryID to get_population_report_categories to get the era or region groupings for that country, each carrying a PMGResourceCategoryID and a TotalGraded count. Then pass both IDs to get_population_report_subcategories to retrieve denominations with their own PMGResourceSubcategoryID values and cumulative grading totals.
Census Detail and Search
get_population_report_notes is where the grading distribution lives. It requires a subcategory_id and accepts an optional page parameter (fixed page size of 75) and an optional issuer filter — note that issuer must match exact internal values. Each item in the Items array carries the full grade distribution across all PMG grade levels alongside identifiers and descriptive fields. search_population_report lets you query by keyword within a specific country_id, returning matching notes with fields including ImportNoteID, NoteNumberDisplay, Category, Subcategory, Denomination, and a URL linking to the population report detail view.
News Archive
get_news_articles provides a paginated archive of PMG news articles dating back to 2002. Each page returns 10 items with Title, Teaser, PostDate, and ArticleUrl. Pagination is controlled by the page parameter; the response includes TotalCount, PageCount, and PageSize for traversal.
The PMG Notes API is a managed, monitored endpoint for pmgnotes.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when pmgnotes.com 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 pmgnotes.com 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?+
- Build a rarity tracker that monitors
TotalGradedcounts across denominations to surface notes with low census populations. - Create a grade distribution chart for a specific note series by pulling the full
Itemsarray fromget_population_report_notes. - Index searchable note data by running
search_population_reportacross countries and cachingImportNoteIDandDenominationfields. - Automate a portfolio valuation tool that tracks PMG grade counts for specific banknotes over time using subcategory IDs.
- Power a collector alert system that monitors changes in
NoteCensusCountfor target country entries. - Aggregate PMG news headlines and teasers for a numismatic news feed using
get_news_articleswith date-sorted pagination. - Generate country-level census summaries by combining
NoteCensusCountfrom countries withTotalGradeddata from subcategories.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does PMG Notes have an official developer API?+
What does `get_population_report_notes` return, and how does filtering work?+
get_population_report_notes returns a paginated object with an Items array where each entry includes the complete grade distribution across all PMG grade levels for notes in that subcategory. Pagination is fixed at 75 items per page. The optional issuer filter narrows results but must match exact internal issuer values — there is no endpoint to enumerate valid issuer strings, so this typically requires a prior search or known values.Does the API return individual certification lookup by PMG certificate number?+
How far back do news articles go, and is full article body included?+
get_news_articles endpoint returns articles dating back to 2002. Each article includes Title, Teaser, PostDate, and ArticleUrl, but the full article body text is not returned. You can fork it on Parse and revise to add an endpoint that retrieves full article content via the ArticleUrl.Does the search endpoint work across all countries at once?+
search_population_report requires a country_id parameter, so each search call is scoped to a single country. Cross-country search is not supported in a single request. You can fork this API on Parse and revise it to add a multi-country search by fanning out requests across country IDs.