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=
- Base URL:
https://lobbyto.ca/api/v1. Machine-readable description: OpenAPI 3.1 (openapi.json). - Pagination: list endpoints return
data,next_cursorandlimit. Passnext_cursoras?cursor=for the next page;?limit=up to 500 (default 100). - Rate limits: 60 requests per minute per IP address without a key; 600 with a free key sent as the
x-api-keyheader. - Dates are
YYYY-MM-DD. Errors return{"error", "message"}with HTTP 400, 401, 404 or 429. - Nightly bulk export (CSV and JSON Lines, with a data dictionary): /api/v1/bulk.
- Licence: Contains information licensed under the Open Government Licence – Toronto. Derived data by lobbyTO, published under the same terms.
Meta
2 endpointsGET /api/v1/
API index. Endpoint list, licence and pagination notes.
No parameters.
GET /api/v1/openapi.json
This OpenAPI document
No parameters.
Entities
9 endpointsGET /api/v1/organizations
List organisations
Parameters· 4 rows
| Parameter | In | Description |
|---|---|---|
q | query | Substring of the canonical name. |
type | query | Organisation type. One of: corporation, numbered_company, non_profit, association, government, partnership, other. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
id (required) | path | Organisation 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
| Parameter | In | Description |
|---|---|---|
q | query | Substring of the canonical name. |
role | query | Role held. One of: member_of_council, mayor, councillor_staff, city_staff, local_board, lobbyist. |
ward | query | Ward number held in a role. |
term | query | Council term, e.g. 2022-2026. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
id (required) | path | Person id or slug. |
GET /api/v1/registrations
List lobbying registrations
Parameters· 9 rows
| Parameter | In | Description |
|---|---|---|
from | query | Start date on or after. |
to | query | Start date on or before. |
topic | query | Tracker topic id (see /topics). |
status | query | Registration status (active, closed, closed by lro). |
type | query | consultant, in_house or voluntary. |
client | query | Client organisation id. |
ward | query | Ward of the linked site. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
id (required) | path | Subject-matter registration number, e.g. SM12345. |
GET /api/v1/communications
List communications
Parameters· 10 rows
| Parameter | In | Description |
|---|---|---|
from | query | Communication date on or after. |
to | query | Communication date on or before. |
registration | query | SM number. |
member | query | Person id of the member whose office was contacted. |
office_holder_type | query | member_of_council, councillor_staff, city_staff, local_board or unknown. |
method | query | meeting, call, email, written or other. |
ward | query | Ward of the registration's site. |
topic | query | Tracker topic id of the registration. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque keyset cursor: the next_cursor value from the previous page. |
GET /api/v1/agenda-items
List council and committee agenda items
Parameters· 8 rows
| Parameter | In | Description |
|---|---|---|
from | query | Meeting date on or after. |
to | query | Meeting date on or before. |
ward | query | Ward. |
committee | query | Committee code, e.g. PH. |
term | query | Council term. |
recorded | query | 1 for items with a recorded vote, 0 for items adopted without one. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
id (required) | path | Item id, e.g. 2025.PH20.3. |
Links
1 endpointGET /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
| Parameter | In | Description |
|---|---|---|
task | query | L1 to L6, topic or position. L7 contributor matches are published only as /contributions. |
min_confidence | query | 'high' restricts to links scoring 0.9 or higher. One of: moderate, high. |
status | query | Confidence label. One of: moderate, high. |
from_type | query | Source entity type. |
from_id | query | Source entity id. |
to_type | query | Target entity type. |
to_id | query | Target entity id. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque keyset cursor: the next_cursor value from the previous page. |
Development
5 endpointsGET /api/v1/applications
List development applications and Committee of Adjustment files
Parameters· 10 rows
| Parameter | In | Description |
|---|---|---|
kind | query | development or coa. One of: development, coa. |
type | query | Application type code. |
ward | query | Ward. |
status | query | Status as published. |
outcome | query | approved, refused, withdrawn, pending or closed. |
from | query | Submitted on or after. |
to | query | Submitted on or before. |
site | query | Site id. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
id (required) | path | Application or file number, or its URL slug. |
GET /api/v1/sites
List geocoded sites (property addresses)
Parameters· 5 rows
| Parameter | In | Description |
|---|---|---|
ward | query | Ward. |
method | query | Geocode method. One of: exact, nearest_number, source, unresolved. |
q | query | Substring of the address. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
id (required) | path | Site 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
| Parameter | In | Description |
|---|---|---|
kind | query | development or coa. |
type | query | Application type code. |
ward | query | Ward. |
level | query | type (city-wide) or type_ward. One of: type, type_ward. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque keyset cursor: the next_cursor value from the previous page. |
Procurement
7 endpointsGET /api/v1/contracts
List City contracts (competitive awards and non-competitive contracts)
Parameters· 8 rows
| Parameter | In | Description |
|---|---|---|
supplier | query | Supplier organisation id. |
kind | query | competitive or non_competitive. One of: competitive, non_competitive. |
division | query | Substring of the division. |
document | query | Solicitation document number. |
from | query | Award date on or after. |
to | query | Award date on or before. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
id (required) | path | Contract id. |
GET /api/v1/groups
4.10 corporate groups of related organisations
Parameters· 4 rows
| Parameter | In | Description |
|---|---|---|
basis | query | Connection basis. One of: parent_subsidiary, shared_beneficiary, shared_address, same_group, manual. |
min_members | query | Minimum number of member organisations. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
id (required) | path | Group id. |
GET /api/v1/insights/procurement-timeline
4.7 contracts, solicitations and lobbying for one organisation on one timeline
Parameters· 6 rows
| Parameter | In | Description |
|---|---|---|
organization (required) | query | Organisation id. |
inside | query | 1 for communications inside an open solicitation window. |
from | query | Event date on or after. |
to | query | Event date on or before. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
scope | query | all, supplier or division. One of: all, supplier, division. |
scope_id | query | Supplier organisation id or division name. |
reason | query | Non-competitive reason, or * for all. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
firm | query | Firm organisation id. |
client | query | Client organisation id. |
year | query | Calendar year. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque keyset cursor: the next_cursor value from the previous page. |
Contributions
7 endpointsGET /api/v1/campaigns
4.12 election campaigns with named contribution totals
Parameters· 6 rows
| Parameter | In | Description |
|---|---|---|
election | query | Election, e.g. 2018, 2022 or 2023-mayor-by. |
candidate | query | Candidate person id. |
office | query | Mayor or Councillor. |
ward | query | Ward (councillors). |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
election | query | Election. |
candidate | query | Candidate person id. |
organization | query | Organisation id. |
tier | query | 1 or 2. One of: 1, 2. |
person | query | Matching lobbyist registry person id. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
election | query | Election. |
candidate | query | Candidate person id (0 = council-wide). |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
election | query | Election. |
organization | query | Organisation id. |
candidate | query | Candidate person id. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
election | query | Election. |
organization | query | Organisation id. |
candidate | query | Candidate person id. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
term | query | Council term. |
comparison | query | within_bloc, within_member or prior_term. One of: within_bloc, within_member, prior_term. |
person | query | Member person id (0 = council-wide). |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
election | query | Election. |
scope | query | 12 (tiers 1-2) or 123 (including tier 3). One of: 12, 123. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque keyset cursor: the next_cursor value from the previous page. |
Insights
12 endpointsGET /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
| Parameter | In | Description |
|---|---|---|
agenda_item | query | Item id. |
window | query | 30, 90 or 180 days. |
from | query | First vote date on or after. |
to | query | First vote date on or before. |
ward | query | Ward. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
term | query | Council term. |
person | query | Member person id. |
quarter | query | e.g. 2024Q3, or 'term'. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
subject_type | query | lobbyist, firm, office or pair. |
subject_id | query | Subject id. |
office | query | Office (member) person id. |
category | query | Registry subject category, or * for all. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
term | query | Council term. |
person | query | Member person id. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
role | query | Former role. One of: member_of_council, mayor, councillor_staff, city_staff. |
person | query | Lobbyist person id. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
topic | query | Tracker topic id. |
basis | query | Window basis. One of: topic, pooled, none. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
topic | query | Tracker topic id, or * for the pooled distribution. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
topic | query | Tracker topic id. |
spike | query | 1 for spike months only. |
month_from | query | First month, YYYY-MM. |
month_to | query | Last month, YYYY-MM. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
category | query | all, planning_development, budget or housing. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque 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
| Parameter | In | Description |
|---|---|---|
subject_type | query | firm, lobbyist, subject or all. |
subject_id | query | Subject id. |
limit | query | Page size, 1 to 500 (default 100). |
cursor | query | Opaque keyset cursor: the next_cursor value from the previous page. |
Bulk
2 endpointsGET /api/v1/bulk
Manifest of the latest nightly export
No parameters.
GET /api/v1/bulk/{date}/{file}
Download one exported file
Parameters· 2 rows
| Parameter | In | Description |
|---|---|---|
date (required) | path | Export date, YYYY-MM-DD. |
file (required) | path | File name from the manifest, e.g. registration.csv. |