{"id":"providers/princeton-art-museum","relativePath":"providers/princeton-art-museum.md","title":"Princeton University Art Museum API Integration Plan","markdown":"# Princeton University Art Museum API Integration Plan\n\nStatus: Planned (B5 provider slice)  \nUpdated: May 30, 2026\n\n## Official source\n\n- API base/docs: <https://data.artmuseum.princeton.edu>\n\n## Key platform facts (from official docs)\n\n- Base API host: `https://data.artmuseum.princeton.edu`\n- No authentication currently required (explicitly subject to change in future API versions).\n- Primary resources:\n  - Objects\n  - Makers\n  - Packages\n  - Search\n- All responses are JSON.\n- Static full dataset downloads are offered and refreshed weekly (recommended for non-dynamic bulk workflows).\n- Media payloads include IIIF 3-style URIs, e.g.:\n  - `https://media.artmuseum.princeton.edu/iiif/3/collection/...`\n\n## Integration goals\n\n- Add Princeton as a first-class B5 provider through `provider-interface`.\n- Preserve rich object context (makers, texts, exhibitions, geography, terms, classifications, media) in `_source.raw` while mapping stable Linked Art boundary fields.\n- Preserve IIIF media/service references for downstream deep-zoom/manifest work.\n\n## Proposed implementation slice\n\n### Adapter\n\n- `src/adapters/princeton.ts`\n  - profile descriptor\n  - object fetch + search helpers\n  - normalizer to `SourceRecord` + `Artwork` boundary DTO\n  - IIIF media URL extraction helpers\n\n### Routes\n\n- `GET /api/princeton/profile`\n- `POST /api/princeton/search`\n- `POST /api/princeton/object`\n- `POST /api/princeton/import`\n\n### UI\n\n- add `princeton` source toggle in `/explore`\n- show source attribution + image/reuse status + media links in detail views\n\n## Env configuration\n\n- `PRINCETON_API_BASE` (default: `https://data.artmuseum.princeton.edu`)\n- `PRINCETON_API_AUTH_MODE` (default: `none`; supports future token/header mode without refactor)\n\n## Operational guardrails\n\n- Since static weekly exports are available, avoid naive high-frequency crawling for large-scale bulk ingest.\n- Keep route-layer pagination caps and timeouts to protect request budgets.\n- Preserve provenance and attribution data from Princeton payloads.\n\n## Standards mapping + tests\n\nRequired rounds (minimum): object/provenance/shared-structure + protocol/search rounds.\n\nRequired tests (failing-first):\n\n- `tests/adapters/princeton.test.ts`\n- `tests/api/princeton/profile.test.ts`\n- `tests/api/princeton/search.test.ts`\n- `tests/api/princeton/object.test.ts`\n- `tests/api/princeton/import.test.ts`\n\nProvider-specific conformance tests:\n\n- rich nested field passthrough safety (`texts`, `media`, `exhibitions`, `geography`, `terms`)\n- IIIF URI extraction and canonical media-link mapping\n- no-auth default mode + forward-compatible auth-mode branching\n\nProtocol checks (B8):\n\n- OPTIONS/CORS behavior on Princeton routes\n- response shape conformance\n- URI opacity + array-cardinality safety where applicable\n\n## Exit criteria\n\n- Adapter + routes + tests green.\n- `/explore` can search/import Princeton records.\n- PR includes Standards Mapping note with round + fixture anchor coverage.\n","sections":[{"level":2,"heading":"Official source","anchor":"official-source"},{"level":2,"heading":"Key platform facts (from official docs)","anchor":"key-platform-facts-from-official-docs"},{"level":2,"heading":"Integration goals","anchor":"integration-goals"},{"level":2,"heading":"Proposed implementation slice","anchor":"proposed-implementation-slice"},{"level":3,"heading":"Adapter","anchor":"adapter"},{"level":3,"heading":"Routes","anchor":"routes"},{"level":3,"heading":"UI","anchor":"ui"},{"level":2,"heading":"Env configuration","anchor":"env-configuration"},{"level":2,"heading":"Operational guardrails","anchor":"operational-guardrails"},{"level":2,"heading":"Standards mapping + tests","anchor":"standards-mapping-tests"},{"level":2,"heading":"Exit criteria","anchor":"exit-criteria"}],"html":"<h1 id=\"princeton-university-art-museum-api-integration-plan\">Princeton University Art Museum API Integration Plan</h1>\n<p>Status: Planned (B5 provider slice)  </p>\n<p>Updated: May 30, 2026</p>\n<h2 id=\"official-source\">Official source</h2>\n<ul><li>API base/docs: &lt;https://data.artmuseum.princeton.edu&gt;</li></ul>\n<h2 id=\"key-platform-facts-from-official-docs\">Key platform facts (from official docs)</h2>\n<ul><li>Base API host: `https://data.artmuseum.princeton.edu`</li><li>No authentication currently required (explicitly subject to change in future API versions).</li><li>Primary resources:</li><li>Objects</li><li>Makers</li><li>Packages</li><li>Search</li><li>All responses are JSON.</li><li>Static full dataset downloads are offered and refreshed weekly (recommended for non-dynamic bulk workflows).</li><li>Media payloads include IIIF 3-style URIs, e.g.:</li><li>`https://media.artmuseum.princeton.edu/iiif/3/collection/...`</li></ul>\n<h2 id=\"integration-goals\">Integration goals</h2>\n<ul><li>Add Princeton as a first-class B5 provider through `provider-interface`.</li><li>Preserve rich object context (makers, texts, exhibitions, geography, terms, classifications, media) in `_source.raw` while mapping stable Linked Art boundary fields.</li><li>Preserve IIIF media/service references for downstream deep-zoom/manifest work.</li></ul>\n<h2 id=\"proposed-implementation-slice\">Proposed implementation slice</h2>\n<h3 id=\"adapter\">Adapter</h3>\n<ul><li>`src/adapters/princeton.ts`</li><li>profile descriptor</li><li>object fetch + search helpers</li><li>normalizer to `SourceRecord` + `Artwork` boundary DTO</li><li>IIIF media URL extraction helpers</li></ul>\n<h3 id=\"routes\">Routes</h3>\n<ul><li>`GET /api/princeton/profile`</li><li>`POST /api/princeton/search`</li><li>`POST /api/princeton/object`</li><li>`POST /api/princeton/import`</li></ul>\n<h3 id=\"ui\">UI</h3>\n<ul><li>add `princeton` source toggle in `/explore`</li><li>show source attribution + image/reuse status + media links in detail views</li></ul>\n<h2 id=\"env-configuration\">Env configuration</h2>\n<ul><li>`PRINCETON_API_BASE` (default: `https://data.artmuseum.princeton.edu`)</li><li>`PRINCETON_API_AUTH_MODE` (default: `none`; supports future token/header mode without refactor)</li></ul>\n<h2 id=\"operational-guardrails\">Operational guardrails</h2>\n<ul><li>Since static weekly exports are available, avoid naive high-frequency crawling for large-scale bulk ingest.</li><li>Keep route-layer pagination caps and timeouts to protect request budgets.</li><li>Preserve provenance and attribution data from Princeton payloads.</li></ul>\n<h2 id=\"standards-mapping-tests\">Standards mapping + tests</h2>\n<p>Required rounds (minimum): object/provenance/shared-structure + protocol/search rounds.</p>\n<p>Required tests (failing-first):</p>\n<ul><li>`tests/adapters/princeton.test.ts`</li><li>`tests/api/princeton/profile.test.ts`</li><li>`tests/api/princeton/search.test.ts`</li><li>`tests/api/princeton/object.test.ts`</li><li>`tests/api/princeton/import.test.ts`</li></ul>\n<p>Provider-specific conformance tests:</p>\n<ul><li>rich nested field passthrough safety (`texts`, `media`, `exhibitions`, `geography`, `terms`)</li><li>IIIF URI extraction and canonical media-link mapping</li><li>no-auth default mode + forward-compatible auth-mode branching</li></ul>\n<p>Protocol checks (B8):</p>\n<ul><li>OPTIONS/CORS behavior on Princeton routes</li><li>response shape conformance</li><li>URI opacity + array-cardinality safety where applicable</li></ul>\n<h2 id=\"exit-criteria\">Exit criteria</h2>\n<ul><li>Adapter + routes + tests green.</li><li>`/explore` can search/import Princeton records.</li><li>PR includes Standards Mapping note with round + fixture anchor coverage.</li></ul>","updatedAt":"2018-10-20T01:46:40.000Z","checksum":"c8823f65ee414f7a7371c64da159c8489a26dc480d2f34658ca674589b3e8201","checksumPrefix":"c8823f65ee41","anchorCount":11,"lineCount":92,"rawUrl":"/api/docs/content?path=providers%2Fprinceton-art-museum.md","htmlUrl":"/docs?doc=providers%2Fprinceton-art-museum.md","apiUrl":"/api/docs/content?path=providers%2Fprinceton-art-museum.md"}