specification: API Commons Errors specificationVersion: '0.1' provider: Harvard University providerId: harvard generated: '2026-08-19' method: probed source: Deliberate failure probes against each institution-operated surface, 2026-08-19. x-operator: institution description: >- Error semantics observed by actually making bad requests, not by reading documentation. Harvard has four different error contracts across five surfaces and no institution-wide convention. Two findings are worth naming: LibraryCloud returns a Tomcat HTML 500 stack page for a malformed client parameter that should be a 400, and the Art Museums API returns the same undifferentiated 401 for a missing key and an invalid key. The OAI-PMH endpoints are the best behaved because the protocol dictates the error format. errors: - surface: Harvard Art Museums API request: GET https://api.harvardartmuseums.org/object?size=1 status: 401 content_type: text/plain; charset=utf-8 body: Unauthorized shape: bare string machine_readable: false finding: >- No error code, no JSON envelope, no remediation link. A missing key and an invalid key (apikey=notreal) produce byte-identical responses, so a client cannot distinguish "you forgot to authenticate" from "your key was revoked". - surface: Harvard Library LibraryCloud Item API request: GET https://api.lib.harvard.edu/v2/items.json?limit=notanumber status: 500 content_type: text/html;charset=utf-8 shape: Apache Tomcat HTML error page machine_readable: false finding: >- DEFECT. A non-numeric limit is a client error and should return 400. The service instead returns a 500 carrying a Tomcat "HTTP Status 500 - Internal Server Error" HTML page. An agent parsing JSON gets HTML, and a retrying client will retry a request that can never succeed. - surface: Harvard DASH OAI-PMH (tenant - 4Science managed DSpace) x-operator: tenant request: GET https://dash.harvard.edu/server/oai/request?verb=Bogus status: 200 content_type: text/xml;charset=UTF-8 shape: OAI-PMH error element body_fragment: 'Illegal verb' machine_readable: true finding: >- Protocol-correct. OAI-PMH mandates HTTP 200 with an in-body element, and the DSpace installation behind dash.harvard.edu honours it. Neither the error vocabulary nor the implementation is Harvard's - the vocabulary is the OAI-PMH specification's and the platform is 4Science's. Not credited to Harvard. - surface: Harvard Dataverse native REST API request: GET https://dataverse.harvard.edu/api/datasets/999999999 status: 404 content_type: application/json;charset=UTF-8 shape: '{"status":"ERROR","message":"..."}' body: '{"status":"ERROR","message":"Dataset with ID 999999999 not found."}' machine_readable: true finding: >- Consistent structured JSON envelope with a correct status code and a human-readable message. No machine-stable error code field and no RFC 9457 problem+json, but the shape is stable across the surface. This is the best error contract Harvard operates. - surface: Harvard Dataverse native REST API request: GET https://dataverse.harvard.edu/api/admin/isOrcid status: 403 content_type: text/html shape: Apache HTML 403 machine_readable: false finding: >- Administrative paths are correctly refused, but the refusal is emitted by Apache ahead of the application, so it breaks the JSON envelope the rest of the API maintains. - surface: Harvard Drupal estate (data.harvard.edu, huit.harvard.edu, provost.harvard.edu, scholar.harvard.edu) request: GET https://data.harvard.edu/ status: 403 content_type: text/html shape: Akamai "Access Denied" page with an edgesuite reference id machine_readable: false finding: >- NOT an application error and NOT a dead host. data.harvard.edu resolves through edge.drupalsites.harvard.edu -> huit.edgesuite.net -> Akamai, and the whole Harvard Drupal estate returns 403 Access Denied to non-browser clients regardless of User-Agent or header set. The sites are live to a human browser. Recorded here because it is the single largest thing standing between Harvard and an agent-readable footprint. no_convention: finding: >- Five surfaces, four incompatible error contracts, zero shared error vocabulary and no RFC 7807/9457 problem+json anywhere. There is no institution-level error standard to document because there is no institution-level API program.