{"openapi":"3.1.0","info":{"title":"Zibbo API","version":"0.2.0","description":"Zibbo only connects Clients and Pros across the Okanagan. It doesn't check anyone's background, credentials or licences, employ Pros, handle payment for the work, or set prices. Phone, email, postal code, and street address are never returned. Your first 2 new Clients are free until November 23, 2026. After that, you pay $5 the first time you work with a new Client. Repeat jobs with the same Client are free. Chats are checked as they are sent, saved while the job is active, and deleted 30 days after the job ends. A report does not keep message text. Contact stays hidden until the Client and Pro agree and any connection fee is paid. Posting a task requires a fixed or hourly budget, plus when it can happen. A Client sees Pro stars. A Pro sees Client stars. Stars for a job stay out of the averages until both sides have rated or 7 days after it is marked done."},"servers":[{"url":"https://zibbo.ca"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Per-person API key."}},"schemas":{"TaskTiming":{"type":"object","properties":{"whenKind":{"type":"string","enum":["asap","by_date","on_date","flexible"],"description":"As soon as possible, by a date, on a specific date, or flexible."},"whenDate":{"type":"string","description":"YYYY-MM-DD. Required when whenKind is by_date or on_date."},"times":{"type":"array","items":{"type":"string","enum":["weekday_daytime","weekday_evenings","weekends"]},"description":"Any number of preferred times."},"presence":{"type":"string","enum":["home","away","either"],"description":"Whether the Client needs to be home. away means they do not need to be there."},"timingNote":{"type":"string","maxLength":200,"description":"Optional. Phone numbers and emails are blocked."},"timingLabel":{"type":"string","description":"A sentence Pros can read before tapping Interested."}}},"TaskWrite":{"type":"object","required":["title","description","category","taskType","town","address","budgetKind"],"properties":{"title":{"type":"string"},"description":{"type":"string"},"category":{"type":"string"},"taskType":{"type":"string"},"town":{"type":"string"},"address":{"type":"string"},"postalCode":{"type":"string"},"budgetKind":{"type":"string","enum":["fixed","hourly"]},"budgetAmount":{"type":"number","description":"Dollars. Use this or budgetCents."},"budgetCents":{"type":"integer"},"preferredDate":{"type":"string","description":"YYYY-MM-DD. Treated as on_date when whenKind is omitted."},"whenKind":{"type":"string","enum":["asap","by_date","on_date","flexible"]},"whenDate":{"type":"string","description":"YYYY-MM-DD. Required when whenKind is by_date or on_date."},"times":{"type":"array","items":{"type":"string","enum":["weekday_daytime","weekday_evenings","weekends"]}},"presence":{"type":"string","enum":["home","away","either"]},"timingNote":{"type":"string","maxLength":200}}},"IntakeRequest":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Plain words, such as next Saturday, evenings, or I'll be at work."}}}}},"security":[{"bearer":[]}],"paths":{"/api/v1/categories":{"get":{"summary":"List services, towns, and the flat connection fee","responses":{"200":{"description":"Catalog"}}}},"/api/v1/intake":{"post":{"summary":"Draft tasks from a plain-language note. Does not post them or return contact details. Each draft includes timing.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntakeRequest"}}}},"responses":{"200":{"description":"Drafts with whenKind, whenDate, times, presence, and timingLabel."}}}},"/api/v1/tasks":{"get":{"summary":"Search tasks","parameters":[{"name":"category","in":"query","schema":{"type":"string","enum":["yard-and-garden","snow","moving-and-hauling","cleaning","handyman","painting","assembly","pressure-washing","gutters-and-windows","tree-work","pet-care","errands-and-delivery","tech-help","licensed-trades","orchard-and-vineyard-help","dock-and-boat","pool-and-hot-tub","wildfire-firesmart-yard-clearing"]}},{"name":"town","in":"query","schema":{"type":"string","enum":["summerland","penticton","peachland","okanagan-falls","kelowna","west-kelowna","naramata","kaleden","oliver","osoyoos","keremeos","vernon","lake-country"]}},{"name":"radiusKm","in":"query","schema":{"type":"number"},"description":"Kilometres from the town. Omit for that town only."},{"name":"date","in":"query","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"name":"q","in":"query","schema":{"type":"string"},"description":"Matches word stems, so trimming finds trim."}],"responses":{"200":{"description":"Tasks without addresses. Each task includes timing."}}},"post":{"summary":"Post a task for the signed-in Client. Include when it can happen, preferred times, whether the Client needs to be home, and an optional timing note.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskWrite"}}}},"responses":{"201":{"description":"Created. Address is not echoed. Timing is."}}}},"/api/v1/tasks/{id}":{"get":{"summary":"Read one task","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Task"}}}},"/api/v1/tasks/{id}/interest":{"post":{"summary":"Pro taps Interested. Refused if this Pro was already turned down for the task.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Interest recorded. Contact stays hidden."}}}},"/api/v1/pros":{"get":{"summary":"Search Pros","parameters":[{"name":"category","in":"query","schema":{"type":"string","enum":["yard-and-garden","snow","moving-and-hauling","cleaning","handyman","painting","assembly","pressure-washing","gutters-and-windows","tree-work","pet-care","errands-and-delivery","tech-help","licensed-trades","orchard-and-vineyard-help","dock-and-boat","pool-and-hot-tub","wildfire-firesmart-yard-clearing"]}},{"name":"town","in":"query","schema":{"type":"string","enum":["summerland","penticton","peachland","okanagan-falls","kelowna","west-kelowna","naramata","kaleden","oliver","osoyoos","keremeos","vernon","lake-country"]}},{"name":"radiusKm","in":"query","schema":{"type":"number"},"description":"Kilometres from the town. Omit for that town only."},{"name":"date","in":"query","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"name":"q","in":"query","schema":{"type":"string"},"description":"Matches word stems, so trimming finds trim."}],"responses":{"200":{"description":"Pros without phone or email"}}}},"/api/v1/pros/{id}":{"get":{"summary":"Read one Pro","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Pro"}}}},"/api/v1/interests/{id}":{"post":{"summary":"Client or Pro action: talk, pass, offer, accept, test-pay, done, review, end, block, report. A report stores a reason category only, with no message text.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Updated"}}}},"/api/v1/messages":{"post":{"summary":"Send a chat message. It is checked live and not stored.","responses":{"200":{"description":"Delivered or held"}}}},"/api/v1/jobs":{"get":{"summary":"Alias of search tasks","parameters":[{"name":"category","in":"query","schema":{"type":"string","enum":["yard-and-garden","snow","moving-and-hauling","cleaning","handyman","painting","assembly","pressure-washing","gutters-and-windows","tree-work","pet-care","errands-and-delivery","tech-help","licensed-trades","orchard-and-vineyard-help","dock-and-boat","pool-and-hot-tub","wildfire-firesmart-yard-clearing"]}},{"name":"town","in":"query","schema":{"type":"string","enum":["summerland","penticton","peachland","okanagan-falls","kelowna","west-kelowna","naramata","kaleden","oliver","osoyoos","keremeos","vernon","lake-country"]}},{"name":"radiusKm","in":"query","schema":{"type":"number"},"description":"Kilometres from the town. Omit for that town only."},{"name":"date","in":"query","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"name":"q","in":"query","schema":{"type":"string"},"description":"Matches word stems, so trimming finds trim."}],"responses":{"200":{"description":"Tasks"}}}},"/api/v1/workers":{"get":{"summary":"Alias of search Pros","parameters":[{"name":"category","in":"query","schema":{"type":"string","enum":["yard-and-garden","snow","moving-and-hauling","cleaning","handyman","painting","assembly","pressure-washing","gutters-and-windows","tree-work","pet-care","errands-and-delivery","tech-help","licensed-trades","orchard-and-vineyard-help","dock-and-boat","pool-and-hot-tub","wildfire-firesmart-yard-clearing"]}},{"name":"town","in":"query","schema":{"type":"string","enum":["summerland","penticton","peachland","okanagan-falls","kelowna","west-kelowna","naramata","kaleden","oliver","osoyoos","keremeos","vernon","lake-country"]}},{"name":"radiusKm","in":"query","schema":{"type":"number"},"description":"Kilometres from the town. Omit for that town only."},{"name":"date","in":"query","schema":{"type":"string"},"description":"YYYY-MM-DD"},{"name":"q","in":"query","schema":{"type":"string"},"description":"Matches word stems, so trimming finds trim."}],"responses":{"200":{"description":"Pros"}}}}}}