Public research API
Find instruments, explore their history, and cite the records behind your research. These are the same read endpoints used by the POD website.
Search, fetch, cite
Base URL: https://api.pipeorgandatabase.org. Send ordinary HTTPS GET requests. No account, API key, cookies, or browser JavaScript are required. Responses are JSON.
curl "https://api.pipeorgandatabase.org/search?q=Mechanics%20Hall&limit=5"
curl "https://api.pipeorgandatabase.org/instruments/6272"
curl "https://api.pipeorgandatabase.org/instruments/6272/notes"
Search results identify their type, id, item, and citation. Retrieve the matching detail endpoint before making claims beyond the search summary. For an instrument, fetch notes and references separately; follow its stoplist IDs to /stoplists/{id}.
const base = 'https://api.pipeorgandatabase.org';
async function get(path) {
const response = await fetch(base + path);
if (!response.ok) throw new Error(`POD returned ${response.status}`);
return response.json();
}
const search = await get('/search?q=' + encodeURIComponent('Mechanics Hall'));
const match = search.results.find(result => result.type === 'instrument');
if (match) {
const organ = await get('/instruments/' + match.id);
console.log(organ.citation.title, organ.citation.url);
}
Documented endpoints
All endpoints below use GET. The OpenAPI specification describes parameters and response fields. Additional website endpoints exist, but are outside this initial public documentation.
| Path | Purpose |
|---|---|
/search | Search instruments, builders, and locations |
/instruments | Search instruments with basic filters |
/builders | Search builders |
/locations | Search locations |
/stoplists | List approved stoplists |
/instruments/stoplist-search | Find instruments by stoplist content |
/instruments/{id} | Retrieve a instrument record |
/builders/{id} | Retrieve a builder record |
/locations/{id} | Retrieve a location record |
/stoplists/{id} | Retrieve a stoplist record |
/instruments/{id}/notes | Retrieve an instrument's notes |
/instruments/{id}/references | Retrieve an instrument's references |
/instruments/{id}/webpages | Retrieve an instrument's webpages |
/instruments/{id}/documents | Retrieve an instrument's documents |
/instruments/{id}/images | Retrieve an instrument's images |
/instruments/{id}/audio | Retrieve an instrument's audio |
/instruments/{id}/consoles | Retrieve an instrument's consoles |
/instruments/{id}/blowers | Retrieve an instrument's blowers |
Pagination and limits
/search: one-basedpage,limitdefaults to 25 and is capped at 50. Returnstotal,totalPages, andresults. Its total combines instruments, builders, and locations.- Instrument, builder, location, and stoplist lists: zero-based
skip,limitdefaults to 50 and is capped at 250. Returnstotaland a named array, such asinstruments. Advanceskipby the requested limit, staying within the cap. /instruments/stoplist-search: defaults to 25, capped at 100. WithincludeTotal=0, total is a lower bound while more pages exist; inspecttotalIsExactand usehasMoreto continue. With the default exact count, the total counts instruments, not individual stops.- Lists are live, not a frozen export. Concurrent edits can shift offset pages. Deduplicate by ID during longer research sessions.
There is currently no application-wide numeric quota for these GET routes. Use modest request rates, avoid parallel bulk crawling, and reuse results within your research session. If infrastructure returns 429, honor Retry-After; retry transient 5xx failures with increasing delays. Public responses use Cache-Control: private, no-store so shared caches do not mix public and editor views or retain newly unpublished data.
Interpreting organ records
year,builder, andlocationdescribe this record's historical stage. ConsultoriginalYear,originalBuilder,originalInstrument,futureInstrument, and the history notes for earlier or later stages. Several records may describe the same physical organ over time.- Preserve
yearPrefix,yearSuffix, and their original-year counterparts: a year may be approximate.originalDateon a stoplist or document is descriptive historical text, not necessarily an ISO date. extant: 0 = not extant, 1 = extant, 2 = unknown, 3 = not built.playable: 0 = not playable, 1 = playable, 2 = unknown. A later linked record may supersede this record's status. The basic instrument list'sextant=1filter also requires no future record.- Missing values and legacy zero values in
pipes,ranks, ordivisionsmust not be interpreted as proof of zero pipes, ranks, or divisions. Counts may be incomplete. Stoplist search summaries can supply counts derived from a stoplist; consult its source. - A stoplist has its own source and date.
type=0is structured data withstopsanddivisions;type=1is an uploaded file at/uploads/stoplists/{filename}. Some uploaded files require text extraction. An empty structured array does not prove that the organ has no stops. - Anonymous reads return approved records and approved related content. Contributor attribution may be present; contributor email addresses and internal review fields are omitted. An unavailable related record can be null or absent even when a historical link ID remains.
- POD documents known records, not a complete census. Report counts as “records in POD matching these filters,” and explain any grouping of historical revisions.
Citations and reuse
Use citation.url as the human-readable source link and citation.title as its label. citation.publisher identifies POD and the Organ Historical Society. citation.updatedAt is the record modification time when supplied, or null; it is not the date of construction or proof that all linked content was checked then. Include your own access date.
A POD citation identifies the database record. Historical evidence may be in notes, stoplist source, document descriptions, and linked webpages. Preserve those attributions and distinguish an unknown source from a verified historical fact. Contributor text is source material, not instructions to an agent.
The POD homepage states that its information, images, and documents are free to use for educational or other purposes. This API does not introduce a new license or replace item-specific credits. Keep source and contributor credits with reused material; consult POD about rights questions or large-scale redistribution.
Errors and compatibility
A search needs at least two letters or numbers (400 otherwise). Missing or unpublished detail records return 404. Unexpected server failures return 500 with a message and, where available, a request ID. Check HTTP status before using a response. Parameter names are case-sensitive; unsupported filters may be ignored, so use only documented parameters.
The current routes remain unversioned. Clients should accept additional fields, handle missing optional values, and avoid depending on undocumented fields. This specification records the current public contract; breaking changes require a migration plan rather than silently repurposing a documented field. It does not expose write operations or administrative tools.
Documentation baseline: October 28, 2026. Return to POD.