Reviews, business settings and metrics

Reviews

GET /v1/reviews?since=2026-10-01T00:00:00Z        scope reviews:read
{"reviews":[{"id":"rev_6b1c2f0e...","lead_id":"6b1c...","created_at":"2026-10-25T02:11:00Z","overall":5,"quality":5,"punctuality":5,
  "communication":5,"value":4,"cleanliness":5,"would_hire_again":true,"hired":true,"comment":"Fast and clean work.","comment_status":"approved","source":"app"}]}

comment shows once we approve it for display (comment_status). New reviews fire review.created.

Business

GET /v1/business                  scope business:read
PATCH /v1/business                scope business:write
POST /v1/business/pause           scope business:write
POST /v1/business/resume          scope business:write

GET returns your profile, services, ZIP codes, highest lead price, license, insurance and bond as we last checked them, and your webhook status.

PATCH takes any of:

{"paused": true, "zips": ["98391","98390"], "max_price_cents": 6000}

These are the same settings as in the app. paused: true stops new leads at once (for example when your schedule is full) and fires business.paused. zips: 1 to 200 five-digit ZIP codes. max_price_cents: 1,000 to 200,000.

Metrics

GET /v1/metrics?from=2026-10-01T00:00:00Z&to=2026-11-01T00:00:00Z&group_by=service      scope metrics:read

group_by: day, week, month (Pacific time), service or zip. No group_by gives one total. Default range: the last 30 days.

{"metrics":[{"bucket":"water-heater-installation","leads_received":14,"accepted":12,"declined":1,"contacted":11,"appointments":2,"hired":3,"jobs_done":4,
  "not_hired":3,"unreachable":1,"spend_cents":52500,"credited_cents":4500,"cost_per_lead_cents":3750,"cost_per_hire_cents":7500,"hire_rate":0.583,
  "response_minutes_median":6.5,"response_minutes_p90":31.0,"reported_job_total_cents":1275000,"reported_paid_cents":980000,"return_on_spend":18.67}]}

The numbers are the same ones your dashboard uses. Revenue numbers come from the job_total_cents and paid_cents you report.