Find businesses that can do a job
Start here. Describe the job once: zip, optional service_key, the home in property (kind of home, rooms, size, floor; see the word list), price inputs such as hours in inputs, and words from the word list in must_have, nice_to_have and must_not. The answer reads the job back in job.read_back. Returns matches (each with one exact price, a quote_token and bookable windows), needs_more (businesses that take the job but whose price needs something the job did not state, each with a needs list and a plain why) and near_misses (each reason with a plain code and a label, e.g. home_kind_not_taken "Takes apartments and condos only."). A business is never assumed to do something it has not answered, and is never sent a job it does not take (kind of home, largest home, a condition it marked not taken). Job conditions (pets, parking, mould, after building work and so on) go in inputs.conditions and are priced in, sent to the owner, or make the business a near-miss (condition_not_taken). Anything not on the word list goes in special_requests and always needs the owner's approval. Unknown words are refused with the word probably meant. Sending only service_key and zip returns the old merchants list. A search result is not a promise: prices and windows are as of availability_checked_at, and only a booked job is committed. A price from search can be held directly (it becomes a record when held); call quote to get a transaction_id before holding. Every result carries trust: the business's facts (who vouches for each: CommonTape checked, or the owner says so; since when and until when), facts that have lapsed, and its job record on CommonTape. Trust never changes the order, the price, who is eligible or what needs approval.
Request
- Base URL: https://commontape.com
- URL: https://commontape.com/api/v1/search
- Auth: HTTP bearer
Request body
Example request
{
"service_key": "house_cleaning.standard",
"property": {
"spaces": {
"space.bedroom": 2,
"space.bathroom.full": 2,
"space.bathroom.half": 1,
"space.kitchen": 1
}
},
"scope": {
"leave_out": [
"space.garage"
],
"clean_only": [
"space.kitchen",
"space.bathroom.full"
]
},
"max_total": 300,
"arrive_by": "2026-10-09T10:00",
"finish_by": "2026-10-09T15:00",
"id_to_security_hours_before": 2
}Response
Success
Example response
{
"taxonomy_version": 6,
"job": {
"property": {
"spaces": {
"space.bedroom": 2,
"space.bathroom.full": 2,
"space.bathroom.half": 1,
"space.kitchen": 1
}
}
},
"matches": [
{
"scope": {
"leave_out": [
"space.garage"
],
"clean_only": [
"space.kitchen",
"space.bathroom.full"
]
},
"booking_authority": {
"reasons": [
"owner_approves_every_job"
]
}
}
],
"needs_more": [
{
"scope": {
"leave_out": [
"space.garage"
],
"clean_only": [
"space.kitchen",
"space.bathroom.full"
]
},
"needs": [
{
"path": "property.size.square_feet"
}
]
}
],
"owner_must_quote": [
{
"scope": {
"leave_out": [
"space.garage"
],
"clean_only": [
"space.kitchen",
"space.bathroom.full"
]
}
}
],
"near_misses": [
{
"scope": {
"leave_out": [
"space.garage"
],
"clean_only": [
"space.kitchen",
"space.bathroom.full"
]
}
}
]
}Changes
No recorded changes to this operation across all 1 revision of this API.