Skip to content

Changelog

Additive changes may land at any time; a breaking change would go to /api/v2/ and be emailed to every key holder first. See Versioning and stability.

Documented so you can plan for them; none is live.

Item Status
429 rate_limited and rate-limit headers Reserved. No rate limiting today.
sl_test_ keys for test-mode businesses Reserved.
410 Gone with the new location for a job slug the business changed Reserved. A changed slug answers 404 job_not_found today.
message and details keys on the error body Planned, additive. The body is { "error": "…" } today.
Self-serve API keys and webhook endpoints in Settings → Integrations Planned. Keys and endpoints are issued by support today.
job.deleted Defined, never sent; jobs archive as job.unpublished.

2026-09-18 — Closed businesses answer 410

Section titled “2026-09-18 — Closed businesses answer 410”
  • A business whose account is closed answers 410 business_closed to its own key. Any other caller gets 404 business_not_found. Error responses now carry Cache-Control: no-store, max-age=0.
  • Additive. The business’s own words for a trade not on our list; null for every listed trade. Render industry_label ?? primary_vertical.

2026-08-31 — Repeat visits, reviews on lists, and richer webhooks

Section titled “2026-08-31 — Repeat visits, reviews on lists, and richer webhooks”
  • Additive on Job: canonical_slug, gallery_order, work_duration_minutes, source_line_items, what_we_found, what_we_did, judgment_calls, what_we_recommend.
  • noindex can now be set automatically for a later visit to a property that already has a page for the same service, in addition to the per-job toggle.
  • GET /jobs gains reviews=true to embed matched reviews on list rows.
  • Webhook payloads gain job.sibling_slugs and job.sibling_categories, present only when non-empty.
  • Additive. A response partly served from our last good copy during a temporary problem carries X-SL-Stale-Ms and a 30-second Cache-Control. See Caching.
  • Additive. The named author shown on pages: name, title, bio, sameAs. null until set.
  • Additive. Job.reviews[]: Google reviews matched to the job, always present on Get a job.
  • New endpoint GET /api/businesses/{slug}/feed/jobs with service, city and fields=minimal. Ordered by updated_at; page size 1–200, default 50; carries a public Cache-Control.

2026-05-24 — Aggregates and sitemap filtering

Section titled “2026-05-24 — Aggregates and sitemap filtering”
  • GET /jobs and GET /jobs/{job_slug} responses gain aggregates (counts across all published jobs; null when unavailable).
  • GET /jobs gains indexable=true and aggregates=false.
  • Additive on Business: booking_url, cta_kind, cta_label.
  • og_image_url, related_jobs, project_facts and media[].pair_id are now populated (previously present but empty).
  • Additive on Business: branding, license_number, cities_served.
  • Bearer sl_live_ keys are required on every endpoint.
  • GET /jobs gains cursor pagination and updated_since.
  • Additive on Job: noindex.
  • Outbound webhooks: job.published, job.updated, job.unpublished, HMAC-SHA256 signatures, retries, circuit breaker.
  • GET /api/businesses/{slug}, GET /api/businesses/{slug}/jobs, GET /api/businesses/{slug}/jobs/{job_slug} with ETag / If-None-Match.