lobbyTO

Data access

API and bulk download

Read-only JSON API over City of Toronto lobbying registrations, communications, council votes, inferred links and derived insights. Links come only from the published_link view: each carries its model score, a confidence label ('high' or 'moderate') and its evidence; links are not reviewed by a person. Anonymous use is rate limited per IP; send a free key in x-api-key for higher limits.

Endpoints
45
In 8 groups
Requests per minute
60 / 600
Without / with a free key
Rows per page
100 to 500
Default / maximum ?limit=
Bulk export
Nightly
CSV and JSON Lines

Meta

2 endpoints

GET /api/v1/

API index. Endpoint list, licence and pagination notes.

No parameters.

GET /api/v1/openapi.json

This OpenAPI document

No parameters.

Entities

9 endpoints

GET /api/v1/organizations

List organisations

Parameters· 4 rows
ParameterInDescription
qquerySubstring of the canonical name.
typequeryOrganisation type. One of: corporation, numbered_company, non_profit, association, government, partnership, other.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/organizations/{id}

One organisation with its registrations and published L3 merges

Parameters· 1 row
ParameterInDescription
id (required)pathOrganisation id or slug.

GET /api/v1/people

List people (members of council, staff, lobbyists, election candidates). Campaign contributors are private people and are not listed; published contributions carry the contributor's name.

Parameters· 6 rows
ParameterInDescription
qquerySubstring of the canonical name.
rolequeryRole held. One of: member_of_council, mayor, councillor_staff, city_staff, local_board, lobbyist.
wardqueryWard number held in a role.
termqueryCouncil term, e.g. 2022-2026.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/people/{id}

One person with roles, committees and office contact statistics

Parameters· 1 row
ParameterInDescription
id (required)pathPerson id or slug.

GET /api/v1/registrations

List lobbying registrations

Parameters· 9 rows
ParameterInDescription
fromqueryStart date on or after.
toqueryStart date on or before.
topicqueryTracker topic id (see /topics).
statusqueryRegistration status (active, closed, closed by lro).
typequeryconsultant, in_house or voluntary.
clientqueryClient organisation id.
wardqueryWard of the linked site.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/registrations/{id}

One registration with lobbyists, parties, communications and published links

Parameters· 1 row
ParameterInDescription
id (required)pathSubject-matter registration number, e.g. SM12345.

GET /api/v1/communications

List communications

Parameters· 10 rows
ParameterInDescription
fromqueryCommunication date on or after.
toqueryCommunication date on or before.
registrationquerySM number.
memberqueryPerson id of the member whose office was contacted.
office_holder_typequerymember_of_council, councillor_staff, city_staff, local_board or unknown.
methodquerymeeting, call, email, written or other.
wardqueryWard of the registration's site.
topicqueryTracker topic id of the registration.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/agenda-items

List council and committee agenda items

Parameters· 8 rows
ParameterInDescription
fromqueryMeeting date on or after.
toqueryMeeting date on or before.
wardqueryWard.
committeequeryCommittee code, e.g. PH.
termqueryCouncil term.
recordedquery1 for items with a recorded vote, 0 for items adopted without one.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/agenda-items/{id}

One agenda item with motions, votes, links and lobbying summary

Parameters· 1 row
ParameterInDescription
id (required)pathItem id, e.g. 2025.PH20.3.
1 endpoint

GET /api/v1/links

Published inferred links. Only published links. Links are published on model score alone, with no human review: 'high' (score 0.9 or higher) or 'moderate' (0.7 to 0.9; wrong more often). L5, L7 and position links need 0.95, L3 merges 0.9.

Parameters· 9 rows
ParameterInDescription
taskqueryL1 to L6, topic or position. L7 contributor matches are published only as /contributions.
min_confidencequery'high' restricts to links scoring 0.9 or higher. One of: moderate, high.
statusqueryConfidence label. One of: moderate, high.
from_typequerySource entity type.
from_idquerySource entity id.
to_typequeryTarget entity type.
to_idqueryTarget entity id.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

Development

5 endpoints

GET /api/v1/applications

List development applications and Committee of Adjustment files

Parameters· 10 rows
ParameterInDescription
kindquerydevelopment or coa. One of: development, coa.
typequeryApplication type code.
wardqueryWard.
statusqueryStatus as published.
outcomequeryapproved, refused, withdrawn, pending or closed.
fromquerySubmitted on or after.
toquerySubmitted on or before.
sitequerySite id.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/applications/{id}

One application with its sites, published L2 links and the 4.6 comparison for its type

Parameters· 1 row
ParameterInDescription
id (required)pathApplication or file number, or its URL slug.

GET /api/v1/sites

List geocoded sites (property addresses)

Parameters· 5 rows
ParameterInDescription
wardqueryWard.
methodqueryGeocode method. One of: exact, nearest_number, source, unresolved.
qquerySubstring of the address.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/sites/{id}

One site with the registrations, applications and agenda items that name it

Parameters· 1 row
ParameterInDescription
id (required)pathSite id, slug or address key.

GET /api/v1/insights/application-comparison

4.6 lobbied applications against matched unlobbied applications. Outcome measures are null where either group has fewer than 20 applications.

Parameters· 6 rows
ParameterInDescription
kindquerydevelopment or coa.
typequeryApplication type code.
wardqueryWard.
levelquerytype (city-wide) or type_ward. One of: type, type_ward.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

Procurement

7 endpoints

GET /api/v1/contracts

List City contracts (competitive awards and non-competitive contracts)

Parameters· 8 rows
ParameterInDescription
supplierquerySupplier organisation id.
kindquerycompetitive or non_competitive. One of: competitive, non_competitive.
divisionquerySubstring of the division.
documentquerySolicitation document number.
fromqueryAward date on or after.
toqueryAward date on or before.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/contracts/{id}

One contract with its published L6 links

Parameters· 1 row
ParameterInDescription
id (required)pathContract id.

GET /api/v1/groups

4.10 corporate groups of related organisations

Parameters· 4 rows
ParameterInDescription
basisqueryConnection basis. One of: parent_subsidiary, shared_beneficiary, shared_address, same_group, manual.
min_membersqueryMinimum number of member organisations.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/groups/{id}

One corporate group with its members and connecting records

Parameters· 1 row
ParameterInDescription
id (required)pathGroup id.

GET /api/v1/insights/procurement-timeline

4.7 contracts, solicitations and lobbying for one organisation on one timeline

Parameters· 6 rows
ParameterInDescription
organization (required)queryOrganisation id.
insidequery1 for communications inside an open solicitation window.
fromqueryEvent date on or after.
toqueryEvent date on or before.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/noncompetitive-share

4.7 share of contracts awarded non-competitively

Parameters· 5 rows
ParameterInDescription
scopequeryall, supplier or division. One of: all, supplier, division.
scope_idquerySupplier organisation id or division name.
reasonqueryNon-competitive reason, or * for all.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/firm-clients

4.10 consultant firm clients by year

Parameters· 5 rows
ParameterInDescription
firmqueryFirm organisation id.
clientqueryClient organisation id.
yearqueryCalendar year.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

Contributions

7 endpoints

GET /api/v1/campaigns

4.12 election campaigns with named contribution totals

Parameters· 6 rows
ParameterInDescription
electionqueryElection, e.g. 2018, 2022 or 2023-mayor-by.
candidatequeryCandidate person id.
officequeryMayor or Councillor.
wardqueryWard (councillors).
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/contributions

4.12 published contributions. Only contributions attributed to a lobbying organisation through a reviewer-confirmed match (task L7) at tier 1 (registered lobbyist) or tier 2 (senior officer). Contributor name and city only; addresses are never published. Tier 3 is used in aggregate statistics only.

Parameters· 7 rows
ParameterInDescription
electionqueryElection.
candidatequeryCandidate person id.
organizationqueryOrganisation id.
tierquery1 or 2. One of: 1, 2.
personqueryMatching lobbyist registry person id.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/donor-overlap

4.12 share of named dollars and contributors from linked contributors, with the council median

Parameters· 4 rows
ParameterInDescription
electionqueryElection.
candidatequeryCandidate person id (0 = council-wide).
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/contribution-overlap

4.12 organisations that lobbied a member's office and whose linked contributors gave to the member

Parameters· 5 rows
ParameterInDescription
electionqueryElection.
organizationqueryOrganisation id.
candidatequeryCandidate person id.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/coordinated-giving

4.12 three or more linked contributors from one organisation giving to one campaign

Parameters· 5 rows
ParameterInDescription
electionqueryElection.
organizationqueryOrganisation id.
candidatequeryCandidate person id.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/alignment

4.12 votes aligned with reviewer-confirmed organisation positions, funded vs not funded. Member-level rates are null below 10 votes on items from funding organisations. Donors tend to give to councillors who already agree with them; a difference does not show that a contribution changed a vote.

Parameters· 5 rows
ParameterInDescription
termqueryCouncil term.
comparisonquerywithin_bloc, within_member or prior_term. One of: within_bloc, within_member, prior_term.
personqueryMember person id (0 = council-wide).
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/contribution-stats

4.12 council-wide contribution aggregates

Parameters· 4 rows
ParameterInDescription
electionqueryElection.
scopequery12 (tiers 1-2) or 123 (including tier 3). One of: 12, 123.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

Insights

12 endpoints

GET /api/v1/topics

The tracker's topic taxonomy. Stable topic ids used in registration.topic, the upcoming feed and alerts.

No parameters.

GET /api/v1/insights/item-lobbying

4.1 lobbying before each vote

Parameters· 7 rows
ParameterInDescription
agenda_itemqueryItem id.
windowquery30, 90 or 180 days.
fromqueryFirst vote date on or after.
toqueryFirst vote date on or before.
wardqueryWard.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/office-contacts

4.3 contacts per member office per quarter

Parameters· 5 rows
ParameterInDescription
termqueryCouncil term.
personqueryMember person id.
quarterquerye.g. 2024Q3, or 'term'.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/meeting-rates

4.4 meeting rates by lobbyist, firm, office and pair

Parameters· 6 rows
ParameterInDescription
subject_typequerylobbyist, firm, office or pair.
subject_idquerySubject id.
officequeryOffice (member) person id.
categoryqueryRegistry subject category, or * for all.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/deviation

4.2 votes different from bloc on lobbied and unlobbied items

Parameters· 4 rows
ParameterInDescription
termqueryCouncil term.
personqueryMember person id.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/former-officials

4.8 lobbyists confirmed as former members of council, councillor staff or City staff. Reviewer-confirmed matches only (task L5 is manual-only and needs at least two independent confirming records); `evidence` lists the records used.

Parameters· 4 rows
ParameterInDescription
rolequeryFormer role. One of: member_of_council, mayor, councillor_staff, city_staff.
personqueryLobbyist person id.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/upcoming

4.9 upcoming feed: open registrations with no linked item yet

Parameters· 4 rows
ParameterInDescription
topicqueryTracker topic id.
basisqueryWindow basis. One of: topic, pooled, none.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/lead-times

4.9 lead time from initial approval to first published linked item, by topic

Parameters· 3 rows
ParameterInDescription
topicqueryTracker topic id, or * for the pooled distribution.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/topic-volume

4.9 new registrations per topic per month, with spike flags

Parameters· 6 rows
ParameterInDescription
topicqueryTracker topic id.
spikequery1 for spike months only.
month_fromqueryFirst month, YYYY-MM.
month_toqueryLast month, YYYY-MM.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/mayor-share

4.5 quarterly share of communications to the Mayor's office

Parameters· 3 rows
ParameterInDescription
categoryqueryall, planning_development, budget or housing.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

GET /api/v1/insights/mayor-share/its

4.5 interrupted time series estimates

No parameters.

GET /api/v1/insights/disclosure-lag

4.11 share of communications recorded more than 3 days late. Rows are returned only after 6 months of registry snapshots; until then `measurement` explains the status.

Parameters· 4 rows
ParameterInDescription
subject_typequeryfirm, lobbyist, subject or all.
subject_idquerySubject id.
limitqueryPage size, 1 to 500 (default 100).
cursorqueryOpaque keyset cursor: the next_cursor value from the previous page.

Bulk

2 endpoints

GET /api/v1/bulk

Manifest of the latest nightly export

No parameters.

GET /api/v1/bulk/{date}/{file}

Download one exported file

Parameters· 2 rows
ParameterInDescription
date (required)pathExport date, YYYY-MM-DD.
file (required)pathFile name from the manifest, e.g. registration.csv.