Inquiries

Triage buyer inquiries from inquiry-type products and track status

GET /admin/api/inquiries

List inquiries with pagination, filtering by status or product, and free-text search across name, email, and message.

Parameters

Name Type Required Description
status string optional Filter by status: "new", "in_progress", "replied", or "closed".
product_id integer optional Restrict to inquiries for a specific product.
search string optional Case-insensitive substring match against buyer name, email, and message.
page integer optional Page number, 1-indexed (default: 1).
page_size integer optional Items per page, 1–100 (default: 25).

Response 200

{
  "items": [
    {
      "id": 42,
      "product_id": 17,
      "variant_id": 91,
      "customer_id": null,
      "name": "Marta Müller",
      "email": "marta@example.com",
      "phone": "+49 30 1234567",
      "message": "Do you ship the antique vase to Berlin? Insurance included?",
      "quantity": 1,
      "status": "new",
      "internal_notes": null,
      "product_snapshot": "{\"product_name\":\"Edo Period Vase\",\"sku\":\"VASE-EDO-01\",\"variant_id\":91,\"selected_options\":{\"Size\":\"Large\"}}",
      "created_at": "2026-04-25T08:14:00Z",
      "updated_at": "2026-04-25T08:14:00Z"
    }
  ],
  "page": 1,
  "page_size": 25
}

Example

curl "https://yourshop.zeroshop.io/admin/api/inquiries?status=new&page_size=25" \
  -H "Authorization: Bearer zspat_..."
GET /admin/api/inquiries/{id}

Fetch a single inquiry along with the buyer-submitted answers to any custom fields attached to the product.

Response 200

{
  "inquiry": {
    "id": 42,
    "product_id": 17,
    "variant_id": 91,
    "customer_id": null,
    "name": "Marta Müller",
    "email": "marta@example.com",
    "phone": "+49 30 1234567",
    "message": "Do you ship the antique vase to Berlin? Insurance included?",
    "quantity": 1,
    "status": "new",
    "internal_notes": null,
    "product_snapshot": "{\"product_name\":\"Edo Period Vase\",\"sku\":\"VASE-EDO-01\",\"variant_id\":91,\"selected_options\":{\"Size\":\"Large\"}}",
    "created_at": "2026-04-25T08:14:00Z",
    "updated_at": "2026-04-25T08:14:00Z"
  },
  "custom_fields": [
    {
      "inquiry_id": 42,
      "custom_field_id": 5,
      "field_name": "Preferred contact method",
      "field_value": "Email"
    },
    {
      "inquiry_id": 42,
      "custom_field_id": 6,
      "field_name": "Budget range",
      "field_value": "$500–$1000"
    }
  ]
}

Example

curl "https://yourshop.zeroshop.io/admin/api/inquiries/42" \
  -H "Authorization: Bearer zspat_..."
PATCH /admin/api/inquiries/{id}

Update inquiry status and/or internal notes. Bumps `updated_at` and writes an `admin.inquiries.update` admin_logs entry.

Request Body

{
  "status": "replied",
  "internal_notes": "Quoted shipping at €120 incl. insurance — awaiting confirmation."
}

Response 200

{
  "id": 42,
  "product_id": 17,
  "variant_id": 91,
  "customer_id": null,
  "name": "Marta Müller",
  "email": "marta@example.com",
  "phone": "+49 30 1234567",
  "message": "Do you ship the antique vase to Berlin? Insurance included?",
  "quantity": 1,
  "status": "replied",
  "internal_notes": "Quoted shipping at €120 incl. insurance — awaiting confirmation.",
  "product_snapshot": "{\"product_name\":\"Edo Period Vase\",\"sku\":\"VASE-EDO-01\",\"variant_id\":91,\"selected_options\":{\"Size\":\"Large\"}}",
  "created_at": "2026-04-25T08:14:00Z",
  "updated_at": "2026-04-25T09:02:00Z"
}

Example

curl -X PATCH "https://yourshop.zeroshop.io/admin/api/inquiries/42" \
  -H "Authorization: Bearer zspat_..." \
  -H "Content-Type: application/json" \
  -d '{"status":"replied","internal_notes":"Quoted shipping at €120 incl. insurance."}'
POST /admin/api/inquiries/{id}/convert

Convert an inquiry into a real order. Optionally creates a Stripe Checkout session (when `payment_method = stripe`) and queues the standard order-confirmation email. The order is created even if Stripe session creation fails — the merchant can retry from the order detail page.

Request Body

{
  "unit_price_cents": 85000,
  "quantity": 1,
  "payment_method": "stripe",
  "shipping_mode": "configured",
  "shipping_method_id": 3,
  "shipping_cost_cents": 12000,
  "shipping_address": {
    "line1": "Kurfürstendamm 21",
    "line2": "Apt 4B",
    "city": "Berlin",
    "state": null,
    "postal_code": "10719",
    "country": "DE"
  },
  "delivery_date": "2026-05-08",
  "internal_notes": "Buyer confirmed €850 + €120 shipping on the call.",
  "send_confirmation_email": true
}

Response 200

{
  "order_id": 1284,
  "order_public_id": "AB12CD",
  "inquiry_id": 42,
  "stripe_checkout_url": "https://checkout.stripe.com/c/pay/cs_test_a1b2c3d4...",
  "stripe_error": null,
  "email_sent": true
}

Example

curl -X POST "https://yourshop.zeroshop.io/admin/api/inquiries/42/convert" \
  -H "Authorization: Bearer zspat_..." \
  -H "Content-Type: application/json" \
  -d '{
    "unit_price_cents": 85000,
    "quantity": 1,
    "payment_method": "stripe",
    "shipping_mode": "configured",
    "shipping_method_id": 3,
    "shipping_cost_cents": 12000,
    "shipping_address": {
      "line1": "Kurfürstendamm 21",
      "city": "Berlin",
      "postal_code": "10719",
      "country": "DE"
    },
    "internal_notes": "Buyer confirmed €850 + €120 shipping on the call."
  }'
DELETE /admin/api/inquiries/{id}

Permanently delete an inquiry and all associated custom-field answers (cascade).

Response 204

Example

curl -X DELETE "https://yourshop.zeroshop.io/admin/api/inquiries/42" \
  -H "Authorization: Bearer zspat_..."

We value your privacy

We use cookies for essential site functionality and, with your consent, analytics to understand how our platform is used. No personal data is shared with third parties. See our Privacy Policy for details.