Triage buyer inquiries from inquiry-type products and track status
/admin/api/inquiries
List inquiries with pagination, filtering by status or product, and free-text search across name, email, and message.
/admin/api/inquiries/{id}
Fetch a single inquiry along with the buyer-submitted answers to any custom fields attached to the product.
/admin/api/inquiries/{id}
Update inquiry status and/or internal notes. Bumps `updated_at` and writes an `admin.inquiries.update` admin_logs entry.
/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.
/admin/api/inquiries/{id}
Permanently delete an inquiry and all associated custom-field answers (cascade).
/admin/api/inquiries
List inquiries with pagination, filtering by status or product, and free-text search across name, email, and message.
| 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). |
{
"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
}
curl "https://yourshop.zeroshop.io/admin/api/inquiries?status=new&page_size=25" \
-H "Authorization: Bearer zspat_..."
import requests
resp = requests.get(
"https://yourshop.zeroshop.io/admin/api/inquiries",
params={"status": "new", "page_size": 25},
headers={"Authorization": "Bearer zspat_..."}
)
inquiries = resp.json()
const params = new URLSearchParams({ status: "new", page_size: 25 });
const resp = await fetch(
`https://yourshop.zeroshop.io/admin/api/inquiries?${params}`,
{ headers: { "Authorization": "Bearer zspat_..." } }
);
const data = await resp.json();
require "net/http"
require "json"
uri = URI("https://yourshop.zeroshop.io/admin/api/inquiries?status=new&page_size=25")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer zspat_..."
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(resp.body)
/admin/api/inquiries/{id}
Fetch a single inquiry along with the buyer-submitted answers to any custom fields attached to the product.
{
"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"
}
]
}
curl "https://yourshop.zeroshop.io/admin/api/inquiries/42" \
-H "Authorization: Bearer zspat_..."
import requests
resp = requests.get(
"https://yourshop.zeroshop.io/admin/api/inquiries/42",
headers={"Authorization": "Bearer zspat_..."}
)
inquiry = resp.json()
const resp = await fetch("https://yourshop.zeroshop.io/admin/api/inquiries/42", {
headers: { "Authorization": "Bearer zspat_..." }
});
const inquiry = await resp.json();
require "net/http"
require "json"
uri = URI("https://yourshop.zeroshop.io/admin/api/inquiries/42")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer zspat_..."
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
inquiry = JSON.parse(resp.body)
/admin/api/inquiries/{id}
Update inquiry status and/or internal notes. Bumps `updated_at` and writes an `admin.inquiries.update` admin_logs entry.
{
"status": "replied",
"internal_notes": "Quoted shipping at €120 incl. insurance — awaiting confirmation."
}
{
"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"
}
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."}'
import requests
resp = requests.patch(
"https://yourshop.zeroshop.io/admin/api/inquiries/42",
json={"status": "replied", "internal_notes": "Quoted shipping at €120 incl. insurance."},
headers={"Authorization": "Bearer zspat_..."}
)
inquiry = resp.json()
const resp = await fetch("https://yourshop.zeroshop.io/admin/api/inquiries/42", {
method: "PATCH",
headers: {
"Authorization": "Bearer zspat_...",
"Content-Type": "application/json"
},
body: JSON.stringify({
status: "replied",
internal_notes: "Quoted shipping at €120 incl. insurance."
})
});
const inquiry = await resp.json();
require "net/http"
require "json"
uri = URI("https://yourshop.zeroshop.io/admin/api/inquiries/42")
req = Net::HTTP::Patch.new(uri)
req["Authorization"] = "Bearer zspat_..."
req["Content-Type"] = "application/json"
req.body = { status: "replied", internal_notes: "Quoted shipping at €120 incl. insurance." }.to_json
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
inquiry = JSON.parse(resp.body)
/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.
{
"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
}
{
"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
}
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."
}'
import requests
resp = requests.post(
"https://yourshop.zeroshop.io/admin/api/inquiries/42/convert",
json={
"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.",
},
headers={"Authorization": "Bearer zspat_..."}
)
result = resp.json()
checkout_url = result["stripe_checkout_url"]
const resp = await fetch(
"https://yourshop.zeroshop.io/admin/api/inquiries/42/convert",
{
method: "POST",
headers: {
"Authorization": "Bearer zspat_...",
"Content-Type": "application/json"
},
body: JSON.stringify({
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."
})
}
);
const result = await resp.json();
require "net/http"
require "json"
uri = URI("https://yourshop.zeroshop.io/admin/api/inquiries/42/convert")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer zspat_..."
req["Content-Type"] = "application/json"
req.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",
city: "Berlin",
postal_code: "10719",
country: "DE"
},
internal_notes: "Buyer confirmed €850 + €120 shipping on the call."
}.to_json
resp = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
result = JSON.parse(resp.body)
/admin/api/inquiries/{id}
Permanently delete an inquiry and all associated custom-field answers (cascade).
curl -X DELETE "https://yourshop.zeroshop.io/admin/api/inquiries/42" \
-H "Authorization: Bearer zspat_..."
import requests
requests.delete(
"https://yourshop.zeroshop.io/admin/api/inquiries/42",
headers={"Authorization": "Bearer zspat_..."}
)
await fetch("https://yourshop.zeroshop.io/admin/api/inquiries/42", {
method: "DELETE",
headers: { "Authorization": "Bearer zspat_..." }
});
require "net/http"
uri = URI("https://yourshop.zeroshop.io/admin/api/inquiries/42")
req = Net::HTTP::Delete.new(uri)
req["Authorization"] = "Bearer zspat_..."
Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
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.