1. Orders
Fodimi
  • Clients
    • Get list
      GET
    • Create client
      GET
    • Get client orders list
      GET
    • Get client history
      GET
    • Update client details
      PUT
    • Create client
      GET
    • Create client
      POST
  • Orders
    • Get Order Details
      GET
    • Get orders list
      GET
    • Change order status
      PUT
    • Create an order
      POST
    • Quote an order
      POST
  • Menu
    • Get menu
      GET
    • Update Product visibility
      PUT
    • Bulk update menu translations
      PATCH
    • Update product translations
      PATCH
    • Update category translations
      PATCH
    • Update addon group translations
      PATCH
    • Update addon translations
      PATCH
    • Update variant group translations
      PATCH
    • Update variant translations
      PATCH
  • Webhooks
    • Order status changed
    • Order closed
    • Order canceled
    • Client created
    • Client details changed
    • Client points changed
    • Delivery status changed
  • Webhooks (sent by Fodimi)
    • Order status changed
    • Order closed
    • Order canceled
    • Client created
    • Client details changed
    • Client points changed
    • Delivery status changed
  • Account
    • Who am I
  • Schemas
    • Clients
      • Client list response
      • Client details response
      • Client history logs
    • Orders
      • Order list response
      • Order response
      • Order detailed response
      • Order product response
    • Menu translations section result
    • Menu translations not found
    • Validation error
  1. Orders

Create an order

Developing
POST
/orders
Creates a real order in the location: it shows up on the till, on the kitchen display and in reports.
You send ids, we do the maths. Product, variant and addon prices, packaging, environmental fees,
deposit, handling fee, promotions, the delivery zone and its cost are all resolved server-side from the menu.
The only amount taken from your request is tip. totals.total is read back from the stored order,
so it can never disagree with what the restaurant sees.
Required ability: orders:write. A key limited to selected locations can only order in those.

Before you go live#

Call POST /orders/quote with the same body to price a basket without creating anything —
that is what you show the customer before they confirm.

Validation is stricter than the Fodimi website#

The website has a front-end that filters the basket before it is submitted; you do not.
So this endpoint refuses sold-out and hidden products, variants that belong to a different product,
missing required addon groups, orders below the zone minimum and addresses outside every delivery zone.

Limits#

At most 100 items, 1000 units per item, 50 addon groups per item,
50 addons per group and 50 set selections.
invoice and checkout_extra_fields accept at most 20 levels, 65536 bytes and 200 keys.

Retries are not deduplicated#

This endpoint has no idempotency key. A retried request creates a second order, so only retry when
you know the first attempt never reached us. On a timeout, check GET /orders before sending again.

Error codes#

Every problem in the basket is reported at once in errors[], each with a JSON Pointer to the offending field.
CodeHTTPWhat it means
validation_failed422Request shape is wrong, a field is missing, or a field the API does not accept was sent. Fix the payload.
restaurant_not_found404Unknown restaurant_uid, or it belongs to another company. Check GET /me for the locations this key can reach.
restaurant_forbidden403The key is limited to selected locations and this is not one of them.
missing_ability403The key lacks orders:write. Ask the owner for a key with that ability (panel: Integracje → Klucze API).
restaurant_not_accepting_orders409The location has online ordering switched off right now. Retry later.
restaurant_closed409Outside the location's working hours. Note this is checked against the current time, not realization_time.
realization_time_invalid422realization_time is in the past.
cart_empty422items is empty or absent.
product_not_found422The product does not exist, or is outside the company and locations this key may reach.
product_foreign_restaurant422The product exists but belongs to a different location than the one being ordered from.
product_unavailable409The product is hidden or sold out. detail says which.
product_time_restricted409The product is not available at this hour, for this delivery type, or for this kind of order.
quantity_invalid422Quantity is zero, negative, not a number, fractional for a non-weighed product, or above the limit.
variant_invalid422The variant does not belong to the product it was sent with.
addon_group_invalid422The addon group does not belong to the product.
addon_invalid422The addon does not belong to the group it was sent in.
addon_group_required422A required addon group was not filled in. Groups hidden for the chosen variant are not required.
addon_limit_exceeded422More addons selected than the group allows.
set_selection_invalid422The set step or the product chosen in it does not belong to this set.
set_step_required422A required step of the set has no product chosen.
set_step_duplicate422Two products chosen for the same step of a set.
promo_code_invalid422The code does not exist, is switched off, expired, not assigned to this location, already used up, bound to another client, or requires client_uid.
promo_code_below_min_order422The code needs a larger order. The minimum is in errors[].min_order_amount.
promo_code_conflicts_with_offer409The code cannot be combined with the promotion the backend applied.
below_minimum_order422Order value is below the delivery zone minimum.
outside_delivery_zone422The address is outside every delivery zone of this location.
delivery_address_invalid422Delivery was requested without a usable address (street, city and coordinates are needed).
delivery_type_invalid422Unsupported delivery type.
payment_method_unavailable409The location does not accept this payment method for this delivery type.
client_not_found404Unknown client_uid in this company.
table_not_found422table_id does not belong to this location.
order_number_busy503Another order is being saved in this location. Wait a moment and retry.
internal_error500Unexpected server error. The order is never half-created — it is either fully saved or not at all.

A note on text you send#

Comments, customer details and address lines are stored and returned verbatim, without HTML encoding.
If you render them in your own interface, encode them there.

Request

Body Params application/jsonRequired

Examples

Responses

🟢201Created
application/json
Order created.
Bodyapplication/json

🟠401Unauthorized
🟠403Forbidden
🟠404Record Not Found
🟠409Record Not Found
🟠422Parameter Error
🟠429Parameter Error
🔴500Server Error
🔴503Service Unavailable
Request Request Example
Shell
JavaScript
Java
Swift
curl --location 'https://fodimi.pl/api_public/orders' \
--header 'Content-Type: application/json' \
--data-raw '{
    "restaurant_uid": "b06a191d-8e22-4707-8c1e-9b5119cf4461",
    "delivery_type": "DELIVERY",
    "status": "NEW",
    "payment": {
        "status": "NOT_PAID",
        "method": "CASH"
    },
    "customer": {
        "name": "Jan",
        "surname": "Kowalski",
        "email": "jan@example.com",
        "phone": "+48500600700"
    },
    "delivery_address": {
        "street_and_number": "Długa 5/3",
        "city": "Warszawa",
        "post_code": "00-001",
        "latitude": 52.23,
        "longitude": 21.01,
        "comments": "domofon 12"
    },
    "items": [
        {
            "product_id": 4211,
            "quantity": 2,
            "variant_price_id": 8912,
            "comments": "bez cebuli",
            "addon_groups": [
                {
                    "id": 88,
                    "selection": [
                        301,
                        302
                    ],
                    "removed": [
                        305
                    ]
                }
            ]
        },
        {
            "product_id": 4290,
            "quantity": 1,
            "set_selections": [
                {
                    "step_id": 11,
                    "step_product_id": 77
                },
                {
                    "step_id": 12,
                    "step_product_id": 81
                }
            ]
        }
    ],
    "promo_code": "LATO20",
    "tip": 5
}'
Response Response Example
201 - Success Example
{
    "uid": "7a2f1c44-2b9e-4d31-9f0a-2c1d4e5f6a7b",
    "internal_id": 123,
    "number": "#123",
    "status": "NEW",
    "payment_status": "NOT_PAID",
    "payment_method": "CASH",
    "restaurant_uid": "b06a191d-8e22-4707-8c1e-9b5119cf4461",
    "client_uid": null,
    "delivery_type": "DELIVERY",
    "realization_time": null,
    "created_at": "2026-09-14T18:05:00+02:00",
    "totals": {
        "products": 84,
        "packages": 2,
        "environmental_fees": 0.5,
        "deposit": 0,
        "handling_fee": 0,
        "delivery_cost": 9,
        "tip": 5,
        "promo_code_discount": 16.8,
        "special_offer_discount": 0,
        "total": 83.7,
        "currency": "PLN"
    },
    "applied": {
        "promo_code": "LATO20",
        "special_offer": null,
        "delivery_zone": {
            "id": 9,
            "name": "Strefa 1",
            "min_order_amount": 40
        }
    },
    "items": [
        {
            "product_id": 4211,
            "name": "Margherita",
            "quantity": 2,
            "unit_price": 42,
            "subtotal": 84,
            "variant": {
                "name": "40 cm"
            },
            "addons": [
                {
                    "id": 301,
                    "group_id": 88,
                    "name": "Ser",
                    "price": 4,
                    "removed": false
                }
            ],
            "set_selections": [],
            "package_price": 2
        }
    ],
    "warnings": []
}
Modified at 2026-09-12 12:21:09
Previous
Change order status
Next
Quote an order
Built with