Loading…
Loading…
Public, free, and open without a key. Base address: https://crossingthefloor.ca
The endpoints marked "legacy" are shaped by the original 25-table model, which has no verification level, no citation graph and no way to represent a caucus that moved together. They remain available so that existing reusers do not break. The canonical model is what the site itself now reads and what the versioned export will carry; if you are starting work today, build against that.
/api/v2canonical modelWhat this API is, what it refuses to do, and the list of every endpoint with its parameters.
locale(string)en or fr. Selects the language of localized text. Where a field has no text in that language the response marks it rather than substituting silently.Envelope: name, openapi URL, endpoints[]./api/v2/eventscanonical modelPaged list of affiliation events. Withdrawn records are excluded unless you ask for them, and a group move is one event carrying its participant count, never several crossings.
verification(string)unverified, corroborated or official_and_independent. Filtering on this alone is not a publication gate: a withdrawn record can still be corroborated.publishedOnly(boolean)Restrict to records passing the full three-part publication gate. This is the filter to use before quoting anything as established.includeWithdrawn(boolean)Include retracted records. They are held at their original identifier so anyone who cited one can see what happened.jurisdiction(string)Slug, ISO 3166-2 code or public id. Repeat for OR. A value matching nothing returns zero rows AND an unresolved-filter warning, so a typo cannot pass for an absence of history.search(string)Free-text search over titles and participant names.perPage(number)Page size. For the whole dataset in one request use /api/v2/export, which is neither paginated nor capped.Envelope: data[] of events, meta.pageInfo, meta.dataRelease, warnings[]./api/v2/events/{idOrSlug}canonical modelOne event with its full evidence graph: participants, claims, the sources cited for each, editorial reviews and revision history.
locale(string)en or fr. Selects the language of localized text. Where a field has no text in that language the response marks it rather than substituting silently.Envelope: the event, its participants, claims, sources, reviews and revisions./api/v2/personscanonical modelPaged list of people. One person can generate several events, so a person count and an event count are different measures of different things.
withEventsOnly(boolean)Restrict to people who have at least one recorded affiliation event.search(string)Free-text search over recorded names.Envelope: data[] of persons, meta.pageInfo./api/v2/persons/{idOrSlug}canonical modelOne person with their full affiliation record across every legislature held.
locale(string)en or fr. Selects the language of localized text. Where a field has no text in that language the response marks it rather than substituting silently.Envelope: the person and their participations./api/v2/partiescanonical modelPaged list of political parties, with the aliases under which a party appears in the record.
withTransitionsOnly(boolean)Restrict to parties that appear on at least one side of a recorded transition.jurisdiction(string)Restrict to parties belonging to a jurisdiction.Envelope: data[] of parties, meta.pageInfo./api/v2/parties/{idOrSlug}canonical modelOne party with its aliases, its relationships to other parties, and the flows in and out of it.
locale(string)en or fr. Selects the language of localized text. Where a field has no text in that language the response marks it rather than substituting silently.Envelope: the party, aliases, relationships and flows./api/v2/sourcescanonical modelPaged list of evidence sources, with reliability tier and the result of the most recent link check.
citedOnly(boolean)Restrict to sources actually cited by a claim.linkStatus(string)Filter on the outcome of the most recent link check.reliabilityTier(string)Filter on the recorded reliability tier.Envelope: data[] of sources, meta.pageInfo./api/v2/sources/{id}canonical modelOne source, its link-check history, and every claim that cites it.
locale(string)en or fr. Selects the language of localized text. Where a field has no text in that language the response marks it rather than substituting silently.Envelope: the source, its checks and its citing claims./api/v2/coveragecanonical modelWhat the database does and does not contain, computed from live rows on every call. Every breakdown carries its denominator, and the freshness frontier gives the newest record held for each jurisdiction. Start here before quoting any total.
locale(string)en or fr. Selects the language of localized text. Where a field has no text in that language the response marks it rather than substituting silently.Envelope: coverage (the full report), headline, and reconciliation against external figures./api/v2/contextcanonical modelHow rare is a transition like this one? Returns comparable counts with their denominators, the first and most recent occurrence, and a quotable sentence in both languages. It never returns a rate, because almost no participant leg carries a recorded outcome.
fromParty(string)Party left. Names in the response come from the resolved party row, not from your spelling, so a filter that matched something else is visible.toParty(string)Party joined. For a move to the cross benches use toAffiliationLabel instead: those legs have no destination party.sinceYear(number)Inclusive lower bound on the year of the comparable set.excludeEvent(string)Public id of an event to leave out — normally the one you are writing about.Envelope: context (comparable set, ordinal, first, most recent, outcome tallies) and quotable.en / quotable.fr./api/v2/releasescanonical modelVersioned data releases. Cite the release you consulted together with the date you consulted it.
includeUnpublished(boolean)Include releases prepared but not published.Envelope: data[] of releases, meta.pageInfo./api/v2/releases/{version}canonical modelOne data release with its manifest and the counts recorded at the time it was cut. Those counts are historical and are labelled as such; they are not the live totals.
locale(string)en or fr. Selects the language of localized text. Where a field has no text in that language the response marks it rather than substituting silently.Envelope: the release, its artifacts and its counts at release time./api/v2/correctionscanonical modelThe public corrections ledger: what was wrong, what it was changed to, and when.
materialOnly(boolean)Restrict to corrections marked material to the record.recordPublicId(string)Corrections affecting one record, by its public id.Envelope: data[] of corrections, meta.pageInfo./api/v2/exportcanonical modelBulk export of the whole dataset. Streamed, never paginated and never capped: the row count is the filtered dataset, not a page of it. Accepts the same filters as /api/v2/events.
format(string)csv, json or jsonl. CSV is RFC 4180 with CRLF endings; it is a real CSV, not the JSON body under another content type.dataset(string)Which table to export: events, participants and the other published datasets.bom(boolean)Prefix a UTF-8 byte-order mark, for spreadsheets that need one. CSV only.A manifest object carrying the licence, release and column order, then the rows./api/v2/openapi.jsoncanonical modelThe machine-readable specification, generated from the same route registry that serves the requests, so it cannot drift from the API it describes. Every parameter of every endpoint is documented there.
No parameters.
An OpenAPI 3.1 document./api/crossingslegacy modelPaged list of crossings in the legacy model.
q(string)Free-text search. The parameter is q; earlier documentation on this site named it search, which the code has never read.level(string)federal or provincial. Legacy field; it does not distinguish territorial legislatures.province(string)Province name as free text in the legacy model, which is why the same province can appear under two spellings.category(string)Legacy editorial category.yearFrom(number)Inclusive lower bound on the year.yearTo(number)Inclusive upper bound on the year.page(number)1-based page number. Defaults to 1.perPage(number)Page size, capped at 100. Defaults to 50.{ rows: Crossing[], total: number, page: number, perPage: number }/api/crossings/{slug}legacy modelOne crossing with its related legacy records. 404 with { error } when the slug is unknown.
No parameters.
CrossingWithRelations | { error: "Not found" }/api/persons/{slug}legacy modelOne person, their crossings, and counts of recorded cabinet and Senate appointments.
No parameters.
{ person: { slug, nameEn, birthYear, deathYear }, crossings: […], cabinetCount: number, senateCount: number }/api/searchlegacy modelFree-text search over the legacy records. Returns an empty result set for queries shorter than two characters rather than an error.
q(string)The query. Minimum two characters. Maximum 20 results.{ results: Crossing[] }/api/statisticslegacy modelAggregates over the legacy model. These totals do not carry denominators and are not the figures the coverage report publishes; where the two disagree, the coverage report is the one computed from the canonical model.
No parameters.
{ overview, categories, provinces, decades, flows, benefits }/api/eraslegacy modelThe editorial eras used to group the timeline.
No parameters.
Era[]/api/glossarylegacy modelGlossary terms in both languages.
No parameters.
GlossaryTerm[]/feed.xmlcanonical modelRSS 2.0 feed of newly published events, drawn from the canonical model and restricted to records that pass the full publication gate. Every item carries its verification level and its date precision.
jurisdiction(string)Restrict the feed to one jurisdiction, by slug or ISO code (for example CA-NS). An unknown value yields an empty feed and says so in the channel description, rather than silently returning everything.lang(string)en or fr. Selects the language of item titles and summaries. Where a French text is absent the English is served and the item is marked as untranslated.application/rss+xml/sitemap.xmlsiteEvery published event, person and party record, plus the editorial pages, with a real last-modified date taken from the record itself. Withdrawn records are excluded.
No parameters.
application/xmlThese addresses return 404 today. Nothing on this page links to them as a download and they are excluded from the machine-readable dataset description, so a data-search crawler will not offer them to you either.
/api/v2/export?format=jsonNot yet availableEvents, participants, people, parties, jurisdictions, claims, citations and sources in the canonical model, with every verification and precision field carried through rather than flattened away.
/api/v2/export?format=csvNot yet availableThe same records as a flat table per entity, for a spreadsheet or an R or Python session. Unknown values are empty cells and are documented as unknown in the data dictionary; they are never written as zero.
Anonymous access is rate limited per client per hour, and no API key is required or issued — every caller is anonymous today. The ceiling in force, the window, how much of it you have used and when it resets are returned on every response, in the RateLimit-* headers and in meta.rateLimit; read them there rather than from this page, and treat a response that reports enforcement as not_enforced as exactly that. Please still be considerate — this is a small project on modest hosting — and identify yourself with a User-Agent that includes a contact address, so that we can reach you rather than block you.
Database: CC BY 4.0 Creative Commons Attribution 4.0 International
Site code, design and visual identity: rights reserved
Crossing the Floor (crossingthefloor.ca), CC BY 4.0