Your integration is going to be linked with a Location, which belongs to an Organization. Each location can have more than one brand (Sushi, Poke, Burgers, ...). And each brand can have more than one catalog, with a different set of products.
When you create a new Tab, it has to be linked to a specific brand (brand ids are unique, the same brand in different locations has a different id). Then we will route the tab to the right location under the right brand name.
Please go to our developer portal to add your integration.
For both the Rest API and the webhooks we use the same authentication method. We will share with you an unique and secret token as a integrator, and in all the requests it has to be included as a header.
Authorization: Bearer \${token}
You should also include in every endpoint (except this one, an extra header LocationID or OrganizationID. Look in every endpoint in AUTHORIZATIONS Field to know which one should be added.
There are 2 rate limits applying to all endpoints:
And there is an specific rate limit only applying to /organizations endpoint:
Being an entity a LocationId
or OrganizationId
which should be added as a header.
Look in every endpoint in AUTHORIZATIONS Field to know which one should be added.
Import changes if you come from V1:
We have defined for most entities 2 schemes to be shared with you: Simple scheme and Complete scheme.
Note that GET routes which returns a LIST are returning entities with simple scheme format.
On the other hand, GET routes which returns a SINGLE ELEMENT are returning entities with complete scheme format.
The first example of this new behaviour is found on Locations.
Look response samples of Location List and Location by ID
Tokens have completely changed:
On V1, a token allows an integrator to operate over an organization.
So every integrator had a token for every organization.
On V2, a token allows an integrator to operate over ALL his organizations.
Your integration is gonna be visible by all our locations on their Admin Marketplace. So please, apart from selecting your capabilities and webhooks, have a time to edit your integration on Developer Portal (logo, name, description, ...) Let restaurants know how you can help them in their daily lives!
When a restaurant wants to integrate with you, we ask them:
Returns a list of the organizations that have at least 1 location integrated with you
[- {
- "id": "f2779a96-578f-4649-89f6-a0972183efea",
- "name": "Organization 1"
}, - {
- "id": "6df10f06-b232-4e8c-8599-d202d50f18d0",
- "name": "Organization 2"
}
]
Returns the list of courses defined by the organization
organizationId required | string <uuid> = 36 characters Organization Id |
[- {
- "name": "Entrantes",
- "position": 0
}, - {
- "name": "Primeros",
- "position": 1
}, - {
- "name": "Segundos",
- "position": 2
}
]
Returns organization catalog.
organizationId required | string <uuid> = 36 characters Organization Id |
{- "modifiers": [
- {
- "id": "4a024967-6690-4f99-955c-af2a7ccd7511",
- "name": "Muy Hecho",
- "priceImpact": 0,
- "enabled": true
}, - {
- "id": "5b9d0e98-0a79-41b2-81c4-6795c9b1f280",
- "name": "Al punto",
- "priceImpact": 0,
- "enabled": true
}
], - "modifierGroups": [
- {
- "id": "2dbe5f3b-4e5b-4c98-b1b3-c3d2dc3484e5",
- "name": "Como quieres la carne?",
- "min": 1,
- "max": 1,
- "enabled": true,
- "modifiers": [
- "4a024967-6690-4f99-955c-af2a7ccd7511",
- "5b9d0e98-0a79-41b2-81c4-6795c9b1f280"
]
}
], - "products": [
- {
- "id": "e80f9004-abac-4a0c-a190-f7fda9cb3208",
- "name": "Burguer",
- "price": 990,
- "course": null,
- "enabled": true,
- "externalId": null,
- "allergens": [
- "milk"
], - "schedules": [ ],
- "modifierGroups": [
- "2dbe5f3b-4e5b-4c98-b1b3-c3d2dc3484e5"
]
}, - {
- "id": "e80f9004-abac-4a0c-a190-f7fda9cb3209",
- "name": "Coca Cola",
- "price": 120,
- "course": null,
- "enabled": true,
- "externalId": null,
- "allergens": [ ],
- "schedules": [ ],
- "modifierGroups": [ ]
}
], - "combos": [
- {
- "id": "18d121bd-99ac-4bc4-9ccb-ff294aa367c2",
- "name": "Menu Burguer",
- "price": 0,
- "enabled": true,
- "schedules": [ ],
- "categories": [
- {
- "id": "bd3a5b9b-910e-4a37-b3c1-761e0d2c6c5a",
- "name": "Burguers",
- "min": 1,
- "max": 1,
- "enabled": true,
- "products": [
- {
- "id": "7c50f78a-d9e6-4389-b90d-79b9114adc5a",
- "productId": "e80f9004-abac-4a0c-a190-f7fda9cb3208",
- "enabled": true,
- "priceImpact": 0
}
]
}, - {
- "id": "bd3a5b9b-910e-4a37-b3c1-761e0d2c6c56",
- "name": "Bebidas",
- "min": 1,
- "max": 1,
- "enabled": true,
- "products": [
- {
- "id": "7c50f78a-d9e6-4389-b90d-79b9114adc5b",
- "productId": "e80f9004-abac-4a0c-a190-f7fda9cb3209",
- "enabled": true,
- "priceImpact": 0
}
]
}
]
}
]
}
Valid operations over locations. What is a brand?
Returns the location list integrated with you of this organization
organizationId required | string <uuid> = 36 characters Unique identifier of the organization |
[- {
- "id": "f2779a92-578f-4649-89f6-a0972183efea",
- "name": "Pl Catalunya",
- "address": "Plaça de Catalunya, 08002 Barcelona",
- "email": "notifications@restBarcelona.com",
- "postalCode": "08002",
- "phoneNumber": "666666666",
- "latitude": 41.441969,
- "longitude": 2.203933,
- "countryCode": "ES",
- "regionCode": "CT",
- "city": "Barcelona"
}, - {
- "id": "6df10f06-b232-4e8c-8599-d202d50f18d0",
- "name": "Prado",
- "address": "Calle del Prado, 2, 28014 Madrid",
- "email": "notifications@restMadrid.com",
- "postalCode": "28014",
- "phoneNumber": "666666666",
- "latitude": 41.441969,
- "longitude": 2.203933,
- "countryCode": "ES",
- "regionCode": "MD",
- "city": "Madrid"
}
]
Returns the location with this identifier
locationId required | string <uuid> = 36 characters Unique identifier of the location |
{- "id": "f2779a96-578f-4649-89f6-a0972183efea",
- "name": "Pl Catalunya",
- "address": "Plaça de Catalunya, 08002 Barcelona",
- "email": "notifications@restBarcelona.com",
- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "postalCode": "08002",
- "phoneNumber": "666666666",
- "latitude": 41.441969,
- "longitude": 2.203933,
- "countryCode": "ES",
- "regionCode": "CT",
- "city": "Barcelona",
- "defaultPosCatalogId": "12349a96-578f-4649-89f6-a0972183efea",
- "brands": [
- {
- "id": "23cdda27-2f82-46e4-a366-deecd5d420d0",
- "name": "My Sushi Brand",
- "catalogs": {
- "default": "3ba9c8f3-a42f-495d-a793-7eb7af6537f1",
- "justeat": null,
- "takeaway": "3ba9c8f3-a42f-495d-a793-7eb7af6537f1",
- "glovo": "3ba9c8f3-a42f-495d-a793-7eb7af6537f1",
- "shop": {
- "delivery": "3ba9c8f3-a42f-495d-a793-7eb7af6537f1",
- "onsite": "3ba9c8f3-a42f-495d-a793-7eb7af6537f1",
- "takeaway": "f241c7c4-013c-46ea-aca1-ea50ca1921e2"
}
}, - "fullCatalogs": {
- "default": {
- "deliveryCatalogId": "3ba9c8f3-a42f-495d-a793-7eb7af6537f1",
- "takeawayCatalogId": "3ba9c8f3-a42f-495d-a793-7eb7af6537f1",
- "onsiteCatalogId": "3ba9c8f3-a42f-495d-a793-7eb7af6537f1"
}, - "justeat": {
- "deliveryCatalogId": "1a629846-25f2-4110-9b7d-e442e6eb8a39",
- "takeawayCatalogId": null,
- "onsiteCatalogId": null
}, - "glovo": {
- "deliveryCatalogId": "3ba9c8f3-a42f-495d-a793-7eb7af6537f1",
- "takeawayCatalogId": null,
- "onsiteCatalogId": null
}, - "shop": {
- "deliveryCatalogId": "3ba9c8f3-a42f-495d-a793-7eb7af6537f1",
- "takeawayCatalogId": "f241c7c4-013c-46ea-aca1-ea50ca1921e2",
- "onsiteCatalogId": "3ba9c8f3-a42f-495d-a793-7eb7af6537f1"
}
}
}
], - "preparationMinutes": 15,
- "shopAreas": [
- {
- "id": "a83f0995-0234-446f-ac42-c3e2492881bb",
- "locationId": "f2789a96-578f-4649-89f6-a0972183efea",
- "name": "Sicilia",
- "deliveryFee": 1200,
- "deliveryExtraMinutes": 11,
- "minimumBasket": 1000,
- "polygon": [
- {
- "lat": 41.411206735924424,
- "lng": 2.170459031494123
}, - {
- "lat": 41.39781609535299,
- "lng": 2.1618759626464668
}, - {
- "lat": 41.39408167471969,
- "lng": 2.1728622907714668
}, - {
- "lat": 41.40039143284847,
- "lng": 2.191058396728498
}, - {
- "lat": 41.41107799290444,
- "lng": 2.190886735351545
}
], - "enabled": false,
- "estimatedDeliveryMinutes": 26
}, - {
- "id": "4123e3a3-2b2b-4c28-a733-50e87735b352",
- "locationId": "f2799a96-578f-4649-89f6-a0972183efea",
- "name": "maracaibo",
- "deliveryFee": 190,
- "deliveryExtraMinutes": 30,
- "minimumBasket": 1000,
- "polygon": [
- {
- "lat": 41.44968945529636,
- "lng": 2.1989548200683418
}, - {
- "lat": 41.441582953121106,
- "lng": 2.1914017194824043
}, - {
- "lat": 41.431287522523725,
- "lng": 2.2140610212402168
}, - {
- "lat": 41.44261240636137,
- "lng": 2.2152626508788886
}
], - "enabled": false,
- "estimatedDeliveryMinutes": 45
}
], - "workingTimes": {
- "default": {
- "thursday": [
- {
- "id": "6939ef89-9179-4ab8-97ff-d394999b5370",
- "day": "thursday",
- "start": "08:00",
- "end": "00:00"
}
], - "monday": [
- {
- "id": "6c2d8783-b299-4a44-9a9b-fae4f0b92874",
- "day": "monday",
- "start": "08:00",
- "end": "00:00"
}
], - "wednesday": [
- {
- "id": "991070eb-9561-460f-ad61-177affdc1b7b",
- "day": "wednesday",
- "start": "08:00",
- "end": "00:00"
}
], - "tuesday": [
- {
- "id": "aa1f3526-209c-4471-8a0c-090a10c0c975",
- "day": "tuesday",
- "start": "08:00",
- "end": "00:00"
}
], - "friday": [
- {
- "id": "df2c5ea5-ac9b-49a1-aff2-507cec1f528c",
- "day": "friday",
- "start": "08:00",
- "end": "00:00"
}
]
}, - "f2779a95-578f-4649-89f6-a0972183efea": {
- "friday": [
- {
- "id": "01e85701-1f9e-424c-a925-24749145cfd9",
- "day": "friday",
- "start": "08:00",
- "end": "20:00",
- "locationVirtualBrandId": "f2709a96-578f-4649-89f6-a0972183efea"
}
], - "saturday": [
- {
- "id": "9ebbec16-c4de-4ff0-9c95-400414f51d60",
- "day": "saturday",
- "start": "08:00",
- "end": "20:00",
- "locationVirtualBrandId": "f2709a96-578f-4649-89f6-a0972183efea"
}
], - "monday": [
- {
- "id": "b609a2d5-c528-42ac-bd19-4b29ba85aa59",
- "day": "monday",
- "start": "08:00",
- "end": "20:00",
- "locationVirtualBrandId": "f2709a96-578f-4649-89f6-a0972183efea"
}
], - "wednesday": [
- {
- "id": "c4ac6828-afc5-4777-864b-8df55c7af067",
- "day": "wednesday",
- "start": "08:00",
- "end": "20:00",
- "locationVirtualBrandId": "f2709a96-578f-4649-89f6-a0972183efea"
}
], - "thursday": [
- {
- "id": "d8def688-b17f-48ed-a680-0fe8acc9cf7e",
- "day": "thursday",
- "start": "08:00",
- "end": "20:00",
- "locationVirtualBrandId": "f2709a96-578f-4649-89f6-a0972183efea"
}
], - "tuesday": [
- {
- "id": "ebd13e06-dbea-40d3-b66c-05ccec1465dc",
- "day": "tuesday",
- "start": "08:00",
- "end": "20:00",
- "locationVirtualBrandId": "f2709a96-578f-4649-89f6-a0972183efea"
}
]
}
}, - "paymentMethods": [
- "card",
- "cash",
- "dataphone"
], - "offlinePaymentMethods": [
- {
- "method": "card",
- "pickupType": "takeaway"
}, - {
- "method": "card",
- "pickupType": "delivery"
}
]
}
Returns a list of floorplans
locationId required | string <uuid> = 36 characters Unique identifier of the location |
name | string non-empty Example: name=Sala Name of the floorplan |
[- {
- "id": "d482a7b0-377e-4a56-8c43-7d847738f044",
- "name": "Main",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "tables": [
- {
- "id": "03d96ebb-b36c-43b1-874a-24eecec1abc2",
- "name": "A1",
- "seats": 2
}, - {
- "id": "398bcf26-141f-42c5-80a2-391270d7f92a",
- "name": "B2",
- "seats": 2
}, - {
- "id": "11b005ee-d7e3-4aea-b545-9d1d659b0396",
- "name": "Barra",
- "seats": 4
}
]
}, - {
- "id": "75b87c37-6ca2-4815-9e07-3f05b0185a66",
- "name": "Outside",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "tables": [
- {
- "id": "cb38cb1c-9052-4637-a499-50d4fd8fc86c",
- "name": "T2",
- "seats": 2
}
]
}
]
Returns a floorplan by his identifier
floorplanId required | string <uuid> = 36 characters Unique identifier of the floorplan |
{- "id": "d482a7b0-377e-4a56-8c43-7d847738f044",
- "name": "Main",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "tables": [
- {
- "id": "03d96ebb-b36c-43b1-874a-24eecec1abc2",
- "name": "A1",
- "min": 1,
- "max": 2
}, - {
- "id": "398bcf26-141f-42c5-80a2-391270d7f92a",
- "name": "B2",
- "min": 1,
- "max": 2
}, - {
- "id": "11b005ee-d7e3-4aea-b545-9d1d659b0396",
- "name": "Barra",
- "min": 1,
- "max": 4
}
]
}
Returns a list of catalogs
locationId required | string <uuid> = 36 characters Unique identifier of the location |
name | string non-empty Example: name=Delivery Catalog Name of the catalog |
[- {
- "id": "93724e32-195d-49cd-9b0e-96e3dc0945b5",
- "name": "My Catalog",
- "organizationId": "19264e32-195d-49cd-9b0e-96e3dc0945b5",
- "deleted": false
}
]
Returns a catalog by his identifier
catalogId required | string <uuid> = 36 characters Unique identifier of the catalog |
{- "id": "93724e32-195d-49cd-9b0e-96e3dc0945b5",
- "name": "My Catalog",
- "organizationId": "19264e32-195d-49cd-9b0e-96e3dc0945b5",
- "deleted": false,
- "modifierGroups": [
- {
- "allowRepeat": false,
- "id": "c033799d-0448-4166-8f21-a3f86c115849",
- "min": 1,
- "max": 1,
- "name": "Point",
- "modifiers": [
- {
- "name": "Rare",
- "id": "120ae8bc-05e2-4e17-8dc4-4d33ae76e023",
- "organizationModifierId": "c064032c-885a-4e61-9bee-293ee030aa76",
- "priceImpact": 0,
- "externalId": "1234"
}, - {
- "name": "Medium",
- "id": "8ddc4e32-195d-49cd-9b0e-96e3dc0945b5",
- "organizationModifierId": "b671220a-fe3a-4dff-8aef-c2a228a57e56",
- "priceImpact": 0
}, - {
- "name": "Well done",
- "id": "12881d29-efa5-4522-a3b0-0f790b1d1e93",
- "organizationModifierId": "77a42a6f-3af3-495a-8767-2fe0816d792c",
- "priceImpact": 0
}
]
}
], - "categories": [
- {
- "name": "Example category",
- "id": "d8486f43-04c6-4d94-b683-654e053957f0",
- "products": [
- {
- "name": "Burger",
- "type": "PRODUCT",
- "price": 750,
- "vatPercentage": 10,
- "allergens": [
- "EGG",
- "GLUTEN"
], - "specifications": [
- "glutenfree",
- "hot",
- "vegan"
], - "id": "1a2cfa61-0d75-43d1-a839-3b5ba5c3bf10",
- "externalId": "3567",
- "description": "A nice burger",
- "modifierGroups": [
- "c033799d-0448-4166-8f21-a3f86c115849"
], - "organizationProductId": "e98f45e0-d614-4a44-9ab1-616489fc38f1"
}
]
}, - {
- "name": "Combos",
- "id": "combos-category-id",
- "products": [
- {
- "name": "Menu",
- "type": "COMBO",
- "price": 1000,
- "vatPercentage": 10,
- "id": "7452516e-5884-4495-b953-7997cb0d3039",
- "categories": [
- {
- "id": "a289a696-f39a-434d-af3e-421b35ed3cb6",
- "name": "First",
- "max": 1,
- "products": [
- {
- "id": "a21192ec-5e7e-414c-8c86-df9110238ad1",
- "name": "Edamame",
- "priceImpact": 150,
- "modifierGroups": [ ]
}
]
}
], - "organizationComboId": "e4a4ace0-fda5-45e7-9b77-f03d4161019c",
- "description": "Explanation of the combo"
}
]
}
]
}
Allows to enable or disable a existent catalog product
catalogId required | string <uuid> = 36 characters Unique identifier of the catalog |
productId required | string <uuid> = 36 characters Unique identifier of the catalog product id |
enable required | boolean Status of the catalog product |
{- "enable": true
}
{- "error": "Something wrong on your request"
}
Valid operations over tabs. What is a tab?
Create a tab
brandId required | string <uuid> = 36 characters Unique identifier for a location brand |
code required | string non-empty Code shown to the user in your system |
source required | string non-empty Source of the tab |
required | Array of objects (addTabProducts) |
externalId | string Identifier of the tab on your system |
operationalCode | string <= 4 characters Operational code you want us to show on the ticket. |
pickupTime | string <date-time> Estimated pickupTime time in ISO 8601 |
schedulingTime | string <date-time> Estimated scheduling time in ISO 8601 |
notes | string non-empty Tab notes |
object Discount applied over the tab | |
object Object containing company info | |
object Object containing customer info | |
tableId | string <uuid> = 36 characters Unique identifier of the table of restaurant. If it is present, tab is considered as a Restaurant. |
object Object details of the delivery. If it is present, the tab is considered as a delivery. Otherwise the tab is a take away. | |
Array of objects Array containing payments | |
preferredPaymentMethod | string non-empty Preferred payment method by customer |
withoutBills | boolean Default: false Parameter to indicate automatic bill creation |
{- "brandId": "f2779a96-578f-4649-89f6-a0972183efea",
- "products": [
- {
- "type": "PRODUCT",
- "id": "86eda7fe-e59f-4ca3-89a8-3a179ee8e0f2",
- "name": "Burger",
- "quantity": 2,
- "price": 1000,
- "modifiers": [
- {
- "priceImpact": 300,
- "id": "63ac4b67-c39b-42bb-8d44-36e57e586152",
- "name": "Extra meat",
- "quantity": 2
}, - {
- "priceImpact": 0,
- "id": "cf7805aa-4fb9-4a97-b975-924b48898a97",
- "name": "Water (33 cl)",
- "quantity": 1
}
]
}, - {
- "type": "PRODUCT",
- "externalId": "07fc40ab-0e6b-4cb7-ac6b-3442c7c77ade",
- "name": "Ice cream",
- "quantity": 1,
- "price": 480,
- "modifiers": [
- {
- "quantity": 1,
- "name": "Vanilla flavour",
- "priceImpact": 0,
- "id": "614338bc-b017-4cc4-9528-375a5d42d0ea"
}, - {
- "priceImpact": 0,
- "id": "e127cc65-5281-4433-8389-1ed8286f7074",
- "name": "Small size",
- "quantity": 1
}
]
}, - {
- "type": "COMBO",
- "name": "Combo",
- "price": 480,
- "id": "348951a7-dea5-409e-a365-21f51045da67",
- "quantity": 1,
- "products": [
- {
- "id": "4b5dd754-e4b2-478c-9bf7-df1f476d0763",
- "quantity": 1,
- "name": "Combo option",
- "priceImpact": 0
}
]
}
], - "notes": "I am allergic to tomato",
- "code": "B1234567",
- "operationalCode": "B123",
- "pickupTime": "2019-09-10T13:17:00.000Z",
- "preferredPaymentMethod": "cash",
- "customer": {
- "name": "Bruce",
- "surname": "Wayne",
- "phoneNumber": "+34666666666",
- "email": "hello@test.com"
}, - "company": {
- "name": "Monsters, Inc",
- "address": "Gran Via de les Corts Catalanes, 620",
- "taxId": "B66249567"
}, - "discount": {
- "concept": "Discount of 5%!",
- "amount": 5,
- "type": "percentage"
}, - "schedulingTime": "2019-09-10T13:17:00.000Z",
- "delivery": {
- "address": "Gran Via de les Corts Catalanes, 620",
- "details": "First door to the left",
- "latitude": 41.3876734,
- "longitude": 2.1647098,
- "fee": 190
}, - "payments": [
- {
- "method": "card",
- "paidAmount": 7000
}
]
}
{- "name": null,
- "creationTime": "2020-07-31T15:48:22.000Z",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "source": "Shop",
- "allergyInfo": null,
- "customerNote": null,
- "kitchenNote": null,
- "tableName": null,
- "closeTime": "2020-08-06T15:32:04.000Z",
- "locationBrandId": "23cdda27-2f82-46e4-a366-deecd5d420d0",
- "customerId": "998a26bd-04a0-11ea-8884-0242ac110002",
- "code": "S002",
- "pickupType": "takeAway",
- "schedulingTime": "2020-08-02T22:30:00.000Z",
- "activationTime": "2020-08-06T15:32:04.000Z",
- "tabTables": [ ],
- "products": [
- {
- "id": "f3cf29da-b5c9-408f-b6e9-ba14732b0bc8",
- "catalogProductId": "7d2b8e27-e0bf-4732-8044-223943b7fd05",
- "organizationProductId": "3cbeaeca-49f6-4dda-be87-5f7cb96d12db",
- "organizationComboId": null,
- "externalId": "0534073e-3eec-4ecc-83a4-ab446a30ca2a",
- "name": "Burger",
- "price": 1400,
- "quantity": 1,
- "course": "Main",
- "comments": null,
- "fullPrice": 1400,
- "finalPrice": 1400,
- "type": "PRODUCT",
- "promotionId": null,
- "modifiers": [
- {
- "id": "348ca8b3-28cd-4adf-a5ce-951f0158d704",
- "name": "Cheese",
- "priceImpact": 0,
- "quantity": 1,
- "catalogModifierId": "65254ec3-3ec8-4279-a5b9-118dd4391832"
}
], - "comboProducts": [ ]
}
], - "seats": 1,
- "waiters": [
- "Elon"
], - "bills": [
- {
- "id": "e7812d44-d953-4617-9960-dee1e68253fc",
- "number": 859,
- "creationTime": "2020-07-31T15:48:23.000Z",
- "finalizingTime": "2020-07-31T15:48:23.000Z",
- "company": {
- "name": "LastPOS",
- "taxId": "1234",
- "address": "Maracaibo 8, Nave 2, 08041, Barcelona"
}, - "total": 1400,
- "tax": 127,
- "taxableBase": 1273,
- "discountTotal": 0,
- "deliveryFee": 0,
- "minimumBasketSurcharge": 0,
- "terraceSurcharge": 0,
- "terraceSurchargePercentage": 0,
- "payments": [ ],
- "products": [
- {
- "id": "7a740ff2-d326-42ea-a239-c9b9125d3fc3",
- "catalogProductId": "7d2b8e27-e0bf-4732-8044-223943b7fd05",
- "tabProductId": "f3cf29da-b5c9-408f-b6e9-ba14732b0bc8",
- "name": "Burger",
- "price": 1400,
- "originalPrice": 1400,
- "quantity": 1,
- "modifiers": [
- {
- "id": "be75642e-7f74-42e8-bd3d-de575caa1848",
- "name": "Cheese",
- "priceImpact": 0,
- "quantity": 1,
- "catalogModifierId": "54393d6e-5780-45da-a96f-8de45eac10cc"
}
], - "comboProducts": [ ]
}
]
}
], - "customerInfo": {
- "name": "Bruce",
- "surname": "Wayne",
- "phoneNumber": "+34666666666",
- "email": "batman@wayneindustries.com"
}, - "delivery": {
- "address": "Gran Via de les Corts Catalanes, 620",
- "details": "First door to the left",
- "latitude": 41.3876734,
- "longitude": 2.1647098,
- "statuses": [
- {
- "creationTime": "2020-08-03T09:10:11.000Z",
- "status": "KITCHEN"
}, - {
- "creationTime": "2020-08-05T14:06:09.000Z",
- "status": "CLOSED"
}
], - "courier": {
- "name": "Jose"
}
}
}
Returns a list of tabs.
NOTE
Maximum interval date: 365 days
locationId required | string <uuid> = 36 characters Example: locationId=712b9774-5298-42ac-aa5e-c61debb8e419 Unique identifier of the location |
startDate required | string <date-time> Example: startDate=2024-03-28 10:59:06 Retrieve tabs with activation time after startDate (in ISO 8601) |
endDate required | string <date-time> Example: endDate=2024-04-04 10:59:06 Retrieve tabs with activation time after endDate (in ISO 8601) |
offset | number >= 0 Default: 0 The number of tabs to skip. |
limit | number [ 5 .. 100 ] Default: 20 The maximum number of tabs to be returned. |
tabName | string Example: tabName=Ricardo Only retrieve tabs with a specific name |
tableId | string Example: tableId=bb4ff314-4d9f-4fa9-a046-749fd1d12b18 Only retrieve tabs from tables with this id |
tableName | string Example: tableName=A1 Only retrieve tabs from tables with a specific name |
open | boolean Only retrieve tabs which are open/closed |
customerId | string <uuid> = 36 characters Example: customerId=712b9774-5298-42ac-aa5e-c61debb8e419 Only retrieve tabs from a specific customer |
[- {
- "id": "bbcfabf5-d660-4c21-9751-4e8f197439e4",
- "name": null,
- "creationTime": "2020-07-31T15:48:22.000Z",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "source": "Shop",
- "allergyInfo": null,
- "customerNote": null,
- "kitchenNote": null,
- "tableName": null,
- "closeTime": "2020-08-06T15:32:04.000Z",
- "cancelTime": "2020-08-06T15:32:04.000Z",
- "locationBrandId": "23cdda27-2f82-46e4-a366-deecd5d420d0",
- "customerId": "998a26bd-04a0-11ea-8884-0242ac110002",
- "code": "S002",
- "pickupType": "takeAway",
- "schedulingTime": "2020-08-02T22:30:00.000Z",
- "activationTime": "2020-08-06T15:32:04.000Z",
- "seats": 1
}
]
Allows to retrieve a specific tab by its ID.
tabId required | string <uuid> = 36 characters Unique identifier of the tab |
{- "name": null,
- "creationTime": "2020-07-31T15:48:22.000Z",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "source": "Shop",
- "allergyInfo": null,
- "customerNote": null,
- "kitchenNote": null,
- "tableName": null,
- "closeTime": "2020-08-06T15:32:04.000Z",
- "locationBrandId": "23cdda27-2f82-46e4-a366-deecd5d420d0",
- "customerId": "998a26bd-04a0-11ea-8884-0242ac110002",
- "code": "S002",
- "pickupType": "takeAway",
- "schedulingTime": "2020-08-02T22:30:00.000Z",
- "activationTime": "2020-08-06T15:32:04.000Z",
- "tabTables": [ ],
- "products": [
- {
- "id": "f3cf29da-b5c9-408f-b6e9-ba14732b0bc8",
- "catalogProductId": "7d2b8e27-e0bf-4732-8044-223943b7fd05",
- "organizationProductId": "3cbeaeca-49f6-4dda-be87-5f7cb96d12db",
- "organizationComboId": null,
- "externalId": "0534073e-3eec-4ecc-83a4-ab446a30ca2a",
- "name": "Burger",
- "price": 1400,
- "quantity": 1,
- "course": "Main",
- "comments": null,
- "fullPrice": 1400,
- "finalPrice": 1400,
- "type": "PRODUCT",
- "promotionId": null,
- "modifiers": [
- {
- "id": "348ca8b3-28cd-4adf-a5ce-951f0158d704",
- "name": "Cheese",
- "priceImpact": 0,
- "quantity": 1,
- "catalogModifierId": "65254ec3-3ec8-4279-a5b9-118dd4391832"
}
], - "comboProducts": [ ]
}
], - "seats": 1,
- "waiters": [
- "Elon"
], - "bills": [
- {
- "id": "e7812d44-d953-4617-9960-dee1e68253fc",
- "number": 859,
- "creationTime": "2020-07-31T15:48:23.000Z",
- "finalizingTime": "2020-07-31T15:48:23.000Z",
- "company": {
- "name": "LastPOS",
- "taxId": "1234",
- "address": "Maracaibo 8, Nave 2, 08041, Barcelona"
}, - "total": 1400,
- "tax": 127,
- "taxableBase": 1273,
- "discountTotal": 0,
- "deliveryFee": 0,
- "minimumBasketSurcharge": 0,
- "terraceSurcharge": 0,
- "terraceSurchargePercentage": 0,
- "payments": [ ],
- "products": [
- {
- "id": "7a740ff2-d326-42ea-a239-c9b9125d3fc3",
- "catalogProductId": "7d2b8e27-e0bf-4732-8044-223943b7fd05",
- "tabProductId": "f3cf29da-b5c9-408f-b6e9-ba14732b0bc8",
- "name": "Burger",
- "price": 1400,
- "originalPrice": 1400,
- "quantity": 1,
- "modifiers": [
- {
- "id": "be75642e-7f74-42e8-bd3d-de575caa1848",
- "name": "Cheese",
- "priceImpact": 0,
- "quantity": 1,
- "catalogModifierId": "54393d6e-5780-45da-a96f-8de45eac10cc"
}
], - "comboProducts": [ ]
}
]
}
], - "customerInfo": {
- "name": "Bruce",
- "surname": "Wayne",
- "phoneNumber": "+34666666666",
- "email": "batman@wayneindustries.com"
}, - "delivery": {
- "address": "Gran Via de les Corts Catalanes, 620",
- "details": "First door to the left",
- "latitude": 41.3876734,
- "longitude": 2.1647098,
- "statuses": [
- {
- "creationTime": "2020-08-03T09:10:11.000Z",
- "status": "KITCHEN"
}, - {
- "creationTime": "2020-08-05T14:06:09.000Z",
- "status": "CLOSED"
}
], - "courier": {
- "name": "Jose"
}
}
}
Cancel a Tab
tabId required | string <uuid> = 36 characters Unique identifier of the tab |
cancelReason required | string |
{- "cancelReason": "User cancelled manually"
}
{- "error": "Something wrong on your request"
}
Allows to add products to a tab
tabId required | string Tab Id |
id | string <uuid> = 36 characters Unique identifier for the product in Last |
name required | string Name of the product |
quantity required | number >= 1 Quantity of the product |
price required | number Price per unit of the product (without modifiers included). Represented as an integer in the smallest denomination of the currency |
type required | string Enum: "PRODUCT" "COMBO" Type of the product |
course | string non-empty Course of the product |
externalId | string non-empty Identifier of the product in the external system |
comments | string non-empty Comments of the product |
Array of objects Array containing the modifiers of the product. Only if product type is PRODUCT | |
object Optional discount object |
[- {
- "type": "PRODUCT",
- "id": "86eda7fe-e59f-4ca3-89a8-3a179ee8e0f2",
- "name": "Burger",
- "quantity": 2,
- "price": 1000,
- "modifiers": [
- {
- "priceImpact": 300,
- "id": "63ac4b67-c39b-42bb-8d44-36e57e586152",
- "name": "Extra meat",
- "quantity": 2
}, - {
- "priceImpact": 0,
- "id": "cf7805aa-4fb9-4a97-b975-924b48898a97",
- "name": "Water (33 cl)",
- "quantity": 1
}
]
}, - {
- "type": "PRODUCT",
- "externalId": "07fc40ab-0e6b-4cb7-ac6b-3442c7c77ade",
- "name": "Ice cream",
- "quantity": 1,
- "price": 480,
- "modifiers": [
- {
- "quantity": 1,
- "name": "Vanilla flavour",
- "priceImpact": 0,
- "id": "614338bc-b017-4cc4-9528-375a5d42d0ea"
}, - {
- "priceImpact": 0,
- "id": "e127cc65-5281-4433-8389-1ed8286f7074",
- "name": "Small size",
- "quantity": 1
}
]
}, - {
- "type": "COMBO",
- "name": "Combo",
- "price": 480,
- "id": "348951a7-dea5-409e-a365-21f51045da67",
- "quantity": 1,
- "products": [
- {
- "id": "4b5dd754-e4b2-478c-9bf7-df1f476d0763",
- "quantity": 1,
- "name": "Combo option",
- "priceImpact": 0
}
]
}
]
{- "name": null,
- "creationTime": "2020-07-31T15:48:22.000Z",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "source": "Shop",
- "allergyInfo": null,
- "customerNote": null,
- "kitchenNote": null,
- "tableName": null,
- "closeTime": "2020-08-06T15:32:04.000Z",
- "locationBrandId": "23cdda27-2f82-46e4-a366-deecd5d420d0",
- "customerId": "998a26bd-04a0-11ea-8884-0242ac110002",
- "code": "S002",
- "pickupType": "takeAway",
- "schedulingTime": "2020-08-02T22:30:00.000Z",
- "activationTime": "2020-08-06T15:32:04.000Z",
- "tabTables": [ ],
- "products": [
- {
- "id": "f3cf29da-b5c9-408f-b6e9-ba14732b0bc8",
- "catalogProductId": "7d2b8e27-e0bf-4732-8044-223943b7fd05",
- "organizationProductId": "3cbeaeca-49f6-4dda-be87-5f7cb96d12db",
- "organizationComboId": null,
- "externalId": "0534073e-3eec-4ecc-83a4-ab446a30ca2a",
- "name": "Burger",
- "price": 1400,
- "quantity": 1,
- "course": "Main",
- "comments": null,
- "fullPrice": 1400,
- "finalPrice": 1400,
- "type": "PRODUCT",
- "promotionId": null,
- "modifiers": [
- {
- "id": "348ca8b3-28cd-4adf-a5ce-951f0158d704",
- "name": "Cheese",
- "priceImpact": 0,
- "quantity": 1,
- "catalogModifierId": "65254ec3-3ec8-4279-a5b9-118dd4391832"
}
], - "comboProducts": [ ]
}
], - "seats": 1,
- "waiters": [
- "Elon"
], - "bills": [
- {
- "id": "e7812d44-d953-4617-9960-dee1e68253fc",
- "number": 859,
- "creationTime": "2020-07-31T15:48:23.000Z",
- "finalizingTime": "2020-07-31T15:48:23.000Z",
- "company": {
- "name": "LastPOS",
- "taxId": "1234",
- "address": "Maracaibo 8, Nave 2, 08041, Barcelona"
}, - "total": 1400,
- "tax": 127,
- "taxableBase": 1273,
- "discountTotal": 0,
- "deliveryFee": 0,
- "minimumBasketSurcharge": 0,
- "terraceSurcharge": 0,
- "terraceSurchargePercentage": 0,
- "payments": [ ],
- "products": [
- {
- "id": "7a740ff2-d326-42ea-a239-c9b9125d3fc3",
- "catalogProductId": "7d2b8e27-e0bf-4732-8044-223943b7fd05",
- "tabProductId": "f3cf29da-b5c9-408f-b6e9-ba14732b0bc8",
- "name": "Burger",
- "price": 1400,
- "originalPrice": 1400,
- "quantity": 1,
- "modifiers": [
- {
- "id": "be75642e-7f74-42e8-bd3d-de575caa1848",
- "name": "Cheese",
- "priceImpact": 0,
- "quantity": 1,
- "catalogModifierId": "54393d6e-5780-45da-a96f-8de45eac10cc"
}
], - "comboProducts": [ ]
}
]
}
], - "customerInfo": {
- "name": "Bruce",
- "surname": "Wayne",
- "phoneNumber": "+34666666666",
- "email": "batman@wayneindustries.com"
}, - "delivery": {
- "address": "Gran Via de les Corts Catalanes, 620",
- "details": "First door to the left",
- "latitude": 41.3876734,
- "longitude": 2.1647098,
- "statuses": [
- {
- "creationTime": "2020-08-03T09:10:11.000Z",
- "status": "KITCHEN"
}, - {
- "creationTime": "2020-08-05T14:06:09.000Z",
- "status": "CLOSED"
}
], - "courier": {
- "name": "Jose"
}
}
}
Allows to retrieve tab products which are not billed yet.
This endpoint can be helpful if you want flexibility when creating bills.
Check pendingProducts
on POST Create Bill endpoint.
tabId required | string Tab Id |
[- {
- "id": "9cea02c5-337c-43ec-a539-68b7ed6742b7",
- "quantity": 1
}, - {
- "id": "db377549-620b-4105-a455-396ae9a0e245",
- "quantity": 2
}
]
Valid operations over bills. What is a bill?
Allows to create a bill for a specific tab.
Default: If pendingProducts
not specified, bill will be created for all pending products & fees pending to be paid.
In case you want to generate a bill only for specific pending products, use pendingProducts
array specifying the tabProductIds.
Check Tab pending products list GET endpoint.
tabId required | string <uuid> = 36 characters Unique identifier of the tab |
object Optional discount object | |
Array of objects |
{- "tabId": "1a224103-8015-4e9d-8f5b-19cc701429a4",
- "discount": {
- "type": "percentage",
- "amount": 10,
- "concept": "Discount for the first purchase"
}, - "pendingProducts": [
- "712b9774-5298-42ac-aa5e-c61debb8e419"
]
}
[- {
- "id": "866ed6ee-f325-434b-9c8a-e5d0fc07b53f",
- "number": 859,
- "rectifiedBillNumber": 934,
- "creationTime": "2020-07-31T15:48:23.000Z",
- "finalizingTime": "2020-07-31T15:48:23.000Z",
- "company": {
- "name": "LastPOS",
- "taxId": "1234",
- "address": "Maracaibo 8, Nave 2, 08041, Barcelona"
}, - "customerCompany": {
- "name": "Acme Inc.",
- "taxId": "B12345678",
- "address": "Maracaibo 9, Nave 3, 08041, Barcelona"
}, - "total": 1400,
- "tax": 127,
- "taxableBase": 1273,
- "discountTotal": 0,
- "deliveryFee": 0,
- "minimumBasketSurcharge": 0,
- "terraceSurcharge": 0,
- "terraceSurchargePercentage": 0
}
]
Returns a list of bills.
Paginated endpoint.
NOTE
Maximum interval date: 365 days
locationId required | string <uuid> Example: locationId=712b9774-5298-42ac-aa5e-c61debb8e419 Retrieve bills related to this location |
startDate required | string <date-time> Example: startDate=2024-03-28 10:59:06 Retrieve bills with activation time after startDate (in ISO 8601) |
endDate required | string <date-time> Example: endDate=2024-04-04 10:59:06 Retrieve bills with activation time after endDate (in ISO 8601) |
offset | number >= 0 Default: 0 The number of bills to skip |
limit | number [ 5 .. 100 ] Default: 20 Number of elements per page |
[- {
- "id": "866ed6ee-f325-434b-9c8a-e5d0fc07b53f",
- "number": 859,
- "rectifiedBillNumber": 934,
- "creationTime": "2020-07-31T15:48:23.000Z",
- "finalizingTime": "2020-07-31T15:48:23.000Z",
- "company": {
- "name": "LastPOS",
- "taxId": "1234",
- "address": "Maracaibo 8, Nave 2, 08041, Barcelona"
}, - "customerCompany": {
- "name": "Acme Inc.",
- "taxId": "B12345678",
- "address": "Maracaibo 9, Nave 3, 08041, Barcelona"
}, - "total": 1400,
- "tax": 127,
- "taxableBase": 1273,
- "discountTotal": 0,
- "deliveryFee": 0,
- "minimumBasketSurcharge": 0,
- "terraceSurcharge": 0,
- "terraceSurchargePercentage": 0
}
]
Returns a bill by his identifier.
billId required | string <uuid> = 36 characters Unique identifier of the bill |
{- "id": "866ed6ee-f325-434b-9c8a-e5d0fc07b53f",
- "number": 859,
- "creationTime": "2020-07-31T15:48:23.000Z",
- "finalizingTime": "2020-07-31T15:48:23.000Z",
- "company": {
- "name": "LastPOS",
- "taxId": "1234",
- "address": "Maracaibo 8, Nave 2, 08041, Barcelona"
}, - "total": 1400,
- "tax": 127,
- "taxableBase": 1273,
- "discountTotal": 0,
- "deliveryFee": 0,
- "minimumBasketSurcharge": 0,
- "terraceSurcharge": 0,
- "terraceSurchargePercentage": 0,
- "preferredPaymentMethod": "card",
- "payments": [ ],
- "products": [
- {
- "id": "7a740ff2-d326-42ea-a239-c9b9125d3fc3",
- "catalogProductId": "7d2b8e27-e0bf-4732-8044-223943b7fd05",
- "tabProductId": "f3cf29da-b5c9-408f-b6e9-ba14732b0bc8",
- "name": "Burger",
- "price": 1400,
- "originalPrice": 1400,
- "quantity": 1,
- "modifiers": [
- {
- "id": "be75642e-7f74-42e8-bd3d-de575caa1847",
- "name": "Cheese",
- "priceImpact": 0,
- "quantity": 1,
- "catalogModifierId": "54393d6e-5780-45da-a96f-8de45eac10cc"
}
], - "comboProducts": [ ]
}
]
}
Adds a payment to an existing bill from an open tab. It is possible for a bill to have multiple partial payments. Once all the tab bills are paid fully, the tab will be closed automatically. If the sum of all the payments is greater than the bill total, the difference will be considered as tip for that bill.
billId required | string <uuid> = 36 characters Unique identifier of the bill |
amount required | number >= 1 Amount of the payment |
type required | string non-empty Method used for the payment |
tip | number >= 0 Amount of the payment paid as tip |
externalId | string Unique identifier of the payment on your system |
{- "billId": "0154734b-c56e-432c-9679-0961ec002166",
- "amount": 2500,
- "tip": 10,
- "type": "card",
- "externalId": "1111-8888-5555-4444-7777"
}
{- "id": "bedffaac-5a09-498b-aa22-80323449a3ea",
- "type": "cash",
- "amount": 300,
- "deleted": false,
- "billId": "723ed6ee-f325-434b-9c8a-e5d0fc07b53f",
- "creationTime": "2020-07-31T15:48:23.000Z",
- "userId": "174ed6ee-f325-434b-9c8a-e5d0fc07b53f",
- "tillId": "155ed6ee-f325-434b-9c8a-e5d0fc07b53f",
- "externalId": "3765d6ee-f325-434b-9c8a-e5d0fc07b53f",
- "tip": 0
}
Returns a list of payments.
Paginated endpoint.
NOTE
Maximum interval date: 365 days
locationId required | string <uuid> Example: locationId=712b9774-5298-42ac-aa5e-c61debb8e419 Retrieve payments related to this location |
startDate required | string <date-time> Example: startDate=2024-03-28 10:59:06 Retrieve payments with activation time after startDate (in ISO 8601) |
endDate required | string <date-time> Example: endDate=2024-04-04 10:59:06 Retrieve payments with activation time after endDate (in ISO 8601) |
offset | number >= 0 Default: 0 The number of payments to skip |
limit | number [ 5 .. 100 ] Default: 20 Number of elements per page |
[- {
- "id": "bedffaac-5a09-498b-aa22-80323449a3ea",
- "type": "cash",
- "amount": 300,
- "deleted": false,
- "billId": "723ed6ee-f325-434b-9c8a-e5d0fc07b53f",
- "creationTime": "2020-07-31T15:48:23.000Z",
- "userId": "174ed6ee-f325-434b-9c8a-e5d0fc07b53f",
- "tillId": "155ed6ee-f325-434b-9c8a-e5d0fc07b53f",
- "externalId": "3765d6ee-f325-434b-9c8a-e5d0fc07b53f",
- "tip": 0
}
]
Returns the payment by his identifier.
paymentId required | string <uuid> = 36 characters Unique identifier of the payment |
{- "id": "bedffaac-5a09-498b-aa22-80323449a3ea",
- "type": "cash",
- "amount": 300,
- "deleted": false,
- "billId": "723ed6ee-f325-434b-9c8a-e5d0fc07b53f",
- "creationTime": "2020-07-31T15:48:23.000Z",
- "userId": "174ed6ee-f325-434b-9c8a-e5d0fc07b53f",
- "tillId": "155ed6ee-f325-434b-9c8a-e5d0fc07b53f",
- "externalId": "3765d6ee-f325-434b-9c8a-e5d0fc07b53f",
- "tip": 0
}
Deletes a payment from an existing bill
paymentId required | string <uuid> = 36 characters Unique identifier of the payment |
{- "error": "Something wrong on your request"
}
Valid operations over orders. What is an order?
Allows to update the status of an order
tabId required | string <uuid> = 36 characters Tab Id |
newStatus required | string Enum: "KITCHEN" "READY_TO_PICKUP" "ON_DELIVERY" "DELIVERED" "CLOSED" New status of the order |
{- "newStatus": "READY_TO_PICKUP"
}
{- "status": "KITCHEN"
}
Allows to create a promotion
name required | string non-empty Name of the promotion |
discountType required | string Enum: "percentage" "currency" Type of discount |
discountAmount required | number >= 1 Amount to be discounted by the promotion, can be a percentage or currency amount in cents depending on the type |
organizationId required | string <uuid> = 36 characters Location IDs where the promotion will take effect |
description | string non-empty Description of the promotion |
locations | Array of strings Location IDs where the promotion will take effect |
maxRedemptions | number The amount after which the promotion will expire |
minExpense | number >= 0 Default: 0 Minimum expense in cents for which the promotion will take effect |
products | Array of strings One of products array or categories array. Product IDs in which the promotion will take effect. This IDs are the organizationProductId or the organizationComboId of the catalog products. |
categories | Array of strings One of products array or categories array. Category IDs in which the promotion will take effect |
weekdays | Array of strings Items Enum: "monday" "tuesday" "wednesday" "thursday" "friday" "saturday" "sunday" Weekdays in which the promotion will take effect |
code | string non-empty Code to get the promotion applied |
startTime | string <date-time> Promotion availability starting time in ISO 8601 |
endTime | string <date-time> Promotion availability ending time in ISO 8601 |
pointsExpense | number >= 0 Default: 0 Amount of points that are needed and will be consumed when the promotion is used |
accumulated | boolean Default: false If enabled the promotion could be accumulated with others |
allowRepeat | boolean Default: false If enabled this promotion can be applied more than one time |
availableInShop | boolean Default: false If enabled this promotion can be applied in LastShop |
availableInPos | boolean Default: false If enabled this promotion can be applied in LastPOS |
availableInAdmin | boolean Default: false If enabled this promotion will be shown in LastAdmin |
enabled | boolean Default: true Availability of the promotion |
customers | Array of strings Array of customer identifiers which will be eligible to use the promotion |
{- "accumulated": true,
- "allowRepeat": false,
- "availableInShop": true,
- "availableInPos": true,
- "availableInAdmin": true,
- "code": "KONAMICODE",
- "description": "el tenedor desc",
- "discountAmount": 1000,
- "discountType": "currency",
- "enabled": true,
- "endTime": "2021-02-03T23:00:00.000Z",
- "id": "28afe959-6204-4169-b5ba-fc90f15aad43",
- "locations": [
- "f2779a96-578f-4649-89f6-a0972183efea"
], - "maxRedemptions": 3,
- "minExpense": 1290,
- "name": "El tenedor",
- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "pointsExpense": 10,
- "products": [
- "07ec300a-31cb-42c6-9519-0bd25191d74d"
], - "startTime": "2021-01-14T23:00:00.000Z",
- "weekdays": [
- "monday"
], - "customers": [
- "0ae6e3fb-c340-4b26-80ed-3bbe49f54db7"
]
}
{- "id": "28afe959-6204-4169-b5ba-fc90f15aad42",
- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "name": "El tenedor",
- "description": "el tenedor",
- "pointsExpense": null,
- "discountType": "percentage",
- "discountAmount": 10,
- "allowRepeat": true,
- "accumulated": true,
- "categories": [
- "d8486f43-04c6-4d94-b683-654e053957f0"
], - "products": [
- "18be645c-84e5-4172-8b51-3bd619362aa3"
], - "customers": [
- "57b5ba5c-996d-412a-a5ab-283e8e347f91"
]
}
Allows to retrieve the list of promotions
organizationId required | string Organization of the promotion. |
name | string Name of the promotion. |
offset | number >= 0 Default: 0 The number of promotions to skip. |
limit | number [ 5 .. 100 ] Default: 20 The maximum number of promotions to be returned. |
{- "promotions": [
- {
- "id": "28afe959-6204-4169-b5ba-fc90f15aad44",
- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "name": "El tenedor",
- "description": "el tenedor",
- "pointsExpense": null,
- "discountType": "percentage",
- "discountAmount": 10,
- "allowRepeat": true,
- "accumulated": true
}, - {
- "id": "39bfaca0-9920-4224-9762-0cbc8d61dbcf",
- "name": "2x1",
- "description": "2x1",
- "pointsExpense": null,
- "discountType": "2x1",
- "discountAmount": null,
- "allowRepeat": true,
- "accumulated": false,
- "code": "GETTWO"
}, - {
- "id": "d1e90fb6-c3af-4317-84aa-05215920b6b0",
- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "name": "Point products",
- "description": "Get one of this products for 10 points",
- "pointsExpense": 10,
- "discountType": "products",
- "discountAmount": null,
- "allowRepeat": false,
- "accumulated": false
}
]
}
Allows to retrieve a promotion
promotionId required | string <uuid> = 36 characters Unique identifier of the promotion |
{- "id": "28afe959-6204-4169-b5ba-fc90f15aad42",
- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "name": "El tenedor",
- "description": "el tenedor",
- "pointsExpense": null,
- "discountType": "percentage",
- "discountAmount": 10,
- "allowRepeat": true,
- "accumulated": true,
- "categories": [
- "d8486f43-04c6-4d94-b683-654e053957f0"
], - "products": [
- "18be645c-84e5-4172-8b51-3bd619362aa3"
], - "customers": [
- "57b5ba5c-996d-412a-a5ab-283e8e347f91"
]
}
Allows to update a promotion.
CAUTION!
If you DON'T SPECIFY locations, products, categories, weekdays or customers
on a promotion update it means that you are DELETING this existent values for promo.
As we understand products
, categories
and customers
could be a dynamic value over a promotion, in order to add / delete ONLY a subset of them, you can use this other endpoint.
promotionId required | string <uuid> = 36 characters Unique identifier of the promotion |
name required | string non-empty Name of the promotion |
discountType required | string Enum: "percentage" "currency" Type of discount |
discountAmount required | number >= 1 Amount to be discounted by the promotion, can be a percentage or currency amount in cents depending on the type |
organizationId required | string <uuid> = 36 characters Location IDs where the promotion will take effect |
description | string non-empty Description of the promotion |
locations | Array of strings Location IDs where the promotion will take effect |
maxRedemptions | number The amount after which the promotion will expire |
minExpense | number >= 0 Default: 0 Minimum expense in cents for which the promotion will take effect |
products | Array of strings One of products array or categories array. Product IDs in which the promotion will take effect. This IDs are the organizationProductId or the organizationComboId of the catalog products. |
categories | Array of strings One of products array or categories array. Category IDs in which the promotion will take effect |
weekdays | Array of strings Items Enum: "monday" "tuesday" "wednesday" "thursday" "friday" "saturday" "sunday" Weekdays in which the promotion will take effect |
code | string non-empty Code to get the promotion applied |
startTime | string <date-time> Promotion availability starting time in ISO 8601 |
endTime | string <date-time> Promotion availability ending time in ISO 8601 |
pointsExpense | number >= 0 Default: 0 Amount of points that are needed and will be consumed when the promotion is used |
accumulated | boolean Default: false If enabled the promotion could be accumulated with others |
allowRepeat | boolean Default: false If enabled this promotion can be applied more than one time |
availableInShop | boolean Default: false If enabled this promotion can be applied in LastShop |
availableInPos | boolean Default: false If enabled this promotion can be applied in LastPOS |
availableInAdmin | boolean Default: false If enabled this promotion will be shown in LastAdmin |
enabled | boolean Default: true Availability of the promotion |
customers | Array of strings Array of customer identifiers which will be eligible to use the promotion |
{- "accumulated": true,
- "allowRepeat": false,
- "availableInShop": true,
- "availableInPos": true,
- "availableInAdmin": true,
- "code": "KONAMICODE",
- "description": "el tenedor desc",
- "discountAmount": 1000,
- "discountType": "currency",
- "enabled": true,
- "endTime": "2021-02-03T23:00:00.000Z",
- "id": "28afe959-6204-4169-b5ba-fc90f15aad43",
- "locations": [
- "f2779a96-578f-4649-89f6-a0972183efea"
], - "maxRedemptions": 3,
- "minExpense": 1290,
- "name": "El tenedor",
- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "pointsExpense": 10,
- "products": [
- "07ec300a-31cb-42c6-9519-0bd25191d74d"
], - "startTime": "2021-01-14T23:00:00.000Z",
- "weekdays": [
- "monday"
], - "customers": [
- "0ae6e3fb-c340-4b26-80ed-3bbe49f54db7"
]
}
{- "id": "28afe959-6204-4169-b5ba-fc90f15aad42",
- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "name": "El tenedor",
- "description": "el tenedor",
- "pointsExpense": null,
- "discountType": "percentage",
- "discountAmount": 10,
- "allowRepeat": true,
- "accumulated": true,
- "categories": [
- "d8486f43-04c6-4d94-b683-654e053957f0"
], - "products": [
- "18be645c-84e5-4172-8b51-3bd619362aa3"
], - "customers": [
- "57b5ba5c-996d-412a-a5ab-283e8e347f91"
]
}
Allows to ADD / DELETE entities for a particular promotion.
If you don't specify some entity, nothing will be done to this one.
promotionId required | string <uuid> = 36 characters Unique identifier of the promotion |
type required | string Enum: "add" "delete" Type of edit |
products | Array of strings One of products array or categories array. Product IDs in which the promotion will take effect. This IDs are the organizationProductId or the organizationComboId of the catalog products. |
categories | Array of strings One of products array or categories array. Category IDs in which the promotion will take effect |
customers | Array of strings Array of customer identifiers which will be eligible to use the promotion |
{- "type": "delete",
- "products": [
- "07ec300a-31cb-42c6-9519-0bd25191d74d"
], - "customers": [
- "0ae6e3fb-c340-4b26-80ed-3bbe49f54db7"
]
}
{- "id": "28afe959-6204-4169-b5ba-fc90f15aad42",
- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "name": "El tenedor",
- "description": "el tenedor",
- "pointsExpense": null,
- "discountType": "percentage",
- "discountAmount": 10,
- "allowRepeat": true,
- "accumulated": true,
- "categories": [
- "d8486f43-04c6-4d94-b683-654e053957f0"
], - "products": [
- "18be645c-84e5-4172-8b51-3bd619362aa3"
], - "customers": [
- "57b5ba5c-996d-412a-a5ab-283e8e347f91"
]
}
Allows to create a customer
organizationId required | string <uuid> = 36 characters Organization of the customer |
name required | string non-empty Name of the customer |
phoneNumber required | string non-empty Full phone number with country code |
source required | string non-empty Source of the customer |
surname | string non-empty Surname of the customer |
internalNote | string Internal note |
string Email of the customer |
{- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "name": "Bruce",
- "surname": "Wayne",
- "phoneNumber": "+34666666666",
- "email": "hello@test.com",
- "source": "MyWebsite"
}
{- "id": "003ac58e-d27b-4c93-a6e8-559305300c20",
- "name": "Bruce",
- "surname": "Wayne",
- "phoneNumber": "+34666666666",
- "creationTime": "2020-05-21T19:01:02.000Z",
- "email": "hello@test.com",
- "source": "MyWebsite",
- "marketingCommunication": true,
- "internalNote": null
}
Allows to retrieve a list of customers.
This request is paginated.
organizationId required | string non-empty Example: organizationId=90724ad8-334b-40d8-a07b-45d4b5e563d4 Organization id of the customers |
phoneNumber | string non-empty Example: phoneNumber=+34666111222 Phone number of the customer |
name | string non-empty Example: name=Carlos Name of the customer |
string non-empty Example: email=carlos1990@gmail.com Email of the customer | |
offset | number >= 0 Default: 0 The number of customers to skip |
limit | number [ 5 .. 100 ] Default: 20 Number of elements per page |
updateTime | string <date-time> Example: updateTime=2024-04-04T12:00:00Z Created OR updated AFTER this time (in ISO 8601) |
[- {
- "id": "0159e221-7e15-4283-8362-ee5c12f2d4d6",
- "name": "Bruce",
- "surname": "Wayne",
- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "phoneNumber": "+34666666666",
- "creationTime": "2020-05-21T19:01:02.000Z",
- "email": "hello@test.com",
- "source": "Shop",
- "marketingCommunication": true,
- "internalNote": null
}
]
Allows to retrieve the list of customers with his points.
This request is paginated.
organizationId required | string non-empty Example: organizationId=90724ad8-334b-40d8-a07b-45d4b5e563d4 Organization id of the customers |
offset | number >= 0 Default: 0 The number of customers to skip |
limit | number [ 5 .. 100 ] Default: 20 Number of elements per page |
[- {
- "customerId": "7eb9979a-171f-4f15-820b-0b68efad0491",
- "points": 0
}, - {
- "customerId": "ba770ddf-3e07-47c9-af33-c051182ddd8b",
- "points": 10
}, - {
- "customerId": "fd1324e8-b439-4367-92ad-fc1b1c8043c7",
- "points": 140
}
]
Allows to retrieve a customer
customerId required | string <uuid> = 36 characters Unique identifier of the customer |
{- "id": "d40f1db8-4092-4f4c-bb48-a4405985ed2f",
- "name": "Bruce",
- "surname": "Wayne",
- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "phoneNumber": "+34666666666",
- "email": "hello@test.com",
- "source": "MyWebsite",
- "marketingCommunication": true,
- "hasUser": true,
- "points": 30,
- "addresses": [
- {
- "address": "Gran Via de les Corts Catalanes, 620",
- "details": "First door to the left",
- "postalCode": "08007",
- "latitude": 41.3876734,
- "longitude": 2.1647098
}
]
}
Allows to update a customer.
customerId required | string <uuid> = 36 characters Unique identifier of the customer |
name | string non-empty Name of the customer |
surname | string non-empty Surname of the customer |
phoneNumber | string non-empty Full phone number with country code |
source | string non-empty Source of the customer |
internalNote | string Internal note |
string Email of the customer |
{- "name": "Matt"
}
{- "id": "003ac58e-d27b-4c93-a6e8-559305300c20",
- "name": "Bruce",
- "surname": "Wayne",
- "phoneNumber": "+34666666666",
- "creationTime": "2020-05-21T19:01:02.000Z",
- "email": "hello@test.com",
- "source": "MyWebsite",
- "marketingCommunication": true,
- "internalNote": null
}
Allows to update points to a customer
Use positive value on points
for ADD points.
Use negative value points
for SUBTRACT points.
customerId required | string Unique identifier of the customer |
points required | number Number of points to add (use negative value to subtract) |
concept required | string Description of points operation |
{- "points": 10,
- "concept": "Birthday gift"
}
{- "id": "d40f1db8-4092-4f4c-bb48-a4405985ed2f",
- "name": "Bruce",
- "surname": "Wayne",
- "organizationId": "90724ad8-334b-40d8-a07b-45d4b5e563d4",
- "phoneNumber": "+34666666666",
- "email": "hello@test.com",
- "source": "MyWebsite",
- "marketingCommunication": true,
- "hasUser": true,
- "points": 30,
- "addresses": [
- {
- "address": "Gran Via de les Corts Catalanes, 620",
- "details": "First door to the left",
- "postalCode": "08007",
- "latitude": 41.3876734,
- "longitude": 2.1647098
}
]
}
Allows to create a reservation
name required | string non-empty Customer name of the reservation |
locationId required | string <uuid> = 36 characters Unique identifier of the location where the reservation is done |
dateTime required | string <date-time> Date time of the reservation in ISO 8601 |
diners required | number >= 1 Number of diners of the reservation |
phoneNumber | string Full phone number with country code |
string Email of the reservation customer | |
surname | string non-empty Customer surname of the reservation |
externalId | string Id of the reservation on the reservation platform |
customerComments | string Specific requirements asked by the customer. |
notify | boolean Default: true Receive notifications about the reservation |
zone | string Default: "sala" Enum: "sala" "terraza" Zone where allocate the reservation |
{- "name": "Juanito",
- "surname": "Jones",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "externalId": null,
- "phoneNumber": "+34666111444",
- "diners": 2,
- "customerComments": null,
- "source": "TheFork",
- "email": "juanito.jones@example.com",
- "dateTime": "2024-02-05T14:00:00.000Z",
- "zone": "Sala"
}
{- "name": "Juanito",
- "surname": "Jones",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "externalId": null,
- "tabId": "76e48ce9-756a-4ee5-90e8-0d6e27337c27",
- "phoneNumber": "+34666111444",
- "diners": 2,
- "customerComments": null,
- "source": "TheFork",
- "dateTime": "2024-02-05T14:00:00.000Z",
- "cancelled": false,
- "tables": [
- "398bcf26-141f-42c5-80a2-391270d7f92a"
], - "zone": "sala"
}
Allows to retrieve a list of reservations.
locationId required | string <uuid> Example: locationId=712b9774-5298-42ac-aa5e-c61debb8e419 Retrieve reservations related to this location |
startDate required | string <date-time> Example: startDate=2024-03-28T10:59:06Z Retrieve reservation with date after startDate (in ISO 8601) |
endDate required | string <date-time> Example: endDate=2024-04-04T10:59:06Z Retrieve reservation with date before endDate (in ISO 8601) |
showCancelled | boolean Default: false Unique identifier of the location of the reservation |
searchQuery | string Example: searchQuery=+34612345678 Filter reservations by name, phone number or email |
offset | number >= 0 Default: 0 The number of reservations to skip |
limit | number [ 5 .. 100 ] Default: 20 Number of elements per page |
[- {
- "name": "Juanito",
- "surname": "Jones",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "externalId": null,
- "phoneNumber": "+34666111444",
- "diners": 2,
- "customerComments": null,
- "source": "TheFork",
- "dateTime": "2024-02-05T14:00:00.000Z",
- "cancelled": false,
- "tables": [
- "398bcf26-141f-42c5-80a2-391270d7f92a"
]
}, - {
- "name": "Will",
- "surname": "Smith",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "externalId": "12349a96-578f-4649-89f6-a0972183efea",
- "phoneNumber": "+34666111555",
- "diners": 4,
- "customerComments": "We need a baby seat",
- "source": "GoogleBookings",
- "dateTime": "2024-02-15T19:00:00.000Z",
- "cancelled": true,
- "tables": [ ]
}
]
Allows to retrieve the availability for a specific day of this location.
locationId required | string <uuid> = 36 characters Unique identifier of the location |
diners required | number Example: diners=4 Specify diners to check availability |
date required | string <date> Example: date=2025-06-01 (YYYY-MM-DD) Specify day to know availability (in ISO format) |
{- "terraza": [
- {
- "start": "15:00",
- "end": "15:15"
}, - {
- "start": "15:15",
- "end": "15:30"
}, - {
- "start": "15:30",
- "end": "15:45"
}, - {
- "start": "15:45",
- "end": "16:00"
}
], - "sala": [
- {
- "start": "12:00",
- "end": "12:45"
}, - {
- "start": "12:00",
- "end": "12:45"
}
]
}
Allows to retrieve the availability for a specific month of this location.
locationId required | string <uuid> = 36 characters Unique identifier of the location |
diners required | number Example: diners=4 Specify diners to check availability |
date required | string Example: date=2025-06 (YYYY-MM) Specify month date to know availability (in ISO format) |
[- "2025-04-23T00:00:00.000+02:00",
- "2025-04-24T00:00:00.000+02:00",
- "2025-04-25T00:00:00.000+02:00",
- "2025-04-26T00:00:00.000+02:00",
- "2025-04-27T00:00:00.000+02:00",
- "2025-04-28T00:00:00.000+02:00",
- "2025-04-29T00:00:00.000+02:00",
- "2025-04-30T00:00:00.000+02:00"
]
Allows to retrieve reservation schedules of this location.
locationId required | string <uuid> = 36 characters Unique identifier of the location |
{- "thursday": [
- {
- "id": "6939ef89-9179-4ab8-97ff-d394999b5370",
- "locationId": "f2779a95-578f-4649-89f6-a0972183efea",
- "day": "thursday",
- "start": "08:00",
- "end": "00:00"
}
], - "monday": [
- {
- "id": "6c2d8783-b299-4a44-9a9b-fae4f0b92874",
- "locationId": "f2779a95-578f-4649-89f6-a0972183efea",
- "day": "monday",
- "start": "08:00",
- "end": "00:00"
}
], - "wednesday": [
- {
- "id": "991070eb-9561-460f-ad61-177affdc1b7b",
- "locationId": "f2779a95-578f-4649-89f6-a0972183efea",
- "day": "wednesday",
- "start": "08:00",
- "end": "00:00"
}
], - "tuesday": [
- {
- "id": "aa1f3526-209c-4471-8a0c-090a10c0c975",
- "locationId": "f2779a95-578f-4649-89f6-a0972183efea",
- "day": "tuesday",
- "start": "08:00",
- "end": "00:00"
}
], - "friday": [
- {
- "id": "df2c5ea5-ac9b-49a1-aff2-507cec1f528c",
- "locationId": "f2779a95-578f-4649-89f6-a0972183efea",
- "day": "friday",
- "start": "08:00",
- "end": "00:00"
}
]
}
Get a reservation by his Id
reservationId required | string <uuid> = 36 characters Unique identifier of the reservation |
{- "name": "Juanito",
- "surname": "Jones",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "externalId": null,
- "tabId": "76e48ce9-756a-4ee5-90e8-0d6e27337c27",
- "phoneNumber": "+34666111444",
- "diners": 2,
- "customerComments": null,
- "source": "TheFork",
- "dateTime": "2024-02-05T14:00:00.000Z",
- "cancelled": false,
- "tables": [
- "398bcf26-141f-42c5-80a2-391270d7f92a"
], - "zone": "sala"
}
Updates an existent reservation
reservationId required | string <uuid> = 36 characters Unique identifier of the reservation |
name required | string non-empty Customer name of the reservation |
locationId required | string <uuid> = 36 characters Unique identifier of the location where the reservation is done |
dateTime required | string <date-time> Date time of the reservation in ISO 8601 |
diners required | number >= 1 Number of diners of the reservation |
phoneNumber | string Full phone number with country code |
string Email of the reservation customer | |
surname | string non-empty Customer surname of the reservation |
externalId | string Id of the reservation on the reservation platform |
customerComments | string Specific requirements asked by the customer. |
notify | boolean Default: true Receive notifications about the reservation |
zone | string Default: "sala" Enum: "sala" "terraza" Zone where allocate the reservation |
{- "name": "Juanito",
- "surname": "Jones",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "externalId": null,
- "phoneNumber": "+34666111444",
- "diners": 2,
- "customerComments": null,
- "source": "TheFork",
- "email": "juanito.jones@example.com",
- "dateTime": "2024-02-05T14:00:00.000Z",
- "zone": "Sala"
}
{- "name": "Juanito",
- "surname": "Jones",
- "locationId": "f2779a96-578f-4649-89f6-a0972183efea",
- "externalId": null,
- "tabId": "76e48ce9-756a-4ee5-90e8-0d6e27337c27",
- "phoneNumber": "+34666111444",
- "diners": 2,
- "customerComments": null,
- "source": "TheFork",
- "dateTime": "2024-02-05T14:00:00.000Z",
- "cancelled": false,
- "tables": [
- "398bcf26-141f-42c5-80a2-391270d7f92a"
], - "zone": "sala"
}
Whenever there is a content change in our side that may be relevant for an integration we trigger webhook updates.
The request will be made via POST
to your chosen webhook endpoint,
which on success should return an empty response with status 200
.
The update will come in json
format in the body of the request, wrapped in an event
object,
with a corresponding payload (data
) with the relevant resource or information.
Authorization required | string Your integrator token |
Content-Type required | string Default: application/json Specify that the content will be sent as JSON |
locationId | string LocationId related (only present if event is related to a location) |
organizationId | string OrganizationId related (only present if event is related to an organization) |
id | string Unique identifier of the event |
type | string Type of the event |
created | string The time the event was created at (ISO-8601 UTC) |
object Location data |
{- "id": "33f9dc36-5e99-4044-8e2e-9b22c403c5f7",
- "type": "location:integrated",
- "created": "2020-10-06T18:32:04.000Z",
- "data": {
- "integrationRequestToken": "58c1d9af-905f-41cf-9eac-84bc426732e9",
- "locationId": "d482a7b0-377e-4a56-8c43-7d847738f045",
- "locationName": "Burguermania",
- "organizationId": "1b016ad1-642a-472c-a81d-41029fcd6a6f",
- "organizationName": "Burguer Organization",
- "integrationId": "6ac865a3-e992-4dfe-91bf-9d90e60c5fe6",
- "integratorId": "aa8b9624-2635-475b-9f07-bd85e09b9030"
}
}
You need to:
If you have any doubt, please contact our support team at hola@last.app.
You should ask for this to integrations@last.app sending us your integrator ID(s), we will check and answer you. After this is done, you will appear on the Admin page of every LastApp location to be discovered!
You should enable location:integrated location:desintegrated, to receive in real time when a location decides to add / delete the integration with your product. We will send you their locationId and locationName.
In our system, a Location is a Restaurant, in simple words. Each location may want to appear with different brands in their online sales channels. For example, a location named Rick Restaurant can have multiple brands appearing at JustEat and UberEats, for example Rick Chickens, Rick Pizza, and Rick Sushi.
In the response from GET Location By Id you will find a list of brands for each location, and each of this brands contains at the same time a list of catalogs.
This should be done by yourself on the Developer Portal.
If you have any doubt, please contact our support team at hola@last.app.
This is not possible at the moment, the only thing you can update right now is the status of a catalog product.
You'll only need ONE token for every product you have added on the Developer Portal. For example, let's imagine you have added a Reservation product and Reporting product. You will need a token for Reservation, and a token for Reporting, this token will identify your product in our system.
A tab is a restaurant customer request. An order is a tab which will not be eaten on the Restaurant, which means is a tab with pickupType = ['delivery', 'ownDelivery', 'takeAway']. A bill is an invoice, and it belongs to a tab. It contains payments and invoice details.