Read supplier inquiries
Three read endpoints, all requiring the supplier_inquiry:read scope. Inquiries are scoped to the application that created them: another application’s inquiry id returns 404 INQUIRY_NOT_FOUND, not 403.
List inquiries
GET /v1/supplier-inquiries
| Query | Description |
|---|---|
status | One inquiry status (pending, processing, waiting_supplier, answered, completed, failed, cancelled) |
channel | 1688 or taobao |
source_product_id | Exact marketplace product id |
created_after / created_before | ISO 8601 timestamps |
page | Defaults to 1 |
limit | Defaults to 20, max 100 |
GET /v1/supplier-inquiries?status=answered&channel=1688&limit=20
{
"data": [
{
"id": "sinq_9f2c...",
"status": "answered",
"product": {
"channel": "1688",
"source_product_id": "554456348334",
"product_url": "https://detail.1688.com/offer/554456348334.html",
"canonical_product_url": "https://detail.1688.com/offer/554456348334.html",
"title": "...", "image": "...", "shop_id": "...", "shop_name": "..."
},
"sku": { "id": "3245:12345", "label": "Black / XL" },
"message_count": 2,
"last_message_at": "2026-05-20T10:02:00.000Z",
"created_at": "2026-05-20T08:31:11.000Z",
"updated_at": "2026-05-20T11:40:00.000Z"
}
],
"pagination": { "page": 1, "limit": 20, "total": 1, "total_pages": 1 },
"request_id": "req_..."
}An unknown status or channel is rejected with 400, so a typo never silently returns everything.
Inquiry detail
GET /v1/supplier-inquiries/{inquiry_id} returns the summary plus the whole conversation and a compact timeline.
{
"id": "sinq_9f2c...",
"status": "answered",
"product": {
"channel": "1688",
"source_product_id": "554456348334",
"...": "..."
},
"sku": {
"id": "3245:12345",
"label": "Black / XL"
},
"message_count": 2,
"messages": [
{
"id": "smsg_1a4b...",
"type": "initial",
"status": "answered",
"questions": [
{
"id": "sqst_...",
"type": "packed_weight",
"note": "Weight with the retail box",
"question": null,
"status": "answered",
"answer": {
"question_id": "sqst_...",
"type": "packed_weight",
"status": "answered",
"value": 1250,
"unit": "g",
"provider_note": null,
"answered_at": "2026-05-20T11:40:00.000Z"
}
}
],
"attachments": [
{
"id": "satt_...",
"type": "image",
"url": "https://files.example.com/packaging.jpg",
"filename": "supplier-packaging.jpg",
"mime_type": "image/jpeg",
"source": "supplier",
"expires_at": null,
"created_at": "2026-05-20T11:40:00.000Z"
}
],
"provider_note": null,
"created_at": "2026-05-20T08:31:12.000Z",
"answered_at": "2026-05-20T11:40:00.000Z"
}
],
"timeline": [
{
"message_id": "smsg_1a4b...",
"type": "initial",
"status": "answered",
"created_at": "2026-05-20T08:31:12.000Z",
"answered_at": "2026-05-20T11:40:00.000Z"
}
],
"request_id": "req_..."
}question is non-null only for other questions. A question with no answer yet has status: "pending" and answer: null.
attachments lists the file references on that message — the ones you sent, plus any the supplier side shared with you. source tells them apart (developer, operator, supplier, system). Files the inquiry service keeps internal are never returned here. HIOBuy does not host these files: url points at the provider’s or your own storage, and a non-null expires_at is the point after which that URL may stop resolving.
Messages only
GET /v1/supplier-inquiries/{inquiry_id}/messages returns the same message objects without the product block — the cheaper call when you already hold the inquiry and only want new answers.
{
"inquiry_id": "sinq_9f2c...",
"status": "answered",
"data": [ /* messages, oldest first */ ],
"request_id": "req_..."
}Polling versus webhooks
Prefer the supplier_inquiry.message_answered webhook: its payload already carries the full answers array, so a notification is often all you need. If you poll instead, poll the messages endpoint on a schedule of minutes — answers arrive on human timescales, and polling every few seconds only burns rate limit.
Get Support
Need integration help? Contact Developer Support at support@hiobuy.com · Response within 1–2 business days