Charges and credits

Charges

GET /v1/charges?from=2026-10-01T00:00:00Z&to=2026-11-01T00:00:00Z      scope billing:read
{"charges":[{"id":"chg_311","lead_id":"6b1c...","service_id":"water-heater-installation","zip":"98391","amount_cents":4500,
  "reason":"pro accepted direct lead","status":"pending","created_at":"2026-10-22T16:04:11Z","settled_at":null}]}

status: pending (on your balance), invoiced, paid or void (credited). reason says what the charge is for. One charge per lead. Up to 1,000, newest first. Each lead also shows charged_cents.

Credits

GET /v1/credits                                  scope billing:read
POST /v1/leads/{id}/credit-request               scope billing:write
Content-Type: application/json

{"reason":"duplicate","note":"Same customer and job as lead 91de... yesterday"}

reason: wrong_contact, not_reachable, outside_area, service_not_offered, duplicate, not_a_real_request, other. Same rules as the app: within 48 hours of getting the lead, once per lead, paid leads only. Our team decides; you get credit.approved or credit.denied by webhook, and an approved credit voids the charge (charge.voided). If you already paid, refund_due is true on the credit.

{"credits":[{"lead_id":"6b1c...","reason":"duplicate","note":"...","requested_at":"2026-10-22T17:00:00Z","state":"approved",
  "decided_at":"2026-10-23T15:10:00Z","decision_note":"Confirmed duplicate","refund_due":false}]}