Tukang.com: SteelHub Partner API (1.0.0-draft)

Download OpenAPI specification:

Tukang.com Team: api@tukang.com

Describes the SteelHub partner integration as it maps to Tukang.com's existing order system. Last updated: 2026-07-21

Authentication

Every request needs X-API-Key and X-Signature headers - see the Authorization panel on each endpoint below for how to compute X-Signature.

Outbound delivery reliability

Applies to every outbound push Tukang.com makes to SteelHub's webhook. If a send fails, it retries with exponential backoff: 30s, 2m, then 10m, three attempts total. Once those run out, our team gets an alert - informational only, there's no guaranteed resend beyond that point. If you notice a gap, the job status check endpoint below is callable anytime and reflects the current state directly. A dedicated audit log for partner calls is planned but not built yet.

vendor-match

Match nearby vendors for an installation request

Returns up to 5 nearby vendors with profile, reviews, and site-visit cost, pre-filtered to vendors available at the requested slot.

Authorizations:
(ApiKeyAuthSignatureAuth)
Request Body schema: application/json
required
required
object
material_type
required
string
qty
required
integer
contact_number
required
string
preferred_slot
required
string <date-time>
renovation_or_new_build
required
string

Responses

Request samples

Content type
application/json
{
  • "location": {
    },
  • "material_type": "Light Steel",
  • "qty": 12,
  • "contact_number": "+6281234567890",
  • "preferred_slot": "2026-07-10T09:00:00+07:00",
  • "renovation_or_new_build": "Bangun Baru"
}

Response samples

Content type
application/json
{
  • "message": "",
  • "result": [
    ]
}

site-visit

Create a site-visit order

Called once the customer's site-visit fee payment succeeds. Payment amount is fixed on Tukang.com's side and not accepted from this request.

Authorizations:
(ApiKeyAuthSignatureAuth)
Request Body schema: application/json
required
order_id
required
string

SteelHub's own order id.

vendor_id
required
string

Vendor selected by the customer from the match response.

name
required
string
email
required
string <email>
phone
required
string
renovation_or_new_build
required
string
material_type
required
string
qty
required
integer
city
required
string

City name (kota/kabupaten).

district
required
string

District name (kecamatan).

village
required
string

Village name (desa/kelurahan).

job_location
required
string
job_location_lat
required
number <float>
job_location_lng
required
number <float>
job_location_detail
string or null
job_time
required
string <date-time>
photo_url_1
string or null
photo_url_2
string or null
notes
string or null

Responses

Request samples

Content type
application/json
{
  • "order_id": "SH-000123456",
  • "vendor_id": "VND0001122",
  • "name": "Andi Wijaya",
  • "email": "andi.wijaya@example.com",
  • "phone": "81234567890",
  • "renovation_or_new_build": "Bangun Baru",
  • "material_type": "Light Steel",
  • "qty": 12,
  • "city": "Jakarta Selatan",
  • "district": "Kebayoran Baru",
  • "village": "Senayan",
  • "job_location": "Jl. Merdeka No. 1",
  • "job_location_lat": -6.2088,
  • "job_location_lng": 106.8456,
  • "job_location_detail": "Belakang gudang",
  • "job_time": "2026-07-10T09:00:00+07:00",
  • "photo_url_1": "https://.../photo1.jpg",
  • "photo_url_2": null,
  • "notes": "Renovasi"
}

Response samples

Content type
application/json
{
  • "message": "Success create order",
  • "result": {
    }
}

Notify that material has been received

Called once material for the order has been marked received. Notifies the assigned vendor to prepare for the job.

Authorizations:
(ApiKeyAuthSignatureAuth)
Request Body schema: application/json
required
order_id
required
string

SteelHub's own order id (same value sent to /site-visits).

received_at
required
string <date-time>

Responses

Request samples

Content type
application/json
{
  • "order_id": "SH-000123456",
  • "received_at": "2026-07-10T09:00:00+07:00"
}

Response samples

Content type
application/json
{
  • "message": "Success log material received",
  • "result": {
    }
}

Check the current status of a site-visit order

Optional status check, callable anytime for an order that exists in the system. rab is only present once a cost estimate exists for the order. job_time always reflects the current scheduled time - if the vendor and customer reschedule (a manual process, no separate endpoint for it), an admin updates it directly and this response picks up the new value on the next call.

Authorizations:
(ApiKeyAuthSignatureAuth)
path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "message": "",
  • "result": {
    }
}

site-visit-decision

Reject the vendor's cost estimate

Called when the customer rejects the estimate/quotation.

Authorizations:
(ApiKeyAuthSignatureAuth)
path Parameters
id
required
string
Request Body schema: application/json
optional
reject_notes
string or null

Free-text reason for rejection (optional).

Responses

Request samples

Content type
application/json
{
  • "reject_notes": "Harga terlalu tinggi"
}

Response samples

Content type
application/json
{
  • "message": "Success reject estimate",
  • "result": {
    }
}

Accept the vendor's cost estimate

Called once the customer accepts the estimate/quotation and payment succeeds. Payment amount is fixed on Tukang.com's side and not accepted from this request.

Authorizations:
(ApiKeyAuthSignatureAuth)
path Parameters
id
required
string
Request Body schema: application/json
optional
object (AcceptRequest)

No fields required.

Responses

Request samples

Content type
application/json
{ }

Response samples

Content type
application/json
{
  • "message": "Success accept estimate",
  • "result": {
    }
}

cancellation

Cancel a site-visit order

Called when the customer requests to cancel, relayed from SteelHub. Rejected once the vendor has already started work, or once less than 3 hours remain before the scheduled site-visit time, whichever comes first. Accepting also frees the vendor's schedule slot.

Authorizations:
(ApiKeyAuthSignatureAuth)
path Parameters
id
required
string
Request Body schema: application/json
optional
cancel_notes
string or null

Free-text reason for the cancellation (optional).

Responses

Request samples

Content type
application/json
{
  • "cancel_notes": "Customer changed their mind"
}

Response samples

Content type
application/json
{
  • "message": "Success cancel site visit",
  • "result": {
    }
}