Proudly.caScan a site

API documentation

Everything the site shows comes from a public JSON API at https://api.staging.proudlydev.ca. No key is needed today. Requests are rate limited per address: 10 scans a minute, 2 forced rescans, and a handful of form submissions.

MethodPathWhat it does
POST/v1/scanBody {"url": "example.ca"}. Returns the report, from cache when under 24 hours old. Add ?force=1 to rescan.
GET/v1/report/:domainThe latest report for a domain, or 404 if it has never been scanned.
GET/v1/report/:domain/historyEvery past scan, newest first. ?full=1 returns whole reports, ?limit=N caps the count.
GET/badge/:domain.svgThe live badge image. Cached for an hour; a stale report triggers a background rescan.
GET/v1/servicesService providers with scores. Filters: ?kind=technology|network|nameserver|registrar, ?status=stub|draft|published.
GET/v1/services/:slugOne provider, with its Canadian alternatives and the providers it is an alternative to.
POST/v1/services/:slug/requestsA listing or correction request. Body {"type": "alternative"|"correction", "name", "website", "email", "message"}.
POST/v1/survey/:domainSelf-reported details for a site. GET /v1/survey/questions lists the accepted fields.
GET/v1/leaderboard?board=canadian|not, ?limit=N. Ranked entries with score, grade, and the services behind them.

Example

curl -X POST https://api.staging.proudlydev.ca/v1/scan \
  -H 'content-type: application/json' \
  -d '{"url": "canada.ca"}'

A report carries the domain, score, grade, coverage, and one entry per check with its status, weight, evidence, and a plain-language note. Statuses are canadian, foreign, mixed, or unknown; unknown checks are excluded from the score and lower coverage instead.

Get an API key · LLMs and MCP