CivicTechTO / CivicTechTO/toronto-bids

Agencies and corporations: the archive covers City divisions only

Open
#103 5 comments 0 reactions 0 assignees View on GitHub
enhancement
Dominant language
Python
Stars
7
Forks
2
PR merge metrics
No merged PRs in 30d

Description

Umbrella for the largest structural gap in the archive. **Tracking only — the per-body issues are where the work is.**

## The gap

`solicitation` is City **divisions**: Transportation Services (1,127), Toronto Water (712), Parks (681), Engineering, Fleet, Solid Waste. They all procure centrally through PMMD, which is what the `tobids-*` feeds publish.

The City's agencies, boards and corporations **procure independently of that feed and are absent**:

| probe | hits in 7,444 solicitations |
|---|---:|
| TTC / Toronto Transit | 38 / 10 — *mentions* inside City solicitations, not TTC procurement |
| Police | 7 |
| Toronto Community Housing / TCHC | 81 / **0** |
| Parking Authority | **0** |
| Library | 1 |

Not a coverage accident — a different buyer. The City's own `consulting-services-expenditures` dataset splits `CITY / ABC` and puts **325 of 607 2024 rows (54%) under "Agencies and Corporations."**

## The roster (from the City's own pages)

**Agencies:** CreateTO · Exhibition Place · Heritage Toronto · TO Live · Toronto Atmospheric Fund · Toronto Investment Board · Toronto Parking Authority · Toronto Police Service · Toronto Public Health · Toronto Public Library · Toronto Transit Commission · Toronto Zoo · Sankofa Square · Arena Boards · AOCCs · BIAs · TRCA (partnered)

**Corporations:** Build Toronto · Casa Loma · Lakeshore Arena · Toronto Community Housing · Toronto Hydro · Toronto Port Lands Company · Toronto Seniors Housing · Toronto Pan Am Sports Centre · Waterfront Toronto (partnered)

## Where they actually post — verified

| body | platform | what is exposed |
|---|---|---|
| **TTC** | MERX `merx.com/ttc` | open + closed solicitations, **bid results**, awarded solicitations. Non-competitive >$100K posted on ttc.ca separately |
| **Toronto Police Service** | MERX `merx.com/torontopolice` | open + closed solicitations |
| **Toronto Parking Authority** | MERX `merx.com/torontoparkingauthority` | open + closed solicitations |
| **Toronto Community Housing** | Bonfire + Biddingo | opportunities |
| **Waterfront Toronto** | Bonfire `waterfrontoronto.bonfirehub.ca` | opportunities >$100K, plus an **awarded contracts** page |
| **Toronto Zoo** | bids&tenders `torontozoo.bidsandtenders.ca` | bid opportunities |
| **Toronto Public Library** | own site | RFQ / RFP / REI / tender calls |
| Exhibition Place, Toronto Hydro, CreateTO, Build Toronto, Port Lands, TO Live, Casa Loma, Lakeshore Arena, Seniors Housing, Pan Am Centre | **unverified** | see the triage issue |

## The one architectural fact that shapes all of this

**Three of the biggest sit on MERX**, and TRCA and Toronto Zoo both sit on bids&tenders. These are *platforms*, not bespoke sites. A MERX adapter serves TTC + Police + Parking Authority; a bids&tenders adapter serves Zoo (+ TRCA if wanted); a Bonfire adapter serves TCHC + Waterfront Toronto.

**So do not write one scraper per body.** The per-body issues below are scoped as "confirm what this body exposes and feed it to the platform adapter", not "build a scraper".

## Scope discipline

This is a different **buyer**, not a different **feed** for the same buyer. Three questions have to be answered before any of it lands, and they are per-platform, not per-body:

1. **Keyspace.** These have no Ariba `document_number`. TTC solicitations are keyed TTC-internally. That is a fourth keyspace after `document_number`, `workspace_number` and `call_number` — or an argument for a `buyer` column and a composite key. **Decide once, in this issue, before any adapter is written.**
2. **Does the spine's contract still hold?** `solicitation` currently means "a City of Toronto competitive call". Admitting TTC rows changes what `COUNT(*)` means for every existing consumer — exactly the reasoning that kept `composite_award` out of `award` (#96).
3. **Terms of use.** MERX and Biddingo are commercial platforms hosting public-sector notices. Whether an archive may scrape them is a real question and is not answered by the data being public. **Check before writing a fetch.**

## Sources

- https://www.toronto.ca/city-government/accountability-operations-customer-service/city-administration/city-managers-office/agencies-corporations/agencies/
- https://www.toronto.ca/city-government/accountability-operations-customer-service/city-administration/city-managers-office/agencies-corporations/corporations/
- https://www.ttc.ca/doing-business-with-the-ttc/Procurement-and-Category-Management/solicitations-and-results

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with this issue's agency roster, verified platform table, and the linked City and TTC sources; no implementation files or tests are named. Before any adapter work, document the keyspace decision, whether the solicitation contract can include these buyers, and the terms-of-use result for each platform. Done means those platform-level decisions are settled and the per-body issues can be scoped against them.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data-engineering
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.