Skip to navigation

Upload a menu (PDF or image) and get a proposal

Partner key + restaurant key. multipart/form-data with the menu in the field file: a PDF (up to 4 MB and 20 pages) or a JPEG, PNG or WebP image (up to 4 MB, 200 to 8000 pixels per side; HEIC is not supported). The type is read from the file’s content, not from Content-Type or the file name. The file is interpreted during the request and never stored; only the proposal is stored, as a draft that is deleted after 7 days. Sending the same file as an open draft returns that draft (200) without a new interpretation.

A language model reads the menu. For a PDF with a text layer every price and name is checked against the text, and if the model is unavailable the deterministic parser is used (proposal.source). An image or a scanned PDF cannot be checked against text and gets the warning CHECK_AGAINST_MENU. The call can take a couple of minutes. Committing always creates a new menu that is turned off, so nothing is overwritten. Works for sandboxes and real restaurants. Not allowed for an archived restaurant.

Limits: 10 interpretations per hour per restaurant (shared with the restaurant dashboard), 60 per hour per partner, and 20 model interpretations per day per restaurant.

Authentication

AuthorizationBearer

The partner key, sent as Authorization: Bearer lbp_test_…. Created in LettBestilt Partner under Partner key. It belongs to the partner, not to a restaurant, and only works against /api/v1/partner. Server to server only: a request with an Origin header is rejected with 403 FORBIDDEN. A test key sees and creates only sandboxes; live partner keys are not available yet. A revoked key, a restaurant key (lbs_…) here, or a suspended or archived partner returns 401 UNAUTHORIZED; an expired key returns 401 KEY_EXPIRED.

X-LettBestilt-Restaurant-Keystring

The restaurant’s own key (lbs_test_… or lbs_live_…), sent in X-LettBestilt-Restaurant-Key together with the partner key for calls about one restaurant. The key must have full access (scope *, otherwise 403 INSUFFICIENT_SCOPE), belong to a restaurant the partner owns, and be in the same environment as the partner key (otherwise 401 UNAUTHORIZED). A slug that does not exist, belongs to another partner or does not match the key always gives the same 404 RESTAURANT_NOT_FOUND. Older keys without an environment in the prefix (lbs_<random>) are not accepted here; rotate them in LettBestilt Partner.

Path parameters

slugstringRequired
The restaurant's slug.

Request

This endpoint expects a multipart form containing a file.
filefileRequired

PDF (høyst 4 MB og 20 sider) eller bilde i JPEG, PNG eller WebP (høyst 4 MB).

Response

The same file as an open draft. That draft, without a new interpretation.
dataobject

Errors

401
Unauthorized Error
403
Forbidden Error
404
Not Found Error
409
Conflict Error
413
Content Too Large Error
422
Unprocessable Entity Error
429
Too Many Requests Error
503
Service Unavailable Error