hostinger-api-mcp 1.45.2 → 1.45.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3331,6 +3331,122 @@ const tools: OpenApiTool[] = [
3331
3331
  ],
3332
3332
  "group": "domains"
3333
3333
  },
3334
+ {
3335
+ "name": "ecommerce_listDiscountsV1",
3336
+ "description": "List a store's discounts. Filter by free text over code and name, or by disabled state.\nAmounts for fixed discounts are integers in the smallest currency unit; percentage\ndiscounts carry a whole-number value between 1 and 100.",
3337
+ "method": "GET",
3338
+ "path": "/api/ecommerce/v1/stores/{store_id}/discounts",
3339
+ "inputSchema": {
3340
+ "type": "object",
3341
+ "properties": {
3342
+ "store_id": {
3343
+ "type": "string",
3344
+ "description": "The ID of the store to list discounts for."
3345
+ },
3346
+ "q": {
3347
+ "type": "string",
3348
+ "description": "Free-text search over discount code and name."
3349
+ },
3350
+ "is_disabled": {
3351
+ "type": "string",
3352
+ "description": "Filter by disabled state.",
3353
+ "enum": [
3354
+ "true",
3355
+ "false"
3356
+ ]
3357
+ },
3358
+ "page": {
3359
+ "type": "integer",
3360
+ "description": "Page number"
3361
+ }
3362
+ },
3363
+ "required": [
3364
+ "store_id"
3365
+ ]
3366
+ },
3367
+ "security": [
3368
+ {
3369
+ "apiToken": []
3370
+ }
3371
+ ],
3372
+ "group": "ecommerce"
3373
+ },
3374
+ {
3375
+ "name": "ecommerce_createADiscountV1",
3376
+ "description": "Create a discount for a store. Fixed discounts take an amount in the smallest currency\nunit (e.g. $10 is 1000); percentage discounts take a whole-number value between 1 and 100.\nFree-shipping discounts ignore value. Returns the created discount.",
3377
+ "method": "POST",
3378
+ "path": "/api/ecommerce/v1/stores/{store_id}/discounts",
3379
+ "inputSchema": {
3380
+ "type": "object",
3381
+ "properties": {
3382
+ "store_id": {
3383
+ "type": "string",
3384
+ "description": "The ID of the store to create the discount for."
3385
+ },
3386
+ "code": {
3387
+ "type": "string",
3388
+ "description": "The discount code customers enter at checkout."
3389
+ },
3390
+ "name": {
3391
+ "type": "string",
3392
+ "description": "A human-friendly discount name."
3393
+ },
3394
+ "type": {
3395
+ "type": "string",
3396
+ "description": "The discount type.",
3397
+ "enum": [
3398
+ "percentage",
3399
+ "fixed",
3400
+ "free_shipping"
3401
+ ]
3402
+ },
3403
+ "value": {
3404
+ "type": "integer",
3405
+ "description": "For percentage discounts a whole number 1-100; for fixed discounts an amount in the smallest currency unit (e.g. $10 is 1000). Ignored for free_shipping."
3406
+ },
3407
+ "allocation": {
3408
+ "type": "string",
3409
+ "description": "Whether the discount applies to the cart total or to each eligible item.",
3410
+ "enum": [
3411
+ "total",
3412
+ "item"
3413
+ ]
3414
+ },
3415
+ "starts_at": {
3416
+ "type": "string",
3417
+ "description": "When the discount becomes active. A bare date (2026-11-27) anchors to time_zone. Defaults to now when omitted."
3418
+ },
3419
+ "ends_at": {
3420
+ "type": "string",
3421
+ "description": "When the discount expires. A bare date runs to the end of that day in time_zone. Never expires when omitted."
3422
+ },
3423
+ "usage_limit": {
3424
+ "type": "integer",
3425
+ "description": "Maximum number of times the discount can be redeemed."
3426
+ },
3427
+ "min_cart_value": {
3428
+ "type": "integer",
3429
+ "description": "Minimum cart value in the smallest currency unit required for the discount to apply."
3430
+ },
3431
+ "time_zone": {
3432
+ "type": "string",
3433
+ "description": "IANA time zone used to interpret starts_at and ends_at."
3434
+ }
3435
+ },
3436
+ "required": [
3437
+ "store_id",
3438
+ "code",
3439
+ "type",
3440
+ "value"
3441
+ ]
3442
+ },
3443
+ "security": [
3444
+ {
3445
+ "apiToken": []
3446
+ }
3447
+ ],
3448
+ "group": "ecommerce"
3449
+ },
3334
3450
  {
3335
3451
  "name": "ecommerce_getCustomStorefrontSetupInstructionsV1",
3336
3452
  "description": "Retrieve step-by-step setup instructions, formatted as Markdown, for connecting a custom sales\nchannel to your store and keeping your catalog, orders, shipping and payments in sync through\nthe Ecommerce API.",
@@ -3349,24 +3465,364 @@ const tools: OpenApiTool[] = [
3349
3465
  "group": "ecommerce"
3350
3466
  },
3351
3467
  {
3352
- "name": "ecommerce_enableManualPaymentMethodV1",
3353
- "description": "Enable a manual payment method so the store can accept orders without an online payment provider.",
3354
- "method": "POST",
3355
- "path": "/api/ecommerce/v1/stores/{store_id}/payment-methods/manual",
3468
+ "name": "ecommerce_cancelAnOrderV1",
3469
+ "description": "Cancel the order and optionally email the customer. Returns the updated order summary.",
3470
+ "method": "POST",
3471
+ "path": "/api/ecommerce/v1/stores/{store_id}/orders/{order_id}/cancel",
3472
+ "inputSchema": {
3473
+ "type": "object",
3474
+ "properties": {
3475
+ "store_id": {
3476
+ "type": "string",
3477
+ "description": "The ID of the store that owns the order."
3478
+ },
3479
+ "order_id": {
3480
+ "type": "string",
3481
+ "description": "The ID of the order to cancel."
3482
+ },
3483
+ "notify_customer": {
3484
+ "type": "boolean",
3485
+ "description": "Whether to email the customer about the cancellation. Defaults to true."
3486
+ }
3487
+ },
3488
+ "required": [
3489
+ "store_id",
3490
+ "order_id"
3491
+ ]
3492
+ },
3493
+ "security": [
3494
+ {
3495
+ "apiToken": []
3496
+ }
3497
+ ],
3498
+ "group": "ecommerce"
3499
+ },
3500
+ {
3501
+ "name": "ecommerce_fulfilAnOrderV1",
3502
+ "description": "Create a fulfilment for the order and attach tracking in one call. Omit items to fulfil\nevery remaining unfulfilled item. Returns the updated order summary.",
3503
+ "method": "POST",
3504
+ "path": "/api/ecommerce/v1/stores/{store_id}/orders/{order_id}/fulfill",
3505
+ "inputSchema": {
3506
+ "type": "object",
3507
+ "properties": {
3508
+ "store_id": {
3509
+ "type": "string",
3510
+ "description": "The ID of the store that owns the order."
3511
+ },
3512
+ "order_id": {
3513
+ "type": "string",
3514
+ "description": "The ID of the order to fulfil."
3515
+ },
3516
+ "items": {
3517
+ "type": "array",
3518
+ "description": "Line items to fulfil. Omit to fulfil every remaining unfulfilled item.",
3519
+ "items": {
3520
+ "type": "object",
3521
+ "description": "items parameter",
3522
+ "properties": {
3523
+ "line_item_id": {
3524
+ "type": "string",
3525
+ "description": "The line item to fulfil, from the order detail items[].id."
3526
+ },
3527
+ "quantity": {
3528
+ "type": "integer",
3529
+ "description": "Quantity of the line item to fulfil."
3530
+ }
3531
+ },
3532
+ "required": [
3533
+ "line_item_id",
3534
+ "quantity"
3535
+ ]
3536
+ }
3537
+ },
3538
+ "tracking_number": {
3539
+ "type": "string",
3540
+ "description": "Carrier tracking number for the shipment."
3541
+ },
3542
+ "tracking_url": {
3543
+ "type": "string",
3544
+ "description": "Public tracking URL for the shipment. Requires tracking_number."
3545
+ },
3546
+ "notify_customer": {
3547
+ "type": "boolean",
3548
+ "description": "Whether to email the customer about the fulfilment. Defaults to true."
3549
+ }
3550
+ },
3551
+ "required": [
3552
+ "store_id",
3553
+ "order_id"
3554
+ ]
3555
+ },
3556
+ "security": [
3557
+ {
3558
+ "apiToken": []
3559
+ }
3560
+ ],
3561
+ "group": "ecommerce"
3562
+ },
3563
+ {
3564
+ "name": "ecommerce_listOrdersV1",
3565
+ "description": "List a store's orders newest first as summaries. Filter by status, payment or fulfilment\nstatus, customer email, order number or a free-text query. Amounts are in the smallest\ncurrency unit. Retrieve a single order for its line items, addresses and fulfilments.",
3566
+ "method": "GET",
3567
+ "path": "/api/ecommerce/v1/stores/{store_id}/orders",
3568
+ "inputSchema": {
3569
+ "type": "object",
3570
+ "properties": {
3571
+ "store_id": {
3572
+ "type": "string",
3573
+ "description": "The ID of the store to list orders for."
3574
+ },
3575
+ "status": {
3576
+ "type": "array",
3577
+ "description": "Order statuses to include.",
3578
+ "items": {
3579
+ "type": "string",
3580
+ "description": "status parameter",
3581
+ "enum": [
3582
+ "pending",
3583
+ "completed",
3584
+ "archived",
3585
+ "canceled",
3586
+ "requires_action"
3587
+ ]
3588
+ }
3589
+ },
3590
+ "payment_status": {
3591
+ "type": "array",
3592
+ "description": "Payment statuses to include. A paid order is \"captured\".",
3593
+ "items": {
3594
+ "type": "string",
3595
+ "description": "payment_status parameter",
3596
+ "enum": [
3597
+ "not_paid",
3598
+ "awaiting",
3599
+ "captured",
3600
+ "partially_refunded",
3601
+ "refunded",
3602
+ "canceled",
3603
+ "requires_action",
3604
+ "not_required"
3605
+ ]
3606
+ }
3607
+ },
3608
+ "fulfillment_status": {
3609
+ "type": "array",
3610
+ "description": "Fulfilment statuses to include.",
3611
+ "items": {
3612
+ "type": "string",
3613
+ "description": "fulfillment_status parameter",
3614
+ "enum": [
3615
+ "not_fulfilled",
3616
+ "partially_fulfilled",
3617
+ "fulfilled",
3618
+ "partially_shipped",
3619
+ "shipped",
3620
+ "partially_returned",
3621
+ "returned",
3622
+ "canceled",
3623
+ "requires_action"
3624
+ ]
3625
+ }
3626
+ },
3627
+ "email": {
3628
+ "type": "string",
3629
+ "description": "Customer email, matched exactly."
3630
+ },
3631
+ "display_id": {
3632
+ "type": "string",
3633
+ "description": "The order number the merchant and customer see."
3634
+ },
3635
+ "q": {
3636
+ "type": "string",
3637
+ "description": "Free-text search over customer name, email, order number and line items."
3638
+ },
3639
+ "created_at_from": {
3640
+ "type": "string",
3641
+ "description": "Earliest creation time to include, inclusive. Accepts a date or ISO date-time (UTC)."
3642
+ },
3643
+ "created_at_to": {
3644
+ "type": "string",
3645
+ "description": "Latest creation time to include, inclusive. A bare date covers that whole day."
3646
+ },
3647
+ "page": {
3648
+ "type": "integer",
3649
+ "description": "Page number"
3650
+ }
3651
+ },
3652
+ "required": [
3653
+ "store_id"
3654
+ ]
3655
+ },
3656
+ "security": [
3657
+ {
3658
+ "apiToken": []
3659
+ }
3660
+ ],
3661
+ "group": "ecommerce"
3662
+ },
3663
+ {
3664
+ "name": "ecommerce_retrieveAnOrderV1",
3665
+ "description": "Retrieve one order in full: line items (each with the id the fulfil endpoint needs),\naddresses, the totals breakdown and fulfilments with tracking. Amounts are in the\nsmallest currency unit.",
3666
+ "method": "GET",
3667
+ "path": "/api/ecommerce/v1/stores/{store_id}/orders/{order_id}",
3668
+ "inputSchema": {
3669
+ "type": "object",
3670
+ "properties": {
3671
+ "store_id": {
3672
+ "type": "string",
3673
+ "description": "The ID of the store that owns the order."
3674
+ },
3675
+ "order_id": {
3676
+ "type": "string",
3677
+ "description": "The ID of the order to retrieve."
3678
+ }
3679
+ },
3680
+ "required": [
3681
+ "store_id",
3682
+ "order_id"
3683
+ ]
3684
+ },
3685
+ "security": [
3686
+ {
3687
+ "apiToken": []
3688
+ }
3689
+ ],
3690
+ "group": "ecommerce"
3691
+ },
3692
+ {
3693
+ "name": "ecommerce_enableManualPaymentMethodV1",
3694
+ "description": "Enable a manual payment method so the store can accept orders without an online payment provider.",
3695
+ "method": "POST",
3696
+ "path": "/api/ecommerce/v1/stores/{store_id}/payment-methods/manual",
3697
+ "inputSchema": {
3698
+ "type": "object",
3699
+ "properties": {
3700
+ "store_id": {
3701
+ "type": "string",
3702
+ "description": "The ID of the store to enable manual payment for."
3703
+ },
3704
+ "title": {
3705
+ "type": "string",
3706
+ "description": "Optional display name shown to customers at checkout."
3707
+ }
3708
+ },
3709
+ "required": [
3710
+ "store_id"
3711
+ ]
3712
+ },
3713
+ "security": [
3714
+ {
3715
+ "apiToken": []
3716
+ }
3717
+ ],
3718
+ "group": "ecommerce"
3719
+ },
3720
+ {
3721
+ "name": "ecommerce_createAPaymentProviderConnectLinkV1",
3722
+ "description": "Create an onboarding link for connecting a payment gateway to the store. Returns the gateway\nonboarding URL for the merchant to open and a deep-link into the store admin.",
3723
+ "method": "POST",
3724
+ "path": "/api/ecommerce/v1/stores/{store_id}/payment-providers/{provider_id}/connect-link",
3725
+ "inputSchema": {
3726
+ "type": "object",
3727
+ "properties": {
3728
+ "store_id": {
3729
+ "type": "string",
3730
+ "description": "The ID of the store to connect the payment provider to."
3731
+ },
3732
+ "provider_id": {
3733
+ "type": "string",
3734
+ "description": "The ID of the payment gateway to connect, e.g. stripe."
3735
+ }
3736
+ },
3737
+ "required": [
3738
+ "store_id",
3739
+ "provider_id"
3740
+ ]
3741
+ },
3742
+ "security": [
3743
+ {
3744
+ "apiToken": []
3745
+ }
3746
+ ],
3747
+ "group": "ecommerce"
3748
+ },
3749
+ {
3750
+ "name": "ecommerce_listStorePaymentProvidersV1",
3751
+ "description": "List a store's payment providers, split into providers already connected to the store and\ngateways available to install. Never exposes gateway credentials, secrets, or configuration.",
3752
+ "method": "GET",
3753
+ "path": "/api/ecommerce/v1/stores/{store_id}/payment-providers",
3754
+ "inputSchema": {
3755
+ "type": "object",
3756
+ "properties": {
3757
+ "store_id": {
3758
+ "type": "string",
3759
+ "description": "The ID of the store to list payment providers for."
3760
+ },
3761
+ "include_currency_unsupported": {
3762
+ "type": "boolean",
3763
+ "description": "Include gateways that do not support the store currency in the available list."
3764
+ }
3765
+ },
3766
+ "required": [
3767
+ "store_id"
3768
+ ]
3769
+ },
3770
+ "security": [
3771
+ {
3772
+ "apiToken": []
3773
+ }
3774
+ ],
3775
+ "group": "ecommerce"
3776
+ },
3777
+ {
3778
+ "name": "ecommerce_createAProductImageUploadURLV1",
3779
+ "description": "Returns a signed URL to upload a product image to (multipart/form-data POST). Then call the\nattach-image endpoint with the returned object_name to scan and attach it to the product.",
3780
+ "method": "POST",
3781
+ "path": "/api/ecommerce/v1/stores/{store_id}/products/{product_id}/images/upload-url",
3782
+ "inputSchema": {
3783
+ "type": "object",
3784
+ "properties": {
3785
+ "store_id": {
3786
+ "type": "string",
3787
+ "description": "The ID of the store the product belongs to."
3788
+ },
3789
+ "product_id": {
3790
+ "type": "string",
3791
+ "description": "The ID of the product the image will be attached to."
3792
+ }
3793
+ },
3794
+ "required": [
3795
+ "store_id",
3796
+ "product_id"
3797
+ ]
3798
+ },
3799
+ "security": [
3800
+ {
3801
+ "apiToken": []
3802
+ }
3803
+ ],
3804
+ "group": "ecommerce"
3805
+ },
3806
+ {
3807
+ "name": "ecommerce_deleteAProductV1",
3808
+ "description": "Delete a product and its variants from the store. A subscription product with active\nsubscribers is archived instead of deleted so its data stays available.",
3809
+ "method": "DELETE",
3810
+ "path": "/api/ecommerce/v1/stores/{store_id}/products/{product_id}",
3356
3811
  "inputSchema": {
3357
3812
  "type": "object",
3358
3813
  "properties": {
3359
3814
  "store_id": {
3360
3815
  "type": "string",
3361
- "description": "The ID of the store to enable manual payment for."
3816
+ "description": "The ID of the store that owns the product."
3362
3817
  },
3363
- "title": {
3818
+ "product_id": {
3364
3819
  "type": "string",
3365
- "description": "Optional display name shown to customers at checkout."
3820
+ "description": "The ID of the product to delete."
3366
3821
  }
3367
3822
  },
3368
3823
  "required": [
3369
- "store_id"
3824
+ "store_id",
3825
+ "product_id"
3370
3826
  ]
3371
3827
  },
3372
3828
  "security": [
@@ -3377,20 +3833,37 @@ const tools: OpenApiTool[] = [
3377
3833
  "group": "ecommerce"
3378
3834
  },
3379
3835
  {
3380
- "name": "ecommerce_createAProductImageUploadURLV1",
3381
- "description": "Returns a signed URL to upload a product image to (multipart/form-data POST). Then call the\nattach-image endpoint with the returned object_name to scan and attach it to the product.",
3382
- "method": "POST",
3383
- "path": "/api/ecommerce/v1/stores/{store_id}/products/{product_id}/images/upload-url",
3836
+ "name": "ecommerce_updateAProductV1",
3837
+ "description": "Update a product's name, description or status. Set status to published to make it buyable,\ndraft to hide it, or archived to retire it. Variants, prices and inventory are managed\nthrough the variant endpoints, not here. Returns the updated product summary.",
3838
+ "method": "PATCH",
3839
+ "path": "/api/ecommerce/v1/stores/{store_id}/products/{product_id}",
3384
3840
  "inputSchema": {
3385
3841
  "type": "object",
3386
3842
  "properties": {
3387
3843
  "store_id": {
3388
3844
  "type": "string",
3389
- "description": "The ID of the store the product belongs to."
3845
+ "description": "The ID of the store that owns the product."
3390
3846
  },
3391
3847
  "product_id": {
3392
3848
  "type": "string",
3393
- "description": "The ID of the product the image will be attached to."
3849
+ "description": "The ID of the product to update."
3850
+ },
3851
+ "name": {
3852
+ "type": "string",
3853
+ "description": "The product name."
3854
+ },
3855
+ "description": {
3856
+ "type": "string",
3857
+ "description": "The product description."
3858
+ },
3859
+ "status": {
3860
+ "type": "string",
3861
+ "description": "Set \"published\" to make the product buyable, \"draft\" to hide it, or \"archived\" to retire it.",
3862
+ "enum": [
3863
+ "draft",
3864
+ "published",
3865
+ "archived"
3866
+ ]
3394
3867
  }
3395
3868
  },
3396
3869
  "required": [
@@ -3451,6 +3924,73 @@ const tools: OpenApiTool[] = [
3451
3924
  ],
3452
3925
  "group": "ecommerce"
3453
3926
  },
3927
+ {
3928
+ "name": "ecommerce_listProductsV1",
3929
+ "description": "List a store's products newest first as lean summaries (name, status, thumbnail, variant\ncount and price range). Prices are integers in the smallest currency unit and live on\nvariants. Filter by status, free text or a set of product ids. Use include=variants to\nembed each product's variants with prices and inventory, and include=media to embed its media.",
3930
+ "method": "GET",
3931
+ "path": "/api/ecommerce/v1/stores/{store_id}/products",
3932
+ "inputSchema": {
3933
+ "type": "object",
3934
+ "properties": {
3935
+ "store_id": {
3936
+ "type": "string",
3937
+ "description": "The ID of the store to list products for."
3938
+ },
3939
+ "product_ids": {
3940
+ "type": "array",
3941
+ "description": "Restrict to these product ids. Doubles as a single-product lookup. Up to 200 ids.",
3942
+ "items": {
3943
+ "type": "string",
3944
+ "description": "product_ids parameter"
3945
+ }
3946
+ },
3947
+ "status": {
3948
+ "type": "array",
3949
+ "description": "Product statuses to include.",
3950
+ "items": {
3951
+ "type": "string",
3952
+ "description": "status parameter",
3953
+ "enum": [
3954
+ "draft",
3955
+ "proposed",
3956
+ "published",
3957
+ "rejected",
3958
+ "archived"
3959
+ ]
3960
+ }
3961
+ },
3962
+ "q": {
3963
+ "type": "string",
3964
+ "description": "Free-text search over product title and SKU."
3965
+ },
3966
+ "include": {
3967
+ "type": "array",
3968
+ "description": "Opt-in heavy data: \"variants\" embeds each product's variants; \"media\" embeds its media.",
3969
+ "items": {
3970
+ "type": "string",
3971
+ "description": "include parameter",
3972
+ "enum": [
3973
+ "variants",
3974
+ "media"
3975
+ ]
3976
+ }
3977
+ },
3978
+ "page": {
3979
+ "type": "integer",
3980
+ "description": "Page number"
3981
+ }
3982
+ },
3983
+ "required": [
3984
+ "store_id"
3985
+ ]
3986
+ },
3987
+ "security": [
3988
+ {
3989
+ "apiToken": []
3990
+ }
3991
+ ],
3992
+ "group": "ecommerce"
3993
+ },
3454
3994
  {
3455
3995
  "name": "ecommerce_createPhysicalProductV1",
3456
3996
  "description": "Create a published physical product with a single variant priced in the store currency.",
@@ -3559,8 +4099,8 @@ const tools: OpenApiTool[] = [
3559
4099
  "group": "ecommerce"
3560
4100
  },
3561
4101
  {
3562
- "name": "ecommerce_createCustomSalesChannelV1",
3563
- "description": "Create a custom sales channel for a store. Build your own frontend and keep your catalog,\norders, shipping and payments in sync through the Ecommerce API.",
4102
+ "name": "ecommerce_createASalesChannelV1",
4103
+ "description": "Create a sales channel for a store. A \"custom\" channel is headless: build your own frontend and keep\nyour catalog, orders, shipping and payments in sync through the Ecommerce API. A \"quick-link\" channel\nis a hosted one-page store whose handle is auto-generated.",
3564
4104
  "method": "POST",
3565
4105
  "path": "/api/ecommerce/v1/stores/{store_id}/sales-channels",
3566
4106
  "inputSchema": {
@@ -3572,24 +4112,24 @@ const tools: OpenApiTool[] = [
3572
4112
  },
3573
4113
  "type": {
3574
4114
  "type": "string",
3575
- "description": "Sales channel type. Only \"custom\" channels can be created via the API.",
4115
+ "description": "Sales channel type. \"custom\" is a headless channel: it requires a name and takes an optional public url.\n\"quick-link\" is a one-page store whose handle is auto-generated; it supports neither name nor url.",
3576
4116
  "enum": [
3577
- "custom"
4117
+ "custom",
4118
+ "quick-link"
3578
4119
  ]
3579
4120
  },
3580
4121
  "name": {
3581
4122
  "type": "string",
3582
- "description": "Merchant-facing custom name shown in the sales channels list."
4123
+ "description": "Merchant-facing custom name. Required for custom channels; not supported for quick-link."
3583
4124
  },
3584
4125
  "url": {
3585
4126
  "type": "string",
3586
- "description": "Optional public address where the custom sales channel lives."
4127
+ "description": "Optional public url for the channel. Custom channels only; not supported for quick-link."
3587
4128
  }
3588
4129
  },
3589
4130
  "required": [
3590
4131
  "store_id",
3591
- "type",
3592
- "name"
4132
+ "type"
3593
4133
  ]
3594
4134
  },
3595
4135
  "security": [
@@ -3790,6 +4330,250 @@ const tools: OpenApiTool[] = [
3790
4330
  ],
3791
4331
  "group": "ecommerce"
3792
4332
  },
4333
+ {
4334
+ "name": "ecommerce_updateProductVariantsInBatchV1",
4335
+ "description": "Update up to 100 existing variants in place by id — title, inventory, stock tracking and\nprices. Variants omitted from the request are left untouched. Prices replace the variant's\nexisting prices in full. Returns the updated variants.",
4336
+ "method": "PATCH",
4337
+ "path": "/api/ecommerce/v1/stores/{store_id}/products/{product_id}/variants/batch",
4338
+ "inputSchema": {
4339
+ "type": "object",
4340
+ "properties": {
4341
+ "store_id": {
4342
+ "type": "string",
4343
+ "description": "The ID of the store that owns the product."
4344
+ },
4345
+ "product_id": {
4346
+ "type": "string",
4347
+ "description": "The ID of the product whose variants are being updated."
4348
+ },
4349
+ "variants": {
4350
+ "type": "array",
4351
+ "description": "Variants to update in place by id, up to 100. Variants omitted from the list are left untouched.",
4352
+ "items": {
4353
+ "type": "object",
4354
+ "description": "variants parameter",
4355
+ "properties": {
4356
+ "variant_id": {
4357
+ "type": "string",
4358
+ "description": "The id of the variant to update."
4359
+ },
4360
+ "title": {
4361
+ "type": "string",
4362
+ "description": "The variant title."
4363
+ },
4364
+ "inventory_quantity": {
4365
+ "type": "integer",
4366
+ "description": "Units in stock."
4367
+ },
4368
+ "manage_inventory": {
4369
+ "type": "boolean",
4370
+ "description": "Whether stock is tracked for this variant."
4371
+ },
4372
+ "prices": {
4373
+ "type": "array",
4374
+ "description": "The full list of prices for the variant, replacing the existing ones. A free item is amount: 0.",
4375
+ "items": {
4376
+ "type": "object",
4377
+ "description": "prices parameter",
4378
+ "properties": {
4379
+ "amount": {
4380
+ "type": "integer",
4381
+ "description": "Price in the smallest currency unit (e.g. cents)."
4382
+ },
4383
+ "sale_amount": {
4384
+ "type": "integer",
4385
+ "description": "Optional sale price in the smallest currency unit; must be lower than amount."
4386
+ },
4387
+ "currency": {
4388
+ "type": "string",
4389
+ "description": "ISO 4217 currency code. Defaults to the store's default currency."
4390
+ }
4391
+ },
4392
+ "required": [
4393
+ "amount"
4394
+ ]
4395
+ }
4396
+ }
4397
+ },
4398
+ "required": [
4399
+ "variant_id"
4400
+ ]
4401
+ }
4402
+ }
4403
+ },
4404
+ "required": [
4405
+ "store_id",
4406
+ "product_id",
4407
+ "variants"
4408
+ ]
4409
+ },
4410
+ "security": [
4411
+ {
4412
+ "apiToken": []
4413
+ }
4414
+ ],
4415
+ "group": "ecommerce"
4416
+ },
4417
+ {
4418
+ "name": "ecommerce_deleteAProductVariantV1",
4419
+ "description": "Delete a single variant from the product.",
4420
+ "method": "DELETE",
4421
+ "path": "/api/ecommerce/v1/stores/{store_id}/products/{product_id}/variants/{variant_id}",
4422
+ "inputSchema": {
4423
+ "type": "object",
4424
+ "properties": {
4425
+ "store_id": {
4426
+ "type": "string",
4427
+ "description": "The ID of the store that owns the product."
4428
+ },
4429
+ "product_id": {
4430
+ "type": "string",
4431
+ "description": "The ID of the product that owns the variant."
4432
+ },
4433
+ "variant_id": {
4434
+ "type": "string",
4435
+ "description": "The ID of the variant to delete."
4436
+ }
4437
+ },
4438
+ "required": [
4439
+ "store_id",
4440
+ "product_id",
4441
+ "variant_id"
4442
+ ]
4443
+ },
4444
+ "security": [
4445
+ {
4446
+ "apiToken": []
4447
+ }
4448
+ ],
4449
+ "group": "ecommerce"
4450
+ },
4451
+ {
4452
+ "name": "ecommerce_listProductVariantsV1",
4453
+ "description": "List a product's variants, ordered by rank, with their options, prices and inventory.\nPrices are integers in the smallest currency unit and live on variants.",
4454
+ "method": "GET",
4455
+ "path": "/api/ecommerce/v1/stores/{store_id}/products/{product_id}/variants",
4456
+ "inputSchema": {
4457
+ "type": "object",
4458
+ "properties": {
4459
+ "store_id": {
4460
+ "type": "string",
4461
+ "description": "The ID of the store that owns the product."
4462
+ },
4463
+ "product_id": {
4464
+ "type": "string",
4465
+ "description": "The ID of the product to list variants for."
4466
+ },
4467
+ "page": {
4468
+ "type": "integer",
4469
+ "description": "Page number"
4470
+ }
4471
+ },
4472
+ "required": [
4473
+ "store_id",
4474
+ "product_id"
4475
+ ]
4476
+ },
4477
+ "security": [
4478
+ {
4479
+ "apiToken": []
4480
+ }
4481
+ ],
4482
+ "group": "ecommerce"
4483
+ },
4484
+ {
4485
+ "name": "ecommerce_createAProductVariantV1",
4486
+ "description": "Add a variant to a product along one or more option dimensions (e.g. Size, Color). Options\nmissing from the product are created automatically; provide a value for every option the\nproduct already has. Prices are integers in the smallest currency unit and default to the\nstore currency. Returns the created variant.",
4487
+ "method": "POST",
4488
+ "path": "/api/ecommerce/v1/stores/{store_id}/products/{product_id}/variants",
4489
+ "inputSchema": {
4490
+ "type": "object",
4491
+ "properties": {
4492
+ "store_id": {
4493
+ "type": "string",
4494
+ "description": "The ID of the store that owns the product."
4495
+ },
4496
+ "product_id": {
4497
+ "type": "string",
4498
+ "description": "The ID of the product to add the variant to."
4499
+ },
4500
+ "title": {
4501
+ "type": "string",
4502
+ "description": "The variant title. Defaults to the option values joined with ' / ' (e.g. 'Red / L')."
4503
+ },
4504
+ "sku": {
4505
+ "type": "string",
4506
+ "description": "The variant SKU."
4507
+ },
4508
+ "options": {
4509
+ "type": "array",
4510
+ "description": "Option name/value pairs that distinguish this variant, e.g. [{name: Size, value: M}]. Options missing from the product are created; provide a value for every option the product already has.",
4511
+ "items": {
4512
+ "type": "object",
4513
+ "description": "options parameter",
4514
+ "properties": {
4515
+ "name": {
4516
+ "type": "string",
4517
+ "description": "Option name, e.g. Size."
4518
+ },
4519
+ "value": {
4520
+ "type": "string",
4521
+ "description": "Option value for this variant, e.g. M."
4522
+ }
4523
+ },
4524
+ "required": [
4525
+ "name",
4526
+ "value"
4527
+ ]
4528
+ }
4529
+ },
4530
+ "prices": {
4531
+ "type": "array",
4532
+ "description": "Prices per currency. Amounts are integers in the smallest currency unit. A free item is amount: 0.",
4533
+ "items": {
4534
+ "type": "object",
4535
+ "description": "prices parameter",
4536
+ "properties": {
4537
+ "amount": {
4538
+ "type": "integer",
4539
+ "description": "Price in the smallest currency unit (e.g. cents)."
4540
+ },
4541
+ "sale_amount": {
4542
+ "type": "integer",
4543
+ "description": "Optional sale price in the smallest currency unit; must be lower than amount."
4544
+ },
4545
+ "currency": {
4546
+ "type": "string",
4547
+ "description": "ISO 4217 currency code. Defaults to the store's default currency when omitted."
4548
+ }
4549
+ },
4550
+ "required": [
4551
+ "amount"
4552
+ ]
4553
+ }
4554
+ },
4555
+ "inventory_quantity": {
4556
+ "type": "integer",
4557
+ "description": "Units in stock. Defaults to 0."
4558
+ },
4559
+ "manage_inventory": {
4560
+ "type": "boolean",
4561
+ "description": "Whether stock is tracked for this variant. Defaults to false."
4562
+ }
4563
+ },
4564
+ "required": [
4565
+ "store_id",
4566
+ "product_id",
4567
+ "options"
4568
+ ]
4569
+ },
4570
+ "security": [
4571
+ {
4572
+ "apiToken": []
4573
+ }
4574
+ ],
4575
+ "group": "ecommerce"
4576
+ },
3793
4577
  {
3794
4578
  "name": "horizons_createWebsiteV1",
3795
4579
  "description": "Create new Hostinger Horizons website from the given message.\\n\nUse this tool when user asks you to create a website, landing page, blog\nor any other type of application.\\n\nThis tool initiates the website creation process and returns a website URL and ID.\nThe generation happens asynchronously.\\n\nAfter invoking this tool, your chat reply must be EXACTLY 1 sentence summarizing\nthat Hostinger Horizons is now creating their website and it will be ready in a few minutes\nand you should provide the website URL to the user immediately\nDo not write code.\\n\\nTo edit afterwards, users must go to Hostinger Horizons interface\nin the provided website URL.\nIf the tool call fails with an error, you should provide a clear explanation of the error\nand do not generate code yourself in the chat.\n\\n\nTECHNOLOGY STACK CONSTRAINTS (STRICTLY ENFORCED):\\n\nThe environment is limited to the following technologies.\nYou MUST NOT use, suggest, or implement any technology outside this list:\\n\n\\n\n- Language: JavaScript ONLY.\n- Languages like TypeScript, Rust, Python, Java, PHP, etc., are STRICTLY PROHIBITED.\\n\n- Framework: React.\\n\n- Navigation: React Router.\\n\n- Styling: TailwindCSS.\\n\n- Components: shadcn/ui (built with @radix-ui primitives).\\n\n- Icons: Lucide React.\\n\n- Animations: Framer Motion.\\n\n\\n\nBACKEND & DATA STORAGE:\\n\n- Horizons integrated backend is the EXCLUSIVE solution for persistent data storage,\nauthentication, and database needs.\\n\n- Local databases (SQLite, MySQL, etc.) are STRICTLY PROHIBITED.\\n\n- Third-party services (Firebase, AWS Amplify) are allowed ONLY if explicitly requested by the user.\\n\n\\n\nMAPS:\\n\n- OpenStreetMap is the default provider.\\n\n- Alternative providers (Google Maps, Mapbox) are allowed ONLY if explicitly requested by the user.\\n",
@@ -4831,7 +5615,7 @@ const tools: OpenApiTool[] = [
4831
5615
  },
4832
5616
  {
4833
5617
  "name": "hosting_startNode_jsBuildV1",
4834
- "description": "Start a Node.js build process using files already present on the website's file storage.\n\nWARNING: on success this overwrites the website's existing contents and cannot be\nundone — verify this is intended before calling this endpoint.\n\nThe `source_type` must be `archive` and `source_options.archive_path` must point to an\nexisting archive file on the server (relative to the website document root).\nUse the `Generate Upload URL` endpoint to obtain credentials and upload the archive first.\n\nTo auto-detect build settings from an archive before starting, first call the\n`Get Node.js Build Settings from Archive` endpoint. To upload an archive and start\na build in one step, use the `Create Node.js Build from Archive` endpoint instead.\n\nThe returned build `uuid` can be used to poll progress and retrieve logs via\nthe `Get Node.js Build Logs` endpoint.",
5618
+ "description": "Start a Node.js build process using files already present on the website's file storage.\n\nWARNING: on success this overwrites the website's existing contents and cannot be\nundone — verify this is intended before calling this endpoint.\n\nThe `source_type` must be `archive` and `source_options.archive_path` must point to an\nexisting archive file on the server (relative to the website document root).\nUse the `Generate Upload URL` endpoint to obtain credentials and upload the archive first.\n\nTo auto-detect build settings from an archive before starting, first call the\n`Get Node.js Build Settings from Archive` endpoint.\n\nThe returned build `uuid` can be used to poll progress and retrieve logs via\nthe `Get Node.js Build Logs` endpoint.",
4835
5619
  "method": "POST",
4836
5620
  "path": "/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds",
4837
5621
  "inputSchema": {
@@ -4944,7 +5728,7 @@ const tools: OpenApiTool[] = [
4944
5728
  },
4945
5729
  {
4946
5730
  "name": "hosting_getNode_jsBuildSettingsFromArchiveV1",
4947
- "description": "Auto-detect Node.js build settings from a package.json inside an archive already on the server.\n\nUse this before calling `Start Node.js Build` to preview what settings will be used,\nor to let the user review and override values (framework, node version, root directory,\noutput directory, build script) before committing to a build.\n\nThe archive must already be present on the website's file storage. Use the\n`Generate Upload URL` endpoint to obtain credentials and upload the archive first.\nTo upload an archive and start a build in one step without inspecting settings first,\nuse the `Create Node.js Build from Archive` endpoint instead.",
5731
+ "description": "Auto-detect Node.js build settings from a package.json inside an archive already on the server.\n\nUse this before calling `Start Node.js Build` to preview what settings will be used,\nor to let the user review and override values (framework, node version, root directory,\noutput directory, build script) before committing to a build.\n\nThe archive must already be present on the website's file storage. Use the\n`Generate Upload URL` endpoint to obtain credentials and upload the archive first.",
4948
5732
  "method": "GET",
4949
5733
  "path": "/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds/settings/from-archive",
4950
5734
  "inputSchema": {