Student project resource

Museum Collection APIs

Open collection APIs from art museums you can use to build a project. Each project lives in a public GitHub repository you own and deploys to the Vercel Hobby plan.

Checked against the official docs and live requests on October 20, 2026 APIs change. Read each API's docs and terms before you build.

Where to start

Pick one API and get artworks showing on a page before adding a second.

Start hereArt Institute of Chicago or Cleveland

No key, simple JSON and open images. You can have artworks on screen in an afternoon.

Good alternativesThe Met or the V&A

No key. The Met needs one extra request per object; the V&A asks for non-commercial use and a credit line.

More challengingRijksmuseum

No key, but its records use Linked Art, a nested format that takes more work to read.

Level upHarvard Art Museums

Needs a free key. Teaches environment variables and a server-side proxy.

At a glance

Every API here accepts requests from browser JavaScript (CORS is open). The deciding questions are whether you need a key and which images you may show.

APIKeyImages you can showLimitsWatch out for
Art Institute of ChicagoNonePublic domain (is_public_domain)60 requests/min per IPSend an AIC-User-Agent header
Cleveland Museum of ArtNoneCC0 (cc0=1)None publishedMax 1,000 search results; skip _full.tif files
The MetNonePublic domain (isPublicDomain)80 requests/secUse /v1.1/search; one request per object
V&ANoneNon-commercial and educational, with credit1 request/sec, 3,000/dayCache for 4 weeks at most
RijksmuseumNonePer item: CC0, CC BY or restrictedNone publishedOld API is gone; Linked Art format
Harvard Art MuseumsFree keyNon-commercial; many modern works restricted~2,500 calls/dayCache for 2 weeks at most
Smithsonian Open AccessFree keyOnly items marked CC01,000 requests/hourDocs are dated (2021)
EuropeanaFree keyPer item (reusability=open)Fair use, unpublishedKey goes in a header, never in code
Artstor (JSTOR)No APINot on public websitesn/aUse for research only
No key needed

Call these straight from the browser

No secrets are involved, so these are safe to call from browser code in a public repo. Click the example links to see real responses.

Chicago, Illinois

Art Institute of Chicago API

No keyIIIF imagesCC0 data
Base URL
https://api.artic.edu/api/v1/
Licence
Data is CC0, except the description field (CC BY 4.0). Not every image is public domain: filter on is_public_domain=true.
Images
IIIF: {iiif_url}/{image_id}/full/843,/0/default.jpg. Read iiif_url from the response's config instead of hard-coding it. A width of 843 px loads fastest because it's usually cached.
Limits
60 requests per minute per IP. Add an AIC-User-Agent header with your project name and email.
Gotchas
  • Use fields= to keep responses small.
  • Paging stops at 10,000 results. For bulk data, use the nightly data dump instead.
  • Use HTTPS; HTTP is deprecated.
Try it
/artworks/search?q=monet /artworks/27992 Sample IIIF image
Cleveland, Ohio

Cleveland Museum of Art Open Access API

No keyDirect image URLsCC0 data
Base URL
https://openaccess-api.clevelandart.org/api/
Licence
All metadata is CC0. Images are CC0 only when share_license_status is CC0, so filter with cc0=1.
Images
Plain JPEG links in the record, e.g. …/{accession}/{accession}_web.jpg. Use _web or _print. Never load _full.tif, which can be about 500 MB.
Endpoints
/artworks/?q=&has_image=1&cc0=1&skip=&limit=, /artworks/{id or accession}, plus /creators and /exhibitions.
Gotchas
  • Search returns at most 1,000 results.
  • Some fields were renamed: web_image → has_image, fun_fact → did_you_know. Older tutorials may use the old names.
Try it
/artworks/?q=monet&cc0=1 /artworks/1958.39
New York, New York

The Metropolitan Museum of Art Collection API

No keyDirect image URLsCC0 dataSearch changed Oct 2026
Base URL
https://collectionapi.metmuseum.org/public/collection/
Licence
Open Access data is CC0. Check isPublicDomain on each object.
Images
primaryImageSmall (web size), primaryImage (full size), and additionalImages[]. These fields can be empty strings.
Limits
80 requests per second.
Gotchas
  • Use /v1.1/search. The old /v1/search was retired on October 1, 2026 and now returns HTTP 410, so most older tutorials break.
  • v1.1 search returns up to 100 results unless you pass offset and limit, with a combined maximum of 10,000.
  • Search returns only object IDs, so each object needs a second request. Fetch a small page of them at a time.
  • The API sits behind bot protection that may block heavy or server-side traffic, so call it from the browser where you can.
Try it
/v1.1/search?q=sunflowers /v1/objects/436524 /v1/departments
London, United Kingdom

Victoria and Albert Museum API (v2)

No keyIIIF imagesNon-commercial terms
Base URL
https://api.vam.ac.uk/v2/
Licence
Non-commercial personal and educational use only; the data is not CC0. Credit images "© Victoria and Albert Museum, London". Show images from the URLs the API returns rather than saving copies.
Images
IIIF: https://framemark.vam.ac.uk/collections/{imageId}/full/!600,600/0/default.jpg. Search results include _primaryImageId.
Limits
At most 1 request per second and 3,000 per day. page_size can't exceed 100.
Gotchas
  • Don't cache API content for more than four weeks, and don't commit downloaded data to your repo.
  • _primaryTitle is often empty, so fall back to objectType.
  • Plain q searches match loosely. The id_* filters are more precise.
Try it
/objects/search?q=teapot /object/O94917 Sample IIIF image
Amsterdam, Netherlands

Rijksmuseum Data Services

No keyIIIF imagesLinked Art format
Status
The old key-based API at rijksmuseum.nl/api/… is shut down and returns HTTP 410. The newer data services that replaced it need no key.
Licence
Each item is marked CC0, CC BY 4.0 or restricted. Credit the Rijksmuseum.
Search
Returns up to 100 object IDs per page. Use pageToken to get the next page. Fetch each object with https://id.rijksmuseum.nl/{id}?_profile=la-framed.
Images
IIIF at https://iiif.micr.io/{id}/full/max/0/default.jpg. To find an image ID, follow the record's links to its digital object.
Gotchas
  • Tutorials that use objectNumber or webImage were written for the old API and no longer work.
  • Linked Art records are nested JSON-LD. Plan time to explore them before building UI.
Try it
/search/collection?creator=Rembrandt
Free key required

Keep the key on the server

Each student gets their own key. Because your repository is public, the key must never appear in your code, your commits or anything sent to the browser. See Keeping keys secret.

Cambridge, Massachusetts

Harvard Art Museums API

Free keyIIIF imagesNon-commercial terms
Base URL
https://api.harvardartmuseums.org
Get a key
Fill out the Google Form linked from the documentation. Pass the key as the apikey query parameter.
Terms
  • Non-commercial use only.
  • Don't cache content for more than two weeks.
  • Show images from the API's URLs rather than copying them to your server.
  • Credit the museums and link back to harvardartmuseums.org.
  • Many 20th- and 21st-century images are rights-restricted.
Limits
About 2,500 calls per day. Data refreshes daily around 6 a.m.
Images
IIIF from nrs.harvard.edu (baseimageurl / primaryimageurl). Manifests at iiif.harvardartmuseums.org/manifests/object/{id}.
Endpoints
/object?apikey=KEY&keyword=rabbit&hasimage=1&size=10&page=1 and /object/{id}
Washington, D.C.

Smithsonian Open Access API

Free keyIIIF imagesCC0 items flagged
Base URL
https://api.si.edu/openaccess/api/v1.0
Get a key
Sign up at api.data.gov; you may need to verify your email. Send the key as the api_key query parameter or the X-Api-Key header. Avoid DEMO_KEY, which is heavily rate-limited.
Licence
Use only records and media marked CC0. Check metadata_usage.access and each media item's usage.access.
Limits
1,000 requests per hour per key.
Images
Delivery URLs on ids.si.edu (thumb, screen, jpg), plus IIIF at https://ids.si.edu/ids/iiif/{idsId}/info.json.
Endpoints
/search?q=…, /category/art_design/search, /content/{id}. The docs date from 2021, so expect some gaps.
Europe-wide aggregator

Europeana APIs

Free keyIIIF manifestsLicence varies by item
Search URL
https://api.europeana.eu/record/v2/search.json
Get a key
Create a free Europeana account, then open Manage API keys. A personal key is issued instantly, and Europeana recommends that every student and teacher use their own.
Passing the key
Use the X-Api-Key header. The wskey query parameter is deprecated. Europeana's rules say keys must not appear in user interfaces, code or markup, so call it from a server function.
Licence
Each item has its own rights statement. Filter with reusability=open and media=true, and show each item's licence.
Limits
Covered by a fair-use policy with no published numbers. Personal-key limits were reduced in 2025–26.
Images
edmPreview thumbnails, edmIsShownBy (served by the item's home institution), and IIIF manifests at https://iiif.europeana.eu/presentation/{record_id}/manifest.

Keeping keys secret on Vercel

Anything in a public repo, or in JavaScript sent to the browser, is visible to everyone. The fix is a small serverless function. The browser calls your function, and your function calls the museum with the key.

  1. Add .env* to .gitignore before your first commit.
  2. Store the key in Vercel, either from the project's Settings → Environment Variables page or with vercel env add HARVARD_API_KEY.
  3. For local development, run vercel env pull to download it to a git-ignored .env.local file.
  4. Create a function such as api/harvard.js that reads process.env.HARVARD_API_KEY, and have your page fetch /api/harvard?q=….
// api/harvard.js — runs on Vercel's servers, never in the browser
export default async function handler(req, res) {
  const q = encodeURIComponent(req.query.q ?? "");
  const url = `https://api.harvardartmuseums.org/object` +
    `?apikey=${process.env.HARVARD_API_KEY}&keyword=${q}&hasimage=1&size=12`;

  const museum = await fetch(url);
  // Cache for a day at Vercel's edge: faster pages, fewer API calls
  res.setHeader("Cache-Control", "s-maxage=86400, stale-while-revalidate");
  res.status(museum.status).json(await museum.json());
}
If a key gets committed by mistake

Deleting the file is not enough, because the key stays in the git history. Ask the provider for a new key, stop using the old one, and update the Vercel environment variable.

Ground rules for every project

Library resource, not an API

Artstor and JSTOR

Use Artstor for research, not as a data source for your site.

JSTOR's terms prohibit automated downloading and scraping, and putting its content into open websites or databases. A public Vercel site built on Artstor images would break those terms. There is no public Artstor API.

Worth exploring

Harvard LibraryCloud

Harvard Library's public catalog API covers HOLLIS records, including HOLLIS Images. It needs no key and accepts browser requests. A search for "monet" returned 4,317 records.

Sources