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

QueryDescription
statusOne inquiry status (pending, processing, waiting_supplier, answered, completed, failed, cancelled)
channel1688 or taobao
source_product_idExact marketplace product id
created_after / created_beforeISO 8601 timestamps
pageDefaults to 1
limitDefaults 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

Email support