Bloombilt Local
Describe what a person needs done locally. We qualify it, offer it to exactly one matching Twin Cities business, and tell you what happened. A request is never sold to a pile of competing providers.
Base URL https://local.bloombilt.com/api/v1 · OpenAPI 3.1
Bearer API key, issued per distribution channel.
Authorization: Bearer <your-api-key> The key that creates a request is the only key that can read its status. There is no endpoint that lists requests, and no way to reach another channel's.
outside_service_area.GET /capabilities for the live
list.POST /requests
{
"need": "Leaking water heater in the basement, needs looking at this week",
"capability_id": "plumbing",
"fulfillment": {
"mode": "onsite",
"address": "123 Main St, Minneapolis MN",
"postal_code": "55418"
},
"needed_by": "2026-09-27T17:00:00Z",
"customer": {
"name": "Dana Reed",
"phone": "+16125550100",
"email": "dana@example.com"
},
"consent": {
"purpose_text": "Share this request and my contact details with one matching Twin Cities business.",
"granted_at": "2026-09-20T14:02:11Z"
},
"source_ref": "your-conversation-id"
} Consent is not a boolean. Send the exact sentence the person was shown. If you cannot produce one, you have not collected consent and we cannot route the request.
Returns 201 with an opaque request_id. A 422 carries a machine-readable error — branch on that, never on the message.
GET /requests/{id}
{
"request_id": "0f6e...",
"status": "accepted",
"accepted_by": {
"merchant_name": "Northside Plumbing",
"next_step": "They have your contact details and will reach out directly."
},
"rejection_reason": null,
"explanation": "Northside Plumbing accepted your request and will contact you directly."
} | status | means |
|---|---|
searching | We are qualifying or a merchant is deciding. |
accepted | One merchant took it and has the contact details. |
unfulfilled | Nobody could take it in time. Nothing was shared. |
rejected | We would not route it. See rejection_reason. |
cancelled | The person withdrew it. |
There is deliberately no state for "a merchant declined". Which business passed is not information we will give out, in either direction.
Send "test": true. The request flows
through the entire pipeline — qualification, offer, acceptance — and is structurally
incapable of producing a charge. The database refuses a billing entry against a test
request; it is not a flag someone remembers to check.
Customer contact details are encrypted at rest and are not readable by the merchant, by the offer SMS, or by our own logs until that merchant accepts. Exactly one merchant ever receives them. We retain them while a billing dispute remains possible, then delete them.
Privacy policy · Terms · Support
© 2026 Bloombilt LLC · Minneapolis, Minnesota