Pizza Ex Machina API
Order real pizza over HTTP. Base URL:
https://api.pizzaexmachina.com
All endpoints return JSON. Delivery is to US street addresses; each order is prepared by the kitchen partner nearest the address and dispatched with the note "Powered by Pizza Ex Machina".
Ordering & payment
Pizza Ex Machina has no API keys and no accounts. Orders are authorized and paid per purchase through the ZeroClick agent storefront — an agent buys there and the storefront completes the API call, payment and all. Menu prices are the entire price: delivery, tip, and tax included.
Quotes are free and need no payment at all: send any order with
"dryRun": true and it is priced end-to-end without being
placed or charged.
Get the menu
GET /v1/menuEvery item with its sku, price, and build. Prices are in
USD and include delivery, tip, and tax.
curl https://api.pizzaexmachina.com/v1/menu
Find a kitchen
GET /v1/storesKitchens that can deliver to an address, nearest first. Use the
returned storeId in the order.
Query parameters
| Param | Description |
|---|---|
| street | Street address, e.g. 116 S Halsted St |
| city | City |
| region | Two-letter state, e.g. IL |
| postalCode | ZIP code |
curl "https://api.pizzaexmachina.com/v1/stores?street=116+S+Halsted+St&city=Chicago®ion=IL&postalCode=60661"
Quote or place an order
POST /v1/ordersOne request carries the whole order. With "dryRun": true
it is priced and validated but never placed or charged; without it,
the order is placed and payment settles through ZeroClick.
Request body
| Field | Type | Description |
|---|---|---|
| storeId | string, required | A kitchen from /v1/stores that delivers to the address. |
| customer.firstName | string, required | Recipient's first name. |
| customer.lastName | string, required | Recipient's last name. |
| customer.email | string, required | Recipient's email. |
| customer.phone | string, required | Recipient's phone — the kitchen may call it from the door. |
| address.street | string, required | Street address, including any unit. |
| address.city | string, required | City. |
| address.region | string, required | Two-letter state. |
| address.postalCode | string, required | ZIP code. |
| address.deliveryInstructions | string | Door notes for the driver. |
| items[].sku | string, required | A menu sku from /v1/menu. |
| items[].quantity | integer | Defaults to 1. |
| dryRun | boolean | Price and validate only; nothing is placed or charged. |
Example: quote
curl -X POST https://api.pizzaexmachina.com/v1/orders \
-H "Content-Type: application/json" \
-d '{
"dryRun": true,
"storeId": "6338",
"customer": { "firstName": "Jae", "lastName": "Moreno",
"email": "jae@example.com", "phone": "3125550142" },
"address": { "street": "116 S Halsted St", "city": "Chicago",
"region": "IL", "postalCode": "60661" },
"items": [ { "sku": "pepperoni_ex_machina", "quantity": 1 } ]
}'
Response
{
"status": "quoted",
"totalUsd": 32,
"currency": "USD",
"storeId": "6338",
"deliverable": true,
"items": [ { "sku": "pepperoni_ex_machina", "quantity": 1, "priceUsd": 32 } ]
}
A placed order answers "status": "placed" with an
orderId and estimatedWaitMinutes.
Track an order
GET /v1/orders/trackThe live kitchen tracker for a placed order — the stages from prep to
bake to out-the-door, with timestamps. Look up by the customer phone
number the order was placed with; when several orders are live, match
on the orderId from the place response. Free, no payment
required. Tracking data appears moments after placing and expires a
while after delivery.
curl "https://api.pizzaexmachina.com/v1/orders/track?phone=3125550142"
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | Missing or malformed field; the response names it. |
| 400 | unknown_sku | An item sku is not on the menu; the response lists valid skus. |
| 401 | unauthorized | The order was not authorized through ZeroClick — buy via the agent storefront. |
| 404 | no_active_orders | No trackable orders for that phone number. |
| 409 | fulfillment_unavailable | The kitchen cannot serve this order (closed, or address out of range); try another storeId. |
| 502 | fulfillment_failed | The kitchen did not accept the order; nothing was charged. |
| 503 | kitchen_closed | Ordering is paused service-wide; quotes still work and nothing was charged. |