CLI Output Contract
This document defines the stable output shape for machine-readable responses used by
all wolt v1 commands.
Formats
Supported output formats:
table(default, human-readable)jsonyaml
Every command must support:
--format json--format yaml
Envelope
For json and yaml, the response envelope is mandatory:
{
"meta": {
"request_id": "req_01j0zdq8q6k7y8d6w2g0y9p4m7",
"generated_at": "2026-02-19T20:45:09Z",
"profile": "default",
"locale": "en-FI"
},
"data": {},
"warnings": []
}
YAML equivalent:
meta:
request_id: req_01j0zdq8q6k7y8d6w2g0y9p4m7
generated_at: "2026-02-19T20:45:09Z"
profile: default
locale: en-FI
data: {}
warnings: []
Field Conventions
- IDs: string identifiers from upstream APIs (
venue_id,item_id,basket_id) - Money:
amountin minor units (for example cents)- optional
formatted_amountstring for display
- Time:
- use ISO-8601 UTC by default (
generated_at, timestamps) - if upstream only provides localized strings, include both when possible
- use ISO-8601 UTC by default (
- Booleans should never be encoded as strings
Error Object
When a command fails, data may be null and error must be present:
{
"meta": {
"request_id": "req_01j0ze0cbm78jwry8x4v6x0g8t",
"generated_at": "2026-02-19T20:46:02Z",
"profile": "default",
"locale": "en-FI"
},
"data": null,
"warnings": [],
"error": {
"code": "WOLT_AUTH_REQUIRED",
"message": "Authentication is required for this command.",
"details": {
"hint": "Provide --wtoken/--cookie or configure profile credentials"
}
}
}
Error fields:
code(string, stable machine key)message(human-readable)details(object, optional)
Canonical Schema Types (Implemented Commands)
AuthStatus (auth status, profile status)
Required:
authenticateduser_idcountrysession_expires_atwolt_plus_subscriber
Optional:
token_preview(when--verbose)cookie_count(when--verbose)
DiscoveryFeed (discover feed)
Required:
citytotalcountoffsetwolt_plus_onlyenrichment_mode(full|fast)sections[]
Optional:
limit(when--limitis set)total_pages(when--limit > 0is set)next_offset(when more venues are available after current slice)page(when--pageis set)query(when--queryfilter is set)sort
Each sections[].items[] row includes:
venue_idslugnameratingdelivery_estimatedelivery_feeprice_range(integer level, may be null)price_range_scale(for example$,$$,$$$)promotions[](active venue promotion labels)wolt_plus
Notes:
- promotions are enriched with dynamic campaign banners (for example
40% off selected items) when the dynamic endpoint is available. - in
fastenrichment mode, dynamic/static per-venue enrichment is skipped.
CategoryList (discover categories)
Required:
categories[]:{id,name,slug}
VenueSearchResult (search venues)
Required:
querytotalitems[]:{venue_id,slug,name,address,rating,delivery_estimate,delivery_fee,price_range,price_range_scale,promotions,wolt_plus}
Optional:
countoffsetlimittotal_pagesnext_offsetpage
Notes:
- venue promotions are enriched with dynamic campaign banners (for example
40% off selected items) when the dynamic endpoint is available.
ItemSearchResult (search items)
Required:
querytotalitems[]:{item_id,venue_id,venue_slug,name,base_price,currency,is_sold_out}
Optional:
items[].discountsitems[].original_pricecountoffsetlimittotal_pagesnext_offsetpage
Notes:
base_price.currency/base_price.formatted_amountare normalized from payload venue metadata when upstream omits currency.
VenueDetail (venue show)
Required:
venue_idslugnameaddresscurrencyratingdelivery_methodsorder_minimum
VenueCategoryList (venue categories)
Required:
venue_idloading_strategycategories[]:{id,slug,name,parent_slug,level,leaf,item_refs_count}
VenueItemSearchResult (venue search)
Required:
venue_idvenue_slugquerytotalitems[]:{item_id,name,category,base_price,discounts,is_sold_out}
Optional:
original_price(when upstream exposes pre-discount amount)option_group_ids(when--include-options)countoffsetlimittotal_pagesnext_offsetpagesort
Notes:
base_price.currency/base_price.formatted_amountare normalized from venue metadata when upstream search payload omits currency.- when upstream returns
original_pricewithout promotion labels,discounts[]may contain a derived label like21% off.
VenueMenu (venue menu)
Required:
venue_idwolt_pluscategories[]items[]:{item_id,name,base_price,discounts}
Optional:
original_price(for campaign-adjusted menu prices)option_group_ids(when--include-options)countoffsetlimittotal_pagesnext_offsetpagesort
Notes:
- item-level campaign discounts from dynamic venue payloads are merged into
discounts[]. - when a percentage campaign applies,
base_priceis adjusted to discounted value andoriginal_priceis included.
VenueHours (venue hours)
Required:
venue_idtimezoneopening_windows[]
ItemDetail (item show)
Required:
item_idvenue_idnamedescriptionpriceoption_groups[]upsell_items[]
Notes:
price.currency/price.formatted_amountare normalized from payload venue metadata when upstream omits currency.upsell_items[].pricefollows the same normalization.
ItemOptions (item options)
Required:
venue_iditem_idcurrencygroup_countoption_groups[]
Each option_groups[] entry contains:
group_idnamerequiredminmaxvalues[]:{value_id,name,price,example_option}
CartState (cart show)
Required:
basket_idvenue_idvenue_namevenue_slugselectioncurrencytotal_itemslines[]subtotalfeestotal
Each line includes:
line_iditem_idnamecountoptions[]priceline_total
CartMutationResult (cart add, cart remove, cart clear)
Required:
mutationtotal_itemstotal
Conditional by mutation:
add:basket_id,venue_id,line_idremove:basket_id,venue_id,line_id,removed_countclear:basket_ids[],cleared_baskets
CheckoutPreview (checkout preview)
Required:
basket_idvenue_idvenue_namevenue_slugselectionpayable_amountcheckout_rows[]delivery_configs[]offerstip_config
ProfileSummary (profile show)
Required:
user_idnameemail_maskedphone_maskedcountry
OrderHistoryList (profile orders, profile orders list)
Required:
orders[]:{purchase_id,received_at,status,venue_name,total_amount,is_active,items_summary,payment_time_ts,main_image,main_image_blurhash}count
Optional:
next_page_tokenstatus_filter
OrderHistoryDetail (profile orders show)
Required:
order_idstatuscurrencyvenue:{id,name,address,phone,country,product_line}totals:{items,delivery,service_fee,subtotal,credits,tokens,total}where each value is{amount,formatted_amount}items[]:{id,name,count,price,line_total,options}payments[]:{name,amount,method_type,method_id,provider,payment_time}delivery:{alias,address,city,comment}
Optional:
order_numbercreation_timedelivery_timedelivery_methoddiscounts[]:{title,amount}surcharges[]:{title,amount}
AddressList (profile addresses)
Required:
addresses[]:{address_id,label,street,is_default}profile_default_address_id
Optional:
- none
AddressLinks (profile addresses links)
Required:
address_idlinks:{address_link,entrance_link,coordinates_link}
PaymentMethodList (profile payments)
Required:
methods[]:{method_id,type,label,is_default,is_available_for_checkout}