{"id":28231396,"url":"https://github.com/bored-programmers/laravel-wolt","last_synced_at":"2026-01-16T16:47:17.409Z","repository":{"id":253132439,"uuid":"842524644","full_name":"Bored-Programmers/laravel-wolt","owner":"Bored-Programmers","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-15T10:56:51.000Z","size":177,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-01-15T15:52:25.341Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Bored-Programmers.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-08-14T14:25:34.000Z","updated_at":"2026-01-15T10:56:52.000Z","dependencies_parsed_at":"2024-08-17T15:34:17.278Z","dependency_job_id":null,"html_url":"https://github.com/Bored-Programmers/laravel-wolt","commit_stats":null,"previous_names":["bored-programmers/wolt"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/Bored-Programmers/laravel-wolt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bored-Programmers%2Flaravel-wolt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bored-Programmers%2Flaravel-wolt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bored-Programmers%2Flaravel-wolt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bored-Programmers%2Flaravel-wolt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Bored-Programmers","download_url":"https://codeload.github.com/Bored-Programmers/laravel-wolt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bored-Programmers%2Flaravel-wolt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28480081,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-18T19:09:41.794Z","updated_at":"2026-01-16T16:47:17.400Z","avatar_url":"https://github.com/Bored-Programmers.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Laravel Wolt API Integration\n\n\u003cimg src=\"./resources/assets/img/logo.webp\" alt=\"Wolt Logo\" height=\"400\" width=\"400\"\u003e\n\n[![Latest Stable Version](https://poser.pugx.org/bored-programmers/wolt/v)](//packagist.org/packages/bored-programmers/wolt)\n[![Total Downloads](https://poser.pugx.org/bored-programmers/wolt/downloads)](//packagist.org/packages/bored-programmers/wolt)\n[![License](https://poser.pugx.org/bored-programmers/wolt/license)](//packagist.org/packages/bored-programmers/wolt)\n\nWolt is a Laravel package that allows you to integrate your restaurant with the Wolt platform. It provides a simple and\neasy-to-use API for syncing your menu and managing orders.\n\n## Table of Contents\n\n- [Requirements](#requirements)\n- [Installation](#installation)\n- [Usage](#usage)\n    - [Sync Menu](#sync-menu)\n    - [Get Order](#get-order)\n    - [Accept Order](#accept-order)\n    - [Reject Order](#reject-order)\n    - [Mark Order as Ready](#mark-order-as-ready)\n    - [Mark Order as Delivered](#mark-order-as-delivered)\n    - [Confirm Preorder](#confirm-preorder)\n- [Contribution Guidelines](#contribution-guidelines)\n- [Changelog](#changelog)\n- [License](#license)\n- [Contact Information](#contact-information)\n- [Acknowledgments](#acknowledgments)\n\n## Requirements\n\n- PHP 8.1 or higher\n- Laravel 10.0 or higher\n\n## Installation\n\nTo install Wolt, you need to run the following command:\n\n```bash\ncomposer require bored-programmers/laravel-wolt\n```\n\nPublish the configuration file and set up your environment variables.\n\n```bash\nphp artisan vendor:publish --tag=wolt-config\n```\n\nUpdate your `.env` file with the following variables:\n\n```env\nWOLT_MENU_API_USERNAME=your_menu_api_username\nWOLT_MENU_API_PASSWORD=your_menu_api_password\nWOLT_ORDER_API_KEY=your_order_api_key\nWOLT_VENUE_ID=your_venue_id\nWOLT_IS_SANDBOX=true/false\n```\n\n## Usage\n\n### Sync Menu\n\nTo sync your menu with Wolt, use the `WoltService::syncMenu` method. \u003cbr\u003e\nHere is an example of how you can use the DTOs to create a menu and sync it with Wolt.\n\n```php\nuse BoredProgrammers\\Wolt\\DTO\\MenuData;\nuse BoredProgrammers\\Wolt\\DTO\\CategoryData;\nuse BoredProgrammers\\Wolt\\DTO\\SubcategoryData;\nuse BoredProgrammers\\Wolt\\DTO\\ItemData;\nuse BoredProgrammers\\Wolt\\DTO\\TranslationData;\nuse BoredProgrammers\\Wolt\\DTO\\CaffeineContentData;\nuse BoredProgrammers\\Wolt\\DTO\\WeeklyAvailabilityData;\nuse BoredProgrammers\\Wolt\\DTO\\WeeklyVisibilityData;\nuse BoredProgrammers\\Wolt\\DTO\\OptionData;\nuse BoredProgrammers\\Wolt\\DTO\\SelectionRangeData;\nuse BoredProgrammers\\Wolt\\DTO\\OptionValueData;\nuse BoredProgrammers\\Wolt\\DTO\\SubOptionValueData;\nuse BoredProgrammers\\Wolt\\DTO\\ProductInformationData;\nuse BoredProgrammers\\Wolt\\DTO\\NutritionInformationData;\nuse BoredProgrammers\\Wolt\\DTO\\NutritionValuesData;\nuse BoredProgrammers\\Wolt\\DTO\\NutrientData;\nuse Spatie\\LaravelData\\DataCollection;\n\n// Example Translations for Category\n$categoryNameTranslation = new DataCollection([\n    TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'Beverages']),\n    TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Boissons'])\n]);\n\n// Example Translations for Subcategory\n$subCategoryNameTranslation = new DataCollection([\n    TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'Hot Drinks']),\n    TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Boissons Chaudes'])\n]);\n\n// Example Translations for Item\n$itemNameTranslation = new DataCollection([\n    TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'Espresso']),\n    TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Espresso'])\n]);\n\n$itemDescriptionTranslation = new DataCollection([\n    TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'Rich and bold espresso coffee']),\n    TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Café espresso riche et audacieux'])\n]);\n\n// Example Translations for Options\n$optionNameTranslation = new DataCollection([\n    TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'Milk Type']),\n    TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Type de Lait'])\n]);\n\n$optionValueNameTranslation1 = new DataCollection([\n    TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'Whole Milk']),\n    TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Lait entier'])\n]);\n\n$optionValueNameTranslation2 = new DataCollection([\n    TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'Soy Milk']),\n    TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Lait de soja'])\n]);\n\n// Example Sub-option Value\n$subOptionValueNameTranslation = new DataCollection([\n    TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'Vanilla Syrup']),\n    TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Sirop de vanille'])\n]);\n\n// Example Nutrition Information\n$nutritionInformation = NutritionInformationData::from([\n    'serving_size' =\u003e 'per_100_ml',\n    'nutrition_values' =\u003e NutritionValuesData::from([\n        'energy_kcal' =\u003e NutrientData::from(['unit' =\u003e 'kcal', 'value' =\u003e 5]),\n        'energy_kj' =\u003e NutrientData::from(['unit' =\u003e 'kj', 'value' =\u003e 20]),\n        'fats' =\u003e NutrientData::from(['unit' =\u003e 'g', 'value' =\u003e 0.1]),\n        'saturated_fats' =\u003e NutrientData::from(['unit' =\u003e 'g', 'value' =\u003e 0.05]),\n        'mono_unsaturated_fats' =\u003e NutrientData::from(['unit' =\u003e 'g', 'value' =\u003e 0.01]),\n        'poly_unsaturated_fats' =\u003e NutrientData::from(['unit' =\u003e 'g', 'value' =\u003e 0.01]),\n        'carbohydrate' =\u003e NutrientData::from(['unit' =\u003e 'g', 'value' =\u003e 0.5]),\n        'sugar' =\u003e NutrientData::from(['unit' =\u003e 'g', 'value' =\u003e 0.1]),\n        'starch' =\u003e NutrientData::from(['unit' =\u003e 'g', 'value' =\u003e 0.2]),\n        'polyols' =\u003e NutrientData::from(['unit' =\u003e 'g', 'value' =\u003e 0.0]),\n        'protein' =\u003e NutrientData::from(['unit' =\u003e 'g', 'value' =\u003e 0.2]),\n        'salt' =\u003e NutrientData::from(['unit' =\u003e 'g', 'value' =\u003e 0.01]),\n        'sodium' =\u003e NutrientData::from(['unit' =\u003e 'mg', 'value' =\u003e 5]),\n        'fibres' =\u003e NutrientData::from(['unit' =\u003e 'g', 'value' =\u003e 0.1]),\n        'vitamin_c' =\u003e NutrientData::from(['unit' =\u003e 'mg', 'value' =\u003e 0.0]),\n        'potassium' =\u003e NutrientData::from(['unit' =\u003e 'mg', 'value' =\u003e 80]),\n        'calcium' =\u003e NutrientData::from(['unit' =\u003e 'mg', 'value' =\u003e 10]),\n        'magnesium' =\u003e NutrientData::from(['unit' =\u003e 'mg', 'value' =\u003e 2]),\n        'chloride' =\u003e NutrientData::from(['unit' =\u003e 'mg', 'value' =\u003e 5]),\n        'fluoride' =\u003e NutrientData::from(['unit' =\u003e 'mg', 'value' =\u003e 0.0])\n    ])\n]);\n\n// Example Product Information\n$productInformation = ProductInformationData::from([\n    'ingredients' =\u003e new DataCollection([\n        TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'Water, Coffee Beans']),\n        TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Eau, Grains de café'])\n    ]),\n    'additives' =\u003e new DataCollection([\n        TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'None']),\n        TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Aucun'])\n    ]),\n    'nutrition_facts' =\u003e new DataCollection([\n        TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'Low calories']),\n        TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Faible en calories'])\n    ]),\n    'nutrition_information' =\u003e $nutritionInformation,\n    'allergens' =\u003e new DataCollection([\n        TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'None']),\n        TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Aucun'])\n    ]),\n    'producer_information' =\u003e new DataCollection([\n        TranslationData::from(['lang' =\u003e 'en', 'value' =\u003e 'Local Roastery']),\n        TranslationData::from(['lang' =\u003e 'fr', 'value' =\u003e 'Torréfacteur local'])\n    ])\n]);\n\n// Example Option with Sub-option Values\n$optionValue1 = OptionValueData::from([\n    'name' =\u003e $optionValueNameTranslation1,\n    'selection_range' =\u003e SelectionRangeData::from(['min' =\u003e 0, 'max' =\u003e 1]),\n    'price' =\u003e 0.50,\n    'enabled' =\u003e true,\n    'default' =\u003e true,\n    'external_data' =\u003e 'option-value-1',\n    'sub_option_values' =\u003e new DataCollection([\n        SubOptionValueData::from([\n            'name' =\u003e $subOptionValueNameTranslation,\n            'selection_range' =\u003e SelectionRangeData::from(['min' =\u003e 0, 'max' =\u003e 1]),\n            'price' =\u003e 0.20,\n            'enabled' =\u003e true,\n            'default' =\u003e false,\n            'external_data' =\u003e 'sub-option-value-1'\n        ])\n    ])\n]);\n\n$optionValue2 = OptionValueData::from([\n    'name' =\u003e $optionValueNameTranslation2,\n    'selection_range' =\u003e SelectionRangeData::from(['min' =\u003e 0, 'max' =\u003e 1]),\n    'price' =\u003e 0.60,\n    'enabled' =\u003e true,\n    'default' =\u003e false,\n    'external_data' =\u003e 'option-value-2',\n    'sub_option_values' =\u003e null\n]);\n\n$option = OptionData::from([\n    'name' =\u003e $optionNameTranslation,\n    'type' =\u003e 'SingleChoice',\n    'selection_range' =\u003e SelectionRangeData::from(['min' =\u003e 1, 'max' =\u003e 1]),\n    'external_data' =\u003e 'option-1',\n    'values' =\u003e new DataCollection([$optionValue1, $optionValue2])\n]);\n\n// Example Item\n$item = ItemData::from([\n    'name' =\u003e $itemNameTranslation,\n    'description' =\u003e $itemDescriptionTranslation,\n    'image_url' =\u003e 'https://example.com/espresso.jpg',\n    'price' =\u003e 2.99,\n    'sales_tax_percentage' =\u003e 0.07,\n    'alcohol_percentage' =\u003e null,\n    'caffeine_content' =\u003e CaffeineContentData::from(['serving_size' =\u003e 'per_100_ml', 'value' =\u003e 212.0]),\n    'weekly_availability' =\u003e new DataCollection([\n        WeeklyAvailabilityData::from([\n            'opening_day' =\u003e 'MONDAY',\n            'opening_time' =\u003e '08:00',\n            'closing_day' =\u003e 'MONDAY',\n            'closing_time' =\u003e '20:00'\n        ])\n    ]),\n    'weekly_visibility' =\u003e new DataCollection([\n        WeeklyVisibilityData::from([\n            'opening_day' =\u003e 'MONDAY',\n            'opening_time' =\u003e '08:00',\n            'closing_day' =\u003e 'MONDAY',\n            'closing_time' =\u003e '20:00'\n        ])\n    ]),\n    'enabled' =\u003e true,\n    'delivery_methods' =\u003e ['takeaway', 'homedelivery'],\n    'options' =\u003e new DataCollection([$option]),\n    'external_data' =\u003e 'item-espresso-001',\n    'product_information' =\u003e $productInformation\n]);\n\n// Example Subcategory\n$subcategory = SubcategoryData::from([\n    'name' =\u003e $subCategoryNameTranslation,\n    'description' =\u003e null,\n    'items' =\u003e new DataCollection([$item])\n]);\n\n// Example Category\n$category = CategoryData::from([\n    'name' =\u003e $categoryNameTranslation,\n    'description' =\u003e null,\n    'subcategories' =\u003e new DataCollection([$subcategory])\n]);\n\n// Example Menu\n$menu = MenuData::from([\n    'currency' =\u003e 'USD',\n    'primary_language' =\u003e 'en',\n    'categories' =\u003e new DataCollection([$category])\n]);\n\n$response = WoltService::syncMenu($menuData);\n```\n\n### Get Order\n\nTo retrieve an order, use the `WoltService::getOrder` method.\n\n\u003e You will get Order ID from your webhook called by Wolt.  \n\u003e More about it \u003e here: [Wolt Webhook Documentation](https://developer.development.dev.woltapi.com/docs/marketplace-integrations/restaurant-ipad-free#webhook-server).\n\n\u003e I recommend using `spatie/laravel-webhook-client` package for handling webhooks.\n\n```php\nuse BoredProgrammers\\Wolt\\WoltService;\n\n$orderId = 'your_wolt_order_id';\n$response = WoltService::getOrder($orderId);\n```\n\n### Accept Order\n\nTo accept an order, use the `WoltService::acceptOrder` method.\n\n```php\nuse BoredProgrammers\\Wolt\\WoltService;\n\n$orderId = 'your_wolt_order_id';\n$response = WoltService::acceptOrder($orderId);\n```\n\n### Reject Order\n\nTo reject an order, use the `WoltService::rejectOrder` method.\n\n```php\nuse BoredProgrammers\\Wolt\\WoltService;\n\n$orderId = 'your_wolt_order_id';\n$response = WoltService::rejectOrder($orderId);\n```\n\n### Mark Order as Ready\n\nTo mark an order as ready, use the `WoltService::markReadyOrder` method.\n\n```php\nuse BoredProgrammers\\Wolt\\WoltService;\n\n$orderId = 'your_wolt_order_id';\n$response = WoltService::markReadyOrder($orderId);\n```\n\n### Mark Order as Delivered\n\nTo mark an order as delivered, use the `WoltService::markDeliveredOrder` method.\n\n```php\nuse BoredProgrammers\\Wolt\\WoltService;\n\n$orderId = 'your_wolt_order_id';\n$response = WoltService::markDeliveredOrder($orderId);\n```\n\n### Confirm Preorder\n\nTo confirm a preorder, use the `WoltService::confirmPreorder` method.\n\n```php\nuse BoredProgrammers\\Wolt\\WoltService;\n\n$orderId = 'your_wolt_order_id';\n$response = WoltService::confirmPreorder($orderId);\n```\n\n## Contribution Guidelines\n\nWe welcome contributions to Wolt. If you'd like to contribute, please fork the repository, make your changes, and submit\na pull request. We have a few requirements for contributions:\n\n- Follow the PSR-2 coding standard.\n- Only use pull requests for contributions.\n\n## Changelog\n\nFor a detailed history of changes, see [releases](https://github.com/Bored-Programmers/wolt/releases) on GitHub.\n\n## License\n\nThis project is licensed under the [MIT license](/LICENSE.md).\n\n## Contact Information\n\nFor any questions or concerns, please feel free to create\na [discussion](https://github.com/Bored-Programmers/wolt/discussions) on GitHub.\n\n## Credits\n\nCreated by [Matěj Černý](https://github.com/LeMatosDeFuk)\nfrom [Bored Programmers](https://github.com/Bored-Programmers).\n\n## Acknowledgments\n\nWe would like to thank all the contributors who have helped to make Wolt a better package.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbored-programmers%2Flaravel-wolt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbored-programmers%2Flaravel-wolt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbored-programmers%2Flaravel-wolt/lists"}