Estimates
Run material matching against a partner-supplied item list
Runs catalog matching only — no file extraction, no estimate generation. Use this when you already have line items (id + product name + optional group/unit) and just want our supplier-catalog matches.
Processing is asynchronous; results are delivered via webhook to callbackUrl in the same format as POST /v1/estimate. The response webhook will carry type: "MATCHING" and each matched row's attributes.partnerItemId echoes the input id so you can correlate.
Workflow:
- POST your items to this endpoint
- Receive an immediate response with estimateJobId
- Receive a webhook at callbackUrl when matching completes
- Alternatively, poll GET /v1/estimate/{estimateJobId}
post/v1/estimate/match
Request
- Base URL: https://api.handoff.ai
- URL: https://api.handoff.ai/v1/estimate/match
- Auth: HTTP bearer
Request body
Example request
{
"items": [
{
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"productName": "2x6 PT Bottom Plates",
"group": "Framing",
"unit": "LF",
"quantity": 22
}
],
"address": "Austin, TX 78701",
"callbackUrl": "https://partners.example.com/webhooks/estimate",
"externalId": "MATCH-12345",
"storeReference": "STORE-NYC-001",
"customerReference": "CUST-ORD-789",
"metadata": {
"includeMEP": true,
"source": "takeoff-api",
"projectId": "proj-123"
}
}Response
Matching job created successfully
Example response
{
"estimateJobId": "e1a2b3c4-d5e6-4f7a-8b9c-0d1e2f3a4b5c",
"status": "PENDING",
"createdAt": "2025-12-05T14:30:00Z",
"estimatedCompletionTime": "2025-12-05T14:35:00Z",
"metadata": {
"includeMEP": true,
"source": "takeoff-api",
"projectId": "proj-123"
}
}Changes
No recorded changes to this operation across all 1 revision of this API.