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

Download OpenAPI specification:

Tukang.com Team: api@tukang.com

Describes the SteelSolution partner integration as it maps to Tukang.com's existing order system. Last updated: 2026-08-03

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.

Errors

Every error looks like this: { "message": "Vendor not found", "error_code": "VENDOR_NOT_FOUND" } Clients should branch on error_code. The message field is intended for human readers and its wording may change. Each endpoint documents the codes it returns. Two additional codes may be returned by any endpoint: NOT_FOUND (404) when the path or method does not exist, and PAYLOAD_TOO_LARGE (413) when the request body exceeds the size limit below. Note that a request body which is not valid JSON returns 400 VALIDATION_ERROR even when credentials are absent or incorrect. The body is parsed before credentials are verified. A 400 where a 401 was expected therefore indicates a malformed body.

Request size

Request bodies must be smaller than 8 KB. Normal requests are considerably smaller, so this limit is unlikely to be reached in regular use. Requests exceeding it are rejected by a web application firewall before they reach this API. The firewall responds with 403 and an HTML body rather than the JSON error format above, and no record of the request is retained on our side. The firewall may also reject requests for other reasons, such as an unrecognised User-Agent. An HTML response therefore indicates a firewall rejection rather than an API error. Please report the source IP address so that it can be added to the allow list.

Outbound status webhook

Tukang.com calls a single webhook on SteelSolution's CMS whenever a site visit's status changes. Every call carries a status value plus the same record shape as the GET /site-visits/{id} response below - fields not relevant to the current status are null. Status values, in the order they can occur:

  • in_progress - vendor has started the site visit.

  • visit_complete - the site visit itself has ended. rab is not yet populated at this point, whether or not this job will need one.

  • estimate_ready - fires separately, later: can be hours to days after visit_complete, not the same call. rab is now populated, including a materials list (each item carrying a Magento-recognizable internal_id), a total service amount, and a RAB PDF URL. Only fires for jobs that need an estimate; jobs that do not require one stop after visit_complete.

  • retention_started - every RAB line item has been marked complete by the vendor, before final install sign-off. A distinct, earlier signal from install_complete below, not the same moment.

  • install_complete - installation work is fully finished.

Outbound delivery reliability

Failed outbound pushes are retried automatically with backoff, so your receiver must be idempotent. If you ever see a gap, the job status check endpoint below is callable anytime and reflects current state.

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

SteelSolution'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

SteelSolution'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, including after a reschedule.

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": {
    }
}