v1.49.0
OpenAPI 3.0.0

Hostinger API

Overview

The Hostinger API provides a comprehensive set of endpoints that allow developers to interact with Hostinger's services programmatically. This API enables you to manage various aspects of your Hostinger account.

The Hostinger API is a (mostly) RESTful API that uses standard HTTP methods and status codes.

Authentication

The Hostinger API uses tokens for authentication. To authenticate your requests, you need to include a valid bearer token in the Authorization header of your HTTP requests:

Authorization: Bearer YOUR_API_TOKEN

API tokens for individual users can be created and managed from the Account page of the Hostinger Panel. Tokens will have same permissions as the owning user. Optionally, tokens can be set to expire after a certain period of time.

Rate Limiting

To ensure fair usage and prevent abuse, the API enforces rate limits on the number of requests that can be made within a certain time period. If you exceed the rate limit, you will receive a 429 Too Many Requests response. Rate limit headers are included in the response to help you manage your requests. Your IP address might get temporarily blocked if you exceed the rate limit multiple times.

Parameters

All requests sent to API must have the content type application/json. POST, PUT, PATCH methods may include a JSON object in the request body. Documentation provides required structure and examples of the object. Some endpoints require path parameters. These parameters are included in the URL path and are marked with curly braces.

Pagination

Some endpoints return a large number of items. To make these responses more manageable, the API uses pagination. By default, the API returns50 items per page.

The page number can be specified using the page query parameter, for example: /api/vps/v1/public-keys?page=2

Errors

The Hostinger API uses standard HTTP status codes to indicate the success or failure of a request. In case of an error, the API will return a JSON response with an error field, containing a human-readable error message. Error responses also contain a correlation_id field which can be used to identify the request in case you need to contact support.

SDKs & Tools

To help you get started with the Hostinger API,we provide SDKs and tools in various programming languages. The usage & documentation for each SDK can be found in the respective repositories:

Change log

For information on the latest changes to the API, please refer to the change log.

Support

If you have any questions, feedback or feature requests, please create an issue or discussion on the repository.

For any support take a look at our Github Repository, dedicated to the Hostinger API.

Client Libraries

Install official CLI tool. Examples and usage instructions can be found in our Github repository.

hostinger vps vm list

Catalog

Access a comprehensive catalog of service plans and subscription options, complete with detailed pricing and features.

Catalog Operations

Get catalog item list

Retrieve catalog items available for order.

Prices in catalog items is displayed as cents (without floating point), e.g: float 17.99 is displayed as integer 1799.

Use this endpoint to view available services and pricing before placing orders.

Query Parameters
  • category
    Type: string enum

    Filter catalog items by category

    values
    • DOMAIN
    • VPS
    • EMAIL
  • name
    Type: string

    Filter catalog items by name. Use * for wildcard search, e.g. .COM* to find .com domain

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/billing/v1/catalog
curl /api/billing/v1/catalog \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "id": "hostingercom-vps-kvm2",
    "name": "KVM 2",
    "category": "VPS",
    "metadata": {
      "field": "value"
    },
    "prices": [
      {
        "id": "hostingercom-vps-kvm2-usd-1m",
        "name": "KVM 2 (billed every month)",
        "currency": "USD",
        "price": 1799,
        "first_period_price": 899,
        "period": 1,
        "period_unit": "day"
      }
    ]
  }
]

Orders

Initiate and track new service orders seamlessly. This category streamlines the process of purchasing Hostinger services, enabling efficient management of order details.

Create purchase order

Create a purchase order for any Hostinger product.

This unified endpoint places an order for one or more catalog items and works across all Hostinger products, leveraging the existing billing infrastructure. Use the catalog endpoint to look up the item_id values available for purchase.

If no payment method is provided, your default payment method will be used automatically.

This endpoint only places the order. Product-specific provisioning (e.g. VPS setup or domain registration) is not performed here — once the order completes, use the relevant product endpoints or hPanel to finalize setup.

Use this endpoint to purchase any product available in the catalog.

Body·
required
application/json
  • items
    Type: array object[]
    required

    Catalog price items to purchase

  • coupons
    Type: array

    Discount coupon codes

  • payment_method_id
    Type: integer

    Payment method ID, default will be used if not provided

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/billing/v1/orders
curl /api/billing/v1/orders \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "payment_method_id": 1327362,
  "items": [
    {
      "item_id": "hostingercom-vps-kvm2-usd-1m",
      "quantity": 1
    }
  ],
  "coupons": []
}'
{
  "id": 2957086,
  "subscription_id": "Azz353Uhl1xC54pR0",
  "status": "completed",
  "currency": "USD",
  "subtotal": 899,
  "total": 1088,
  "billing_address": {
    "first_name": "John",
    "last_name": "Doe",
    "company": null,
    "address_1": null,
    "address_2": null,
    "city": null,
    "state": null,
    "zip": null,
    "country": "NL",
    "phone": null,
    "email": "john@doe.tld"
  },
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-27T11:54:22Z"
}

Payment methods

Review and manage the payment methods linked to your Hostinger account. Enjoy a secure and convenient overview for handling billing and transactions.

Set default payment method

Set the default payment method for your account.

Use this endpoint to configure the primary payment method for future orders.

Path Parameters
  • paymentMethodId
    Type: integer
    required

    Payment method ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/billing/v1/payment-methods/{paymentMethodId}
curl /api/billing/v1/payment-methods/9693613 \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Delete payment method

Delete a payment method from your account.

Use this endpoint to remove unused payment methods from user accounts.

Path Parameters
  • paymentMethodId
    Type: integer
    required

    Payment method ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/billing/v1/payment-methods/{paymentMethodId}
curl /api/billing/v1/payment-methods/9693613 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Get payment method list

Retrieve available payment methods that can be used for placing new orders.

If you want to add new payment method, please use hPanel.

Use this endpoint to view available payment options before creating orders.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/billing/v1/payment-methods
curl /api/billing/v1/payment-methods \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "id": 6523,
    "name": "Credit Card",
    "identifier": "1234*****6464",
    "payment_method": "card",
    "is_default": true,
    "is_expired": false,
    "is_suspended": false,
    "created_at": "2025-02-27T11:54:22Z",
    "expires_at": "2025-03-27T11:54:22Z",
    "suspended_at": "2025-03-28T11:54:22Z"
  }
]

Subscriptions

Manage your account's subscriptions by retrieving lists of active and expired plans along with details such as activation and expiration dates.

Get subscription list

Retrieve a list of all subscriptions associated with your account.

Use this endpoint to monitor active services and billing status.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/billing/v1/subscriptions
curl /api/billing/v1/subscriptions \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "id": "Azz36nUfKX1S1MSF",
    "name": "KVM 1",
    "status": "active",
    "billing_period": 1,
    "billing_period_unit": "day",
    "currency_code": "USD",
    "total_price": 1799,
    "renewal_price": 1799,
    "is_auto_renewed": true,
    "created_at": "2025-02-27T11:54:22Z",
    "expires_at": "2025-03-27T11:54:22Z",
    "next_billing_at": "2025-02-28T11:54:22Z"
  }
]

Disable auto-renewal

Disable auto-renewal for a subscription.

Use this endpoint when disable auto-renewal for a subscription.

Path Parameters
  • subscriptionId
    Type: string
    required

    Subscription ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/billing/v1/subscriptions/{subscriptionId}/auto-renewal/disable
curl /api/billing/v1/subscriptions/Cxy353Uhl1xC54pG6/auto-renewal/disable \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": "Azz36nUfKX1S1MSF",
  "name": "KVM 1",
  "status": "active",
  "billing_period": 1,
  "billing_period_unit": "day",
  "currency_code": "USD",
  "total_price": 1799,
  "renewal_price": 1799,
  "is_auto_renewed": true,
  "created_at": "2025-02-27T11:54:22Z",
  "expires_at": "2025-03-27T11:54:22Z",
  "next_billing_at": "2025-02-28T11:54:22Z"
}

Enable auto-renewal

Enable auto-renewal for a subscription.

Use this endpoint when enable auto-renewal for a subscription.

Path Parameters
  • subscriptionId
    Type: string
    required

    Subscription ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for patch/api/billing/v1/subscriptions/{subscriptionId}/auto-renewal/enable
curl /api/billing/v1/subscriptions/Cxy353Uhl1xC54pG6/auto-renewal/enable \
  --request PATCH \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": "Azz36nUfKX1S1MSF",
  "name": "KVM 1",
  "status": "active",
  "billing_period": 1,
  "billing_period_unit": "day",
  "currency_code": "USD",
  "total_price": 1799,
  "renewal_price": 1799,
  "is_auto_renewed": true,
  "created_at": "2025-02-27T11:54:22Z",
  "expires_at": "2025-03-27T11:54:22Z",
  "next_billing_at": "2025-02-28T11:54:22Z"
}

Renew subscription

Create a renewal order for an existing Hostinger subscription.

This endpoint places a renewal order for a single subscription, leveraging the existing billing infrastructure. Use the subscriptions endpoint to look up the subscriptionId values available for renewal.

If no payment method is provided, your default payment method will be used automatically.

Use this endpoint to renew any subscription available in your account.

Path Parameters
  • subscriptionId
    Type: string
    required

    Subscription ID

Body·
application/json
  • coupons
    Type: array

    Discount coupon codes

  • payment_method_id
    Type: integer

    Payment method ID, default will be used if not provided

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/billing/v1/subscriptions/{subscriptionId}/renew
curl /api/billing/v1/subscriptions/Cxy353Uhl1xC54pG6/renew \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "payment_method_id": 1327362,
  "coupons": []
}'
{
  "id": 2957086,
  "subscription_id": "Azz353Uhl1xC54pR0",
  "status": "completed",
  "currency": "USD",
  "subtotal": 899,
  "total": 1088,
  "billing_address": {
    "first_name": "John",
    "last_name": "Doe",
    "company": null,
    "address_1": null,
    "address_2": null,
    "city": null,
    "state": null,
    "zip": null,
    "country": "NL",
    "phone": null,
    "email": "john@doe.tld"
  },
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-27T11:54:22Z"
}

Availability

Check the availability of domain names across multiple TLDs. This category allows you to verify if a specific domain name is available for registration, and to get AI generated name suggestions when the name you wanted is already taken.

Suggest domain names from a description

Suggest available domain names based on a free-text description of your project.

Suggestions are generated by an AI model, so they differ between calls.

Endpoint has rate limit of 90 requests per minute.

Use this endpoint to find a domain name when you only know what the website is about.

Body·
required
application/json
  • description
    Type: string
    min length:  
    2
    max length:  
    1000
    required

    Free-text description of the project the domain is needed for

  • limit
    Type: integer
    required

    Amount of domain names to suggest

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/domains/v1/availability/alternatives-from-description
curl /api/domains/v1/availability/alternatives-from-description \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "description": "A bakery in Vilnius selling sourdough bread and pastries",
  "limit": 10
}'
[
  "mydomain.tld"
]

Suggest domain names from a domain

Suggest available domain names based on a domain name you already have in mind.

Suggestions are generated by an AI model, so they differ between calls.

Endpoint has rate limit of 90 requests per minute.

Use this endpoint when the domain you wanted is taken and you need close alternatives.

Body·
required
application/json
  • domain
    Type: string
    min length:  
    1
    max length:  
    255
    required

    Domain name to base the suggestions on

  • limit
    Type: integer
    required

    Amount of domain names to suggest

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/domains/v1/availability/alternatives-from-domain
curl /api/domains/v1/availability/alternatives-from-domain \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain": "mydomain",
  "limit": 10
}'
[
  "mydomain.tld"
]

Check domain availability

Check availability of domain names across multiple TLDs.

Multiple TLDs can be checked at once. If you want alternative domains with response, provide only one TLD and set with_alternatives to true. TLDs should be provided without leading dot (e.g. com, net, org).

Endpoint has rate limit of 90 requests per minute.

Use this endpoint to verify domain availability before purchase.

Body·
required
application/json
  • domain
    Type: string
    required

    Domain name (without TLD)

  • tlds
    Type: array string[]
    required

    TLDs list

  • with_alternatives
    Type: boolean

    Should response include alternatives

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/domains/v1/availability
curl /api/domains/v1/availability \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain": "mydomain",
  "tlds": [
    "com",
    "net",
    "org"
  ],
  "with_alternatives": true
}'
[
  {
    "domain": "mydomain.tld",
    "is_available": true,
    "is_alternative": false,
    "restriction": null
  }
]

Forwarding

Domain forwarding or redirect is an easy way to direct your website visitors to another site or page, making it simple to maintain your brand and keep your visitors engaged.

Get domain forwarding

Retrieve domain forwarding data.

Use this endpoint to view current redirect configuration for domains.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/forwarding/{domain}
curl /api/domains/v1/forwarding/mydomain.tld \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "domain": "mydomain.tld",
  "redirect_type": "301",
  "redirect_url": "https://forward.to.my.url",
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-27T11:54:22Z"
}

Update domain forwarding

Update domain forwarding configuration.

Use this endpoint to modify existing redirect configuration for domains.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • redirect_type
    Type: string enum
    required

    Redirect type

    values
    • 301

      Permanent

    • 302

      Temporary

  • redirect_url
    Type: string
    required

    URL to forward domain to

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/domains/v1/forwarding/{domain}
curl /api/domains/v1/forwarding/mydomain.tld \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "redirect_type": "301",
  "redirect_url": "https://forward.to.my.url"
}'
{
  "domain": "mydomain.tld",
  "redirect_type": "301",
  "redirect_url": "https://forward.to.my.url",
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-27T11:54:22Z"
}

Delete domain forwarding

Delete domain forwarding data.

Use this endpoint to remove redirect configuration from domains.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/domains/v1/forwarding/{domain}
curl /api/domains/v1/forwarding/mydomain.tld \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Create domain forwarding

Create domain forwarding configuration.

Use this endpoint to set up domain redirects to other URLs.

Body·
required
application/json
  • domain
    Type: string
    required

    Domain name

  • redirect_type
    Type: string enum
    required

    Redirect type

    values
    • 301

      Permanent

    • 302

      Temporary

  • redirect_url
    Type: string
    required

    URL to forward domain to

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/domains/v1/forwarding
curl /api/domains/v1/forwarding \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain": "mydomain.tld",
  "redirect_type": "301",
  "redirect_url": "https://forward.to.my.url"
}'
{
  "domain": "mydomain.tld",
  "redirect_type": "301",
  "redirect_url": "https://forward.to.my.url",
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-27T11:54:22Z"
}

Move

Move domains between Hostinger accounts. This category includes endpoints for initiating and cancelling moves of your own domains to another account, and for accepting or rejecting moves initiated towards your account. A move changes which Hostinger account owns the domain and does not involve a registrar transfer.

Get incoming domain move

Retrieve the incoming move for a specified domain.

Returns 404 when no account is moving this domain to you.

Use this endpoint to check whether a domain addressed to you is still waiting to be accepted.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Query Parameters
  • force_sync
    Type: boolean

    Re-check the move against the registry before responding. Only has an effect while the move is in the activating status.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/move/incoming/{domain}
curl /api/domains/v1/move/incoming/mydomain.tld \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "domain": "mydomain.tld",
  "status": "initiated",
  "created_at": "2026-08-04T10:00:00Z",
  "updated_at": "2026-08-04T10:00:00Z"
}

Accept incoming domain move

Accept an incoming move for a specified domain.

The provided WHOIS profiles become the contacts of the domain, so they must belong to your account and satisfy the requirements of the TLD. Only the contact types the domain actually uses are applied, but all four profile IDs have to be provided.

The move has to still be waiting for your decision, already accepted moves cannot be accepted again.

Accepting does not complete the move. A confirmation email is sent to the email address of the new owner contact, and the domain changes hands only after the change is confirmed from it. Until then the move stays in the activating status, which can be followed with the incoming move endpoint.

Use this endpoint to take ownership of a domain offered to you.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • domain_contacts
    Type: object
    required

    WHOIS profiles of the accepting account. Only the contact types required by the TLD are applied, but all four IDs must be provided.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/domains/v1/move/incoming/{domain}
curl /api/domains/v1/move/incoming/mydomain.tld \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain_contacts": {
    "owner_id": 614698,
    "admin_id": 114698,
    "billing_id": 154698,
    "tech_id": 524248
  }
}'
{
  "message": "Request accepted"
}

Reject incoming domain move

Reject an incoming move for a specified domain.

The domain stays in the account which initiated the move. Moves you have already accepted cannot be rejected anymore.

Use this endpoint to decline a domain you do not want to take over.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/domains/v1/move/incoming/{domain}
curl /api/domains/v1/move/incoming/mydomain.tld \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Get incoming domain move list

Retrieve all domains other Hostinger accounts are moving to your account.

Moves of every status are returned, including the ones which already completed.

Use this endpoint to find domains waiting for you to accept them.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/move/incoming
curl /api/domains/v1/move/incoming \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "domain": "mydomain.tld",
    "status": "initiated",
    "created_at": "2026-08-04T10:00:00Z",
    "updated_at": "2026-08-04T10:00:00Z"
  }
]

Get outgoing domain move

Retrieve the outgoing move for a specified domain.

Returns 404 when the domain has no move in progress.

Use this endpoint to track the status of a move you have initiated for a single domain.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/move/outgoing/{domain}
curl /api/domains/v1/move/outgoing/mydomain.tld \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "domain": "mydomain.tld",
  "status": "initiated",
  "created_at": "2026-08-04T10:00:00Z",
  "updated_at": "2026-08-04T10:00:00Z"
}

Start outgoing domain move

Initiate a move of a specified domain to another Hostinger account.

The receiving account has to already exist and accept the move before the domain changes hands.

The domain must be active. The subscription it belongs to is resolved automatically, and the request is rejected with a 404 status code when the domain has no domain subscription of its own.

Domains protected by premium protection require an additional verification step, such requests are rejected with a 428 status code.

Use this endpoint to hand a domain over to another Hostinger user.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • new_customer_email
    Type: string
    required

    Email address of the Hostinger account receiving the domain

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/domains/v1/move/outgoing/{domain}
curl /api/domains/v1/move/outgoing/mydomain.tld \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "new_customer_email": "new-owner@example.com"
}'
{
  "message": "Request accepted"
}

Cancel outgoing domain move

Cancel an outgoing move for a specified domain.

The move can only be cancelled while the receiving account has not accepted it yet. The domain stays in your account.

Use this endpoint to withdraw a move you no longer want to complete.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/domains/v1/move/outgoing/{domain}
curl /api/domains/v1/move/outgoing/mydomain.tld \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Get outgoing domain move list

Retrieve all domains you are moving to other Hostinger accounts.

Only moves which have not completed yet are returned.

Use this endpoint to track moves you have initiated and the accounts they are addressed to.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/move/outgoing
curl /api/domains/v1/move/outgoing \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "domain": "mydomain.tld",
    "status": "initiated",
    "created_at": "2026-08-04T10:00:00Z",
    "updated_at": "2026-08-04T10:00:00Z"
  }
]

Portfolio

Get domain authorization code

Retrieve the authorization (EPP) code for a specified domain so it can be transferred away from Hostinger to another registrar.

Requesting a new code invalidates any code retrieved previously.

Use this endpoint to obtain the code required to transfer a domain to another registrar.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/portfolio/{domain}/auth-code
curl /api/domains/v1/portfolio/mydomain.tld/auth-code \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "auth_code": "RN0000"
}

Claim free domain

Claim a free domain available on your account and register it.

Unlike purchasing a domain, this consumes a free domain you already have, so no payment method is required.

A successful response means the domain is registered. If registration fails, login to hPanel and check domain registration status.

If no WHOIS information is provided, default contact information for that TLD will be used. Before making request, ensure WHOIS information for desired TLD exists in your account.

Some TLDs require additional_details to be provided and these will be validated before claiming.

Requests which cannot be fulfilled are rejected with an error code in the response body, for example 2037 when no free domain is available.

Use this endpoint to register a domain using a free domain from your account.

Body·
required
application/json
  • domain
    Type: string
    required

    Domain name

  • additional_details
    Type: object

    Additional registration data, possible values depends on TLD

  • domain_contacts
    Type: object

    Domain contact information

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/domains/v1/portfolio/claim
curl /api/domains/v1/portfolio/claim \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain": "my-new-domain.tld",
  "domain_contacts": {
    "owner_id": 741288,
    "admin_id": 546123,
    "billing_id": 741288,
    "tech_id": 741288
  },
  "additional_details": {}
}'
{
  "domain": "mydomain.tld",
  "status": "active",
  "created_at": "2026-08-05T10:14:22Z"
}

Enable domain lock

Enable domain lock for the domain.

When domain lock is enabled, the domain cannot be transferred to another registrar without first disabling the lock.

Use this endpoint to secure domains against unauthorized transfers.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for put/api/domains/v1/portfolio/{domain}/domain-lock
curl /api/domains/v1/portfolio/mydomain.tld/domain-lock \
  --request PUT \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Disable domain lock

Disable domain lock for the domain.

Domain lock needs to be disabled before transferring the domain to another registrar.

Use this endpoint to prepare domains for transfer to other registrars.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/domains/v1/portfolio/{domain}/domain-lock
curl /api/domains/v1/portfolio/mydomain.tld/domain-lock \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Get domain details

Retrieve detailed information for specified domain.

Use this endpoint to view comprehensive domain configuration and status.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/portfolio/{domain}
curl /api/domains/v1/portfolio/mydomain.tld \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "domain": "mydomain.tld",
  "status": "active",
  "message": null,
  "is_privacy_protection_allowed": true,
  "is_privacy_protected": false,
  "is_lockable": true,
  "is_locked": true,
  "name_servers": {
    "ns1": "ns1.example.tld",
    "ns2": "ns2.example.tld"
  },
  "child_name_servers": {
    "ns1.example.tld": [
      "258.231.55.321",
      "258.231.55.322"
    ]
  },
  "domain_contacts": {
    "admin_id": 114698,
    "owner_id": 614698,
    "billing_id": 154698,
    "tech_id": 524248
  },
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-02-27T11:54:22Z",
  "60_days_lock_expires_at": "2025-04-27T11:54:22Z",
  "registered_at": "2025-02-27T12:54:22Z",
  "expires_at": "2025-03-27T11:54:22Z"
}

Get domain list

Retrieve all domains associated with your account.

Use this endpoint to view user's domain portfolio.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/portfolio
curl /api/domains/v1/portfolio \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "id": 13632,
    "domain": "mydomain.tld",
    "type": "domain",
    "status": "active",
    "created_at": "2025-02-27T11:54:22Z",
    "expires_at": "2025-03-27T11:54:22Z"
  }
]

Purchase new domain

Purchase and register a new domain name.

If registration fails, login to hPanel and check domain registration status.

If no payment method is provided, your default payment method will be used automatically.

If no WHOIS information is provided, default contact information for that TLD will be used. Before making request, ensure WHOIS information for desired TLD exists in your account.

Some TLDs require additional_details to be provided and these will be validated before completing purchase.

Use this endpoint to register new domains for users.

Body·
required
application/json
  • domain
    Type: string
    required

    Domain name

  • item_id
    Type: string
    required

    Catalog price item ID

  • additional_details
    Type: object

    Additional registration data, possible values depends on TLD

  • coupons
    Type: array

    Discount coupon codes

  • domain_contacts
    Type: object

    Domain contact information

  • payment_method_id
    Type: integer

    Payment method ID, default will be used if not provided

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/domains/v1/portfolio
curl /api/domains/v1/portfolio \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain": "my-new-domain.tld",
  "item_id": "hostingercom-domain-com-usd-1y",
  "payment_method_id": 1327362,
  "domain_contacts": {
    "owner_id": 741288,
    "admin_id": 546123,
    "billing_id": 741288,
    "tech_id": 741288
  },
  "additional_details": {},
  "coupons": []
}'
{
  "id": 2957086,
  "subscription_id": "Azz353Uhl1xC54pR0",
  "status": "completed",
  "currency": "USD",
  "subtotal": 899,
  "total": 1088,
  "billing_address": {
    "first_name": "John",
    "last_name": "Doe",
    "company": null,
    "address_1": null,
    "address_2": null,
    "city": null,
    "state": null,
    "zip": null,
    "country": "NL",
    "phone": null,
    "email": "john@doe.tld"
  },
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-27T11:54:22Z"
}

Enable privacy protection

Enable privacy protection for the domain.

When privacy protection is enabled, domain owner's personal information is hidden from public WHOIS database.

Use this endpoint to protect domain owner's personal information from public view.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for put/api/domains/v1/portfolio/{domain}/privacy-protection
curl /api/domains/v1/portfolio/mydomain.tld/privacy-protection \
  --request PUT \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Disable privacy protection

Disable privacy protection for the domain.

When privacy protection is disabled, domain owner's personal information is visible in public WHOIS database.

Use this endpoint to make domain owner's information publicly visible.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/domains/v1/portfolio/{domain}/privacy-protection
curl /api/domains/v1/portfolio/mydomain.tld/privacy-protection \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Get domain renewal information

Retrieve renewal information for a specified domain, including its status and current expiration date.

Use this endpoint to build renewal automation and expiry monitoring for a single domain.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/portfolio/{domain}/renewal
curl /api/domains/v1/portfolio/mydomain.tld/renewal \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "domain": "mydomain.tld",
  "status": "Active",
  "expires_at": "2027-05-25 13:53:04"
}

Update domain nameservers

Set nameservers for a specified domain.

Be aware, that improper nameserver configuration can lead to the domain being unresolvable or unavailable.

Use this endpoint to configure custom DNS hosting for domains.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • ns1
    Type: string
    required

    First name server

  • ns2
    Type: string
    required

    Second name server

  • ns3
    Type: string

    Third name server

  • ns4
    Type: string

    Fourth name server

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/domains/v1/portfolio/{domain}/nameservers
curl /api/domains/v1/portfolio/mydomain.tld/nameservers \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "ns1": "ns1.some-nameserver.tld",
  "ns2": "ns2.some-nameserver.tld",
  "ns3": "ns3.some-nameserver.tld",
  "ns4": "ns4.some-nameserver.tld"
}'
{
  "message": "Request accepted"
}

Transfer

Claim free domain transfer

Claim a free domain transfer available on your account and start the transfer.

Unlike purchasing a transfer, this consumes a free domain transfer you already have, so no payment method is required.

Before making request, unlock the domain at the current registrar and get its authorization code. The transfer is validated first, so domains which cannot be transferred are rejected before the free domain transfer is consumed.

A successful response means the transfer has been started. Completion depends on the current registrar and can be followed with the transfer list endpoint.

If no WHOIS information is provided, default contact information for that TLD will be used. Before making request, ensure WHOIS information for desired TLD exists in your account.

Requests which cannot be fulfilled are rejected with an error code in the response body.

Use this endpoint to transfer a domain using a free domain transfer from your account.

Body·
required
application/json
  • auth_code
    Type: string
    required

    Authorization code from the current registrar

  • domain
    Type: string
    required

    Domain name

  • domain_contacts
    Type: object

    Domain contact information

  • should_keep_ns
    Type: boolean

    Keep the existing nameservers of the domain

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/domains/v1/transfers/claim
curl /api/domains/v1/transfers/claim \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain": "my-new-domain.tld",
  "auth_code": "Auth123Code456",
  "domain_contacts": {
    "owner_id": 741288,
    "admin_id": 546123,
    "billing_id": 741288,
    "tech_id": 741288
  },
  "should_keep_ns": true
}'
{
  "domain": "mydomain.tld",
  "status": "Completed",
  "initiated_at": "2026-03-19T08:07:49Z",
  "completed_at": "2026-03-24T08:15:01Z"
}

Get transfer

Retrieve the transfer for a specified domain.

Use this endpoint to track an incoming or outgoing registrar transfer and its status.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/transfers/{domain}
curl /api/domains/v1/transfers/mydomain.tld \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "domain": "mydomain.tld",
  "status": "Completed",
  "initiated_at": "2026-03-19T08:07:49Z",
  "completed_at": "2026-03-24T08:15:01Z"
}

Get transfer list

Retrieve all domain transfers in your portfolio.

Use this endpoint to monitor incoming and outgoing registrar transfers across your domains.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/transfers
curl /api/domains/v1/transfers \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "domain": "mydomain.tld",
    "status": "Completed",
    "initiated_at": "2026-03-19T08:07:49Z",
    "completed_at": "2026-03-24T08:15:01Z"
  }
]

WHOIS

Manage WHOIS contact profiles for your domains. This category includes endpoints for creating, updating, deleting, and retrieving WHOIS profiles. WHOIS profile stores registration data for domain names and is required for domain registration.

Get pending IRTP verification

Retrieve a pending IRTP verification for a domain.

Both the old and new registrant must confirm it before the WHOIS change takes effect.

Use this endpoint to check the status of a WHOIS change awaiting registrant confirmation.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/irtp/{domain}
curl /api/domains/v1/irtp/mydomain.tld \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "domain": "mydomain.tld",
  "status": "pending",
  "old_confirmed_at": "2026-03-19T08:07:49Z",
  "new_confirmed_at": "2026-03-19T08:07:49Z",
  "old_whois_profile_email": "old-registrant@example.com",
  "new_whois_profile_email": "new-registrant@example.com",
  "expires_at": "2026-03-24T08:07:49Z"
}

Cancel pending IRTP verification

Cancel a pending IRTP verification.

Use this endpoint to back out of a WHOIS change that is stuck waiting on registrant confirmation, for example when the confirmation email cannot be received, without waiting out the 5-day expiry.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/domains/v1/irtp/{domain}
curl /api/domains/v1/irtp/mydomain.tld \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Change WHOIS profile for domain

Change WHOIS contact profile for a domain.

Repoints the given contact roles to a new WHOIS profile and submits the change to the registry. The profile currently assigned to those roles is resolved automatically; the request fails if the given roles are not all on the same profile today.

Changing transfer sensitive fields on the owner contact starts an IRTP verification.

The change is processed asynchronously.

Use this endpoint to move a registered domain onto different contact information.

Body·
required
application/json
  • change_for
    Type: array string[] …4enum
    required

    Contact roles to repoint to the new WHOIS profile

    values
    • owner
    • admin
    • billing
    • tech
  • domain
    Type: string
    required

    Domain name

  • new_whois_id
    Type: integer
    required

    WHOIS profile ID to assign to the domain

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/domains/v1/whois/change
curl /api/domains/v1/whois/change \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "new_whois_id": 131502,
  "domain": "mydomain.tld",
  "change_for": [
    "owner",
    "admin"
  ]
}'
{
  "message": "Request accepted"
}

Set WHOIS profile as default

Set WHOIS contact profile as default.

The default profile is pre-selected for the TLD it belongs to when registering new domains.

Use this endpoint to avoid picking contact information for every registration.

Path Parameters
  • whoisId
    Type: integer
    required

    WHOIS ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for put/api/domains/v1/whois/default/{whoisId}
curl /api/domains/v1/whois/default/564651 \
  --request PUT \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Unset default WHOIS profile

Unset WHOIS contact profile as default.

The profile itself is kept, it is only no longer pre-selected for its TLD.

Use this endpoint to stop reusing contact information for new registrations.

Path Parameters
  • whoisId
    Type: integer
    required

    WHOIS ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/domains/v1/whois/default/{whoisId}
curl /api/domains/v1/whois/default/564651 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Get WHOIS profile

Retrieve a WHOIS contact profile.

Use this endpoint to view domain registration contact information.

Path Parameters
  • whoisId
    Type: integer
    required

    WHOIS ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/whois/{whoisId}
curl /api/domains/v1/whois/564651 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 746263,
  "tld": "com",
  "country": "NL",
  "entity_type": "individual",
  "whois_details": {
    "first_name": "John",
    "last_name": "Doe",
    "email": "john@doe.tld"
  },
  "tld_details": {},
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-19T11:54:22Z"
}

Delete WHOIS profile

Delete WHOIS contact profile.

Use this endpoint to remove unused contact profiles from account.

Path Parameters
  • whoisId
    Type: integer
    required

    WHOIS ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/domains/v1/whois/{whoisId}
curl /api/domains/v1/whois/564651 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Get WHOIS profile list

Retrieve WHOIS contact profiles.

Use this endpoint to view available contact profiles for domain registration.

Query Parameters
  • tld
    Type: string

    Filter by TLD (without leading dot)

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/whois
curl /api/domains/v1/whois \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "id": 746263,
    "tld": "com",
    "country": "NL",
    "entity_type": "individual",
    "whois_details": {
      "first_name": "John",
      "last_name": "Doe",
      "email": "john@doe.tld"
    },
    "tld_details": {},
    "created_at": "2025-02-27T11:54:22Z",
    "updated_at": "2025-03-19T11:54:22Z"
  }
]

Create WHOIS profile

Create WHOIS contact profile.

Use this endpoint to add new contact information for domain registration.

Body·
required
application/json
  • country
    Type: string
    required

    ISO 3166 2-letter country code

  • entity_type
    Type: string enum
    required

    Legal entity type

    values
    • individual
    • organization
  • tld
    Type: string
    required

    TLD of the domain (without leading dot)

  • whois_details
    Type: object
    required

    WHOIS details

  • tld_details
    Type: object

    TLD details

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/domains/v1/whois
curl /api/domains/v1/whois \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "tld": "com",
  "country": "NL",
  "entity_type": "individual",
  "tld_details": {},
  "whois_details": {}
}'
{
  "id": 746263,
  "tld": "com",
  "country": "NL",
  "entity_type": "individual",
  "whois_details": {
    "first_name": "John",
    "last_name": "Doe",
    "email": "john@doe.tld"
  },
  "tld_details": {},
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-19T11:54:22Z"
}

Get WHOIS profile usage

Retrieve domain list where provided WHOIS contact profile is used.

Use this endpoint to view which domains use specific contact profiles.

Path Parameters
  • whoisId
    Type: integer
    required

    WHOIS ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/domains/v1/whois/{whoisId}/usage
curl /api/domains/v1/whois/564651/usage \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  "mydomain1.tld",
  "mydomain2.tld"
]

Snapshot

Manage DNS snapshots for your domains. This category includes endpoints for viewing and restoring snapshots of your domain DNS zone. Snapshot is a point-in-time copy of your DNS zone, allowing you to restore your domain's DNS settings to a previous state.

Get DNS snapshot

Retrieve particular DNS snapshot with contents of DNS zone records.

Use this endpoint to view historical DNS configurations for domains.

Path Parameters
  • domain
    Type: string
    required

    Domain name

  • snapshotId
    Type: integer
    required

    Snapshot ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/dns/v1/snapshots/{domain}/{snapshotId}
curl /api/dns/v1/snapshots/mydomain.tld/53513053 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 5341,
  "reason": "Zone records update request",
  "snapshot": [
    {
      "name": "www",
      "records": [
        {
          "content": "mydomain.tld.",
          "is_disabled": false
        }
      ],
      "ttl": 14400,
      "type": "A"
    }
  ],
  "created_at": "2025-02-27T11:54:22Z"
}

Get DNS snapshot list

Retrieve DNS snapshots for a domain.

Use this endpoint to view available DNS backup points for restoration.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/dns/v1/snapshots/{domain}
curl /api/dns/v1/snapshots/mydomain.tld \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "id": 5341,
    "reason": "Zone records update request",
    "created_at": "2025-02-27T11:54:22Z"
  }
]

Restore DNS snapshot

Restore DNS zone to the selected snapshot.

Use this endpoint to revert domain DNS to a previous configuration.

Path Parameters
  • domain
    Type: string
    required

    Domain name

  • snapshotId
    Type: integer
    required

    Snapshot ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/dns/v1/snapshots/{domain}/{snapshotId}/restore
curl /api/dns/v1/snapshots/mydomain.tld/53513053/restore \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Zone

Manage DNS zones and records for your domains. This category includes endpoints for retrieving, updating, deleting DNS zone and it's associated records. The DNS zone will be created once you purchase new domain at Hostinger.

Get DNS records

Retrieve DNS zone records for a specific domain.

Use this endpoint to view current DNS configuration for domain management.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/dns/v1/zones/{domain}
curl /api/dns/v1/zones/mydomain.tld \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "name": "www",
    "records": [
      {
        "content": "mydomain.tld.",
        "is_disabled": false
      }
    ],
    "ttl": 14400,
    "type": "A"
  }
]

Update DNS records

Update DNS records for the selected domain.

Using overwrite = true will replace existing records with the provided ones. Otherwise existing records will be updated and new records will be added.

Use this endpoint to modify domain DNS configuration.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • zone
    Type: array object[]
    required
  • overwrite
    Type: boolean

    If true, resource records (RRs) matching name and type will be deleted and new RRs will be created, otherwise resource records' ttl's are updated and new records are appended. If no matching RRs are found, they are created.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/dns/v1/zones/{domain}
curl /api/dns/v1/zones/mydomain.tld \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "overwrite": true,
  "zone": [
    {
      "name": "www",
      "records": [
        {
          "content": "mydomain.tld."
        }
      ],
      "ttl": 14400,
      "type": "A"
    }
  ]
}'
{
  "message": "Request accepted"
}

Delete DNS records

Delete DNS records for the selected domain.

To filter which records to delete, add the name of the record and type to the filter. Multiple filters can be provided with single request.

If you have multiple records with the same name and type, and you want to delete only part of them, refer to the Update zone records endpoint.

Use this endpoint to remove specific DNS records from domains.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • filters
    Type: array object[]
    required

    Filter records for deletion

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/dns/v1/zones/{domain}
curl /api/dns/v1/zones/mydomain.tld \
  --request DELETE \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "filters": [
    {
      "name": "@",
      "type": "A"
    }
  ]
}'
{
  "message": "Request accepted"
}

Reset DNS records

Reset DNS zone to the default records.

Use this endpoint to restore domain DNS to original configuration.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • reset_email_records
    Type: boolean

    Determines if email records should be reset

  • sync
    Type: boolean

    Determines if operation should be run synchronously

  • whitelisted_record_types
    Type: array string[]

    Specifies which record types to not reset

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/dns/v1/zones/{domain}/reset
curl /api/dns/v1/zones/mydomain.tld/reset \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "sync": true,
  "reset_email_records": true,
  "whitelisted_record_types": [
    "MX",
    "TXT"
  ]
}'
{
  "message": "Request accepted"
}

Validate DNS records

Validate DNS records prior to update for the selected domain.

If the validation is successful, the response will contain 200 Success code. If there is validation error, the response will fail with 422 Validation error code.

Use this endpoint to verify DNS record validity before applying changes.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • zone
    Type: array object[]
    required
  • overwrite
    Type: boolean

    If true, resource records (RRs) matching name and type will be deleted and new RRs will be created, otherwise resource records' ttl's are updated and new records are appended. If no matching RRs are found, they are created.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/dns/v1/zones/{domain}/validate
curl /api/dns/v1/zones/mydomain.tld/validate \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "overwrite": true,
  "zone": [
    {
      "name": "www",
      "records": [
        {
          "content": "mydomain.tld."
        }
      ],
      "ttl": 14400,
      "type": "A"
    }
  ]
}'
{
  "message": "Request accepted"
}

Verifications

Manage domain verifications. This category includes endpoints for retrieving active domain verifications, including verification status, records, and attempt dates. Domain verification allows you to prove ownership of domains through nameserver or TXT record verification methods.

Get domain verifications

Retrieve a list of pending and completed domain verifications.

Body·
required
application/json
  • domains
    Type: array string[]
    required

    The list of domains for which to get verification details for.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/v2/direct/verifications/active
curl /api/v2/direct/verifications/active \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domains": [
    "example.com"
  ]
}'
{
  "data": {
    "PENDING": {
      "pixel.tld": {
        "NAMESERVERS": {
          "records": [
            "ns1.nameserver.com",
            "ns2.nameserver.com"
          ],
          "last_verification_attempt": "2025-08-05 13:15:00",
          "next_verification_attempt": "2025-08-05 14:30:00",
          "verification_expiration": "2025-08-12 13:15:00"
        },
        "TXT": {
          "records": [
            "txt-verification-hash"
          ],
          "last_verification_attempt": "2025-08-05 14:45:00",
          "next_verification_attempt": "2025-08-05 15:00:00",
          "verification_expiration": "2025-08-12 14:45:00"
        }
      }
    },
    "VERIFIED": {
      "byte.tld": {
        "TXT": {
          "records": [
            "other-txt-verification-hash"
          ]
        }
      }
    }
  }
}

Orders

Manage your mail service orders. This category includes endpoints for listing mail orders associated with your account, along with their status, plan, domain, and expiration details.

List orders

Retrieve a paginated list of mail orders associated with your account.

Use this endpoint to monitor your mail services, including their status, plan, attached domain, and expiration details.

Query Parameters
  • domain
    Type: string | null

    Filter orders by domain name (exact match)

  • status
    Type: string | null enum

    Filter orders by status

    values
    • pending_setup
    • active
    • suspended
  • is_trial
    Type: boolean | null

    Filter orders by trial state

  • sort
    Type: string | null enum

    Sort orders by field. Prefix with - for descending order.

    values
    • created_at
    • -created_at
    • expires_at
    • -expires_at
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders
curl /api/mail/v1/orders \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "OR1a2b3c4d5e6f7g",
      "status": "active",
      "is_trial": false,
      "seats": 5,
      "domain": {
        "id": "DO1a2b3c4d5e6f7g",
        "name": "example.com"
      },
      "plan": {
        "name": "hostinger_free",
        "title": "Free Email"
      },
      "has_pending_upgrade": false,
      "created_at": "2025-02-27T11:54:22Z",
      "expires_at": "2026-02-27T11:54:22Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Get order plan

Retrieve the plan the given mail order was purchased with, including domain-level and mailbox-level quotas, limits, and protocol availability.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/plan
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/plan \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "name": "hostinger_free",
  "title": "Free Email",
  "domain": {
    "mailbox_quota": 1,
    "forwarder_quota": 10,
    "alias_quota": 5,
    "is_catchall_enabled": true,
    "is_imap_enabled": true,
    "is_pop3_enabled": true
  },
  "mailbox": {
    "storage_quota": 10240,
    "messages_quota": 10000,
    "forwarder_quota": 10,
    "alias_quota": 5,
    "max_outbound_message_size": 25000000,
    "max_outbound_attachment_size": 20000000,
    "max_outbound_recipient_limit": 50,
    "rate_limit_inbound": "100/86400",
    "rate_limit_outbound": "100/86400"
  }
}

Mailboxes

Manage mailboxes of your mail orders. This category includes endpoints for listing mailboxes with their status, enabled protocols, attached resource counts, and usage numbers.

List mailboxes

Retrieve a paginated list of mailboxes belonging to a mail order.

Use this endpoint to monitor mailboxes of your mail service, including their status, enabled protocols, attached resource counts, and periodically synced usage numbers (usage may lag behind live values).

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Query Parameters
  • search
    Type: string | null
    max length:  
    255

    Filter mailboxes whose email address contains the given string

  • sort
    Type: string | null enum

    Sort mailboxes by field. Prefix with - for descending order.

    values
    • address
    • -address
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/mailboxes
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/mailboxes \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "AC1a2b3c4d5e6f7g",
      "address": "info@example.com",
      "status": "active",
      "status_reason": "abuse",
      "protocols": {
        "is_imap_enabled": true,
        "is_pop3_enabled": true,
        "is_smtp_in_enabled": true,
        "is_smtp_out_enabled": true
      },
      "counts": {
        "forwarders": 2,
        "aliases": 1,
        "autoreplies": 0
      },
      "is_catchall": false,
      "usage": {
        "storage_used": 512000,
        "storage_quota": 10485760,
        "messages_used": 1240,
        "messages_quota": 50000,
        "synced_at": "2026-07-22T08:12:00Z"
      },
      "created_at": "2025-03-01T10:00:00Z",
      "updated_at": "2026-07-20T14:30:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create mailbox

Create a mailbox under the given mail order. The full email address is composed from the given local part and the domain of the order.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Body·
required
application/json
  • local_part
    Type: string
    max length:  
    50
    Pattern: ^(?=[a-z0-9])(?=.*[a-z0-9]$)[a-z0-9_-]+(?:\.[a-z0-9_-]+)*$
    required

    Local part of the mailbox address (the part before the @). The domain is taken from the order. Must start and end with a letter or digit; single dots, underscores and hyphens are allowed in between.

  • password
    Type: string
    min length:  
    8
    max length:  
    50
    Format: password
    required

    Mailbox password. Minimum 8 characters with uppercase, lowercase, number and special character.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/mail/v1/orders/{orderId}/mailboxes
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/mailboxes \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "local_part": "john.doe",
  "password": "SecurePassword123!"
}'
{
  "id": "AC1a2b3c4d5e6f7g",
  "address": "info@example.com",
  "status": "active",
  "status_reason": "abuse",
  "protocols": {
    "is_imap_enabled": true,
    "is_pop3_enabled": true,
    "is_smtp_in_enabled": true,
    "is_smtp_out_enabled": true
  },
  "counts": {
    "forwarders": 2,
    "aliases": 1,
    "autoreplies": 0
  },
  "is_catchall": false,
  "usage": {
    "storage_used": 512000,
    "storage_quota": 10485760,
    "messages_used": 1240,
    "messages_quota": 50000,
    "synced_at": "2026-07-22T08:12:00Z"
  },
  "created_at": "2025-03-01T10:00:00Z",
  "updated_at": "2026-07-20T14:30:00Z"
}

Delete mailbox

Delete a mailbox. The mailbox is soft-deleted and stays restorable for a limited period before it is permanently removed.

Path Parameters
  • mailboxId
    Type: string
    required

    Mailbox resource ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/mail/v1/mailboxes/{mailboxId}
curl /api/mail/v1/mailboxes/AC1a2b3c4d5e6f7g \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Change mailbox password

Change the password of a mailbox.

Path Parameters
  • mailboxId
    Type: string
    required

    Mailbox resource ID

Body·
required
application/json
  • password
    Type: string
    min length:  
    8
    max length:  
    50
    Format: password
    required

    New mailbox password. Minimum 8 characters with uppercase, lowercase, number and special character; must not be a commonly used password.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/mail/v1/mailboxes/{mailboxId}/password
curl /api/mail/v1/mailboxes/AC1a2b3c4d5e6f7g/password \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "password": "SecurePassword123!"
}'
{
  "message": "Request accepted"
}

Aliases

Manage aliases of your mailboxes. An alias is an additional email address that delivers incoming messages to an existing mailbox. This category includes endpoints for creating, listing, and deleting aliases.

Create alias

Create an alias for the given mailbox. The alias address is formed from the given local part and the domain of the mailbox. Messages sent to the alias are delivered to the mailbox.

Path Parameters
  • mailboxId
    Type: string
    required

    Mailbox resource ID

Body·
required
application/json
  • local_part
    Type: string
    max length:  
    50
    required

    Local part of the alias address (the part before the @). The domain is taken from the mailbox. Case-insensitive and stored lowercase; must start and end with a letter or digit; single dots, underscores and hyphens are allowed in between.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/mail/v1/mailboxes/{mailboxId}/aliases
curl /api/mail/v1/mailboxes/AC1a2b3c4d5e6f7g/aliases \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "local_part": "info"
}'
{
  "id": "AA1a2b3c4d5e6f7g",
  "address": "info@example.com",
  "mailbox": {
    "id": "AC1a2b3c4d5e6f7g",
    "address": "john@example.com"
  },
  "is_active": true,
  "created_at": "2026-07-27T12:00:00Z",
  "updated_at": "2026-07-27T12:00:00Z"
}

Delete alias

Delete an alias. Messages sent to the alias address are no longer delivered to the mailbox.

Path Parameters
  • aliasId
    Type: string
    required

    Alias resource ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/mail/v1/aliases/{aliasId}
curl /api/mail/v1/aliases/AA1a2b3c4d5e6f7g \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

List aliases

Retrieve a paginated list of aliases across all mailboxes of a mail order.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/aliases
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/aliases \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "AA1a2b3c4d5e6f7g",
      "address": "info@example.com",
      "mailbox": {
        "id": "AC1a2b3c4d5e6f7g",
        "address": "john@example.com"
      },
      "is_active": true,
      "created_at": "2026-07-27T12:00:00Z",
      "updated_at": "2026-07-27T12:00:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Autoreplies

Manage automatic replies of your mailboxes. This category includes endpoints for creating, updating, listing, and deleting autoreplies such as out-of-office messages. A mailbox can have one autoreply.

Create autoreply

Create an automatic reply for the given mailbox. A mailbox can have only one autoreply. Omit starts_at to activate the autoreply immediately and omit ends_at to keep it active indefinitely.

Path Parameters
  • mailboxId
    Type: string
    required

    Mailbox resource ID

Body·
required
application/json
  • body
    Type: string
    required

    Body of the automatic reply

  • subject
    Type: string
    required

    Subject of the automatic reply

  • display_name
    Type: string | null
    max length:  
    255

    Sender display name used for the reply

  • ends_at
    Type: string | null Format: date-time

    When the autoreply stops. Omit for an indefinite autoreply.

  • starts_at
    Type: string | null Format: date-time

    When the autoreply becomes active. Defaults to now.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/mail/v1/mailboxes/{mailboxId}/autoreplies
curl /api/mail/v1/mailboxes/AC1a2b3c4d5e6f7g/autoreplies \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "subject": "Out of office",
  "body": "I am on vacation until August 1st.",
  "display_name": "John Doe",
  "starts_at": "2026-08-01T00:00:00Z",
  "ends_at": "2026-09-01T00:00:00Z"
}'
{
  "id": "AR1a2b3c4d5e6f7g",
  "mailbox": {
    "id": "AC1a2b3c4d5e6f7g",
    "address": "user@example.com"
  },
  "subject": "Out of office",
  "body": "I am on vacation until August 1st.",
  "display_name": "John Doe",
  "starts_at": "2026-08-01T00:00:00Z",
  "ends_at": "2026-09-01T00:00:00Z",
  "created_at": "2026-07-24T12:00:00Z",
  "updated_at": "2026-07-24T12:00:00Z"
}

Update autoreply

Replace the autoreply with the given content and schedule. Omitted optional fields are cleared: omit starts_at to activate the autoreply immediately and omit ends_at to keep it active indefinitely.

Path Parameters
  • autoreplyId
    Type: string
    required

    Autoreply resource ID

Body·
required
application/json
  • body
    Type: string
    required

    Body of the automatic reply

  • subject
    Type: string
    required

    Subject of the automatic reply

  • display_name
    Type: string | null
    max length:  
    255

    Sender display name used for the reply

  • ends_at
    Type: string | null Format: date-time

    When the autoreply stops. Omit for an indefinite autoreply.

  • starts_at
    Type: string | null Format: date-time

    When the autoreply becomes active. Defaults to now.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/mail/v1/autoreplies/{autoreplyId}
curl /api/mail/v1/autoreplies/AR1a2b3c4d5e6f7g \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "subject": "Out of office",
  "body": "I am on vacation until August 1st.",
  "display_name": "John Doe",
  "starts_at": "2026-08-01T00:00:00Z",
  "ends_at": "2026-09-01T00:00:00Z"
}'
{
  "id": "AR1a2b3c4d5e6f7g",
  "mailbox": {
    "id": "AC1a2b3c4d5e6f7g",
    "address": "user@example.com"
  },
  "subject": "Out of office",
  "body": "I am on vacation until August 1st.",
  "display_name": "John Doe",
  "starts_at": "2026-08-01T00:00:00Z",
  "ends_at": "2026-09-01T00:00:00Z",
  "created_at": "2026-07-24T12:00:00Z",
  "updated_at": "2026-07-24T12:00:00Z"
}

Delete autoreply

Delete the autoreply of a mailbox. The mailbox stops sending automatic replies immediately.

Path Parameters
  • autoreplyId
    Type: string
    required

    Autoreply resource ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/mail/v1/autoreplies/{autoreplyId}
curl /api/mail/v1/autoreplies/AR1a2b3c4d5e6f7g \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

List autoreplies

Retrieve a paginated list of autoreplies across all mailboxes of a mail order.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/autoreplies
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/autoreplies \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "AR1a2b3c4d5e6f7g",
      "mailbox": {
        "id": "AC1a2b3c4d5e6f7g",
        "address": "user@example.com"
      },
      "subject": "Out of office",
      "body": "I am on vacation until August 1st.",
      "display_name": "John Doe",
      "starts_at": "2026-08-01T00:00:00Z",
      "ends_at": "2026-09-01T00:00:00Z",
      "created_at": "2026-07-24T12:00:00Z",
      "updated_at": "2026-07-24T12:00:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Forwarders

Manage forwarders of your mailboxes. This category includes endpoints for creating, listing, and deleting forwarders that redirect incoming messages to another email address. The destination address must confirm the forwarding before it becomes active.

Create forwarder

Create a forwarder from the given mailbox to the destination address. The destination receives a confirmation email and forwarding becomes active only after it is confirmed.

Path Parameters
  • mailboxId
    Type: string
    required

    Mailbox resource ID

Body·
required
application/json
  • destination
    Type: string
    required

    Email address the messages will be forwarded to

  • is_keep_copy_enabled
    Type: boolean

    Whether to keep a copy of forwarded messages in the mailbox. Defaults to false.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/mail/v1/mailboxes/{mailboxId}/forwarders
curl /api/mail/v1/mailboxes/AC1a2b3c4d5e6f7g/forwarders \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "destination": "jane@example.org",
  "is_keep_copy_enabled": false
}'
{
  "id": "FW1a2b3c4d5e6f7g",
  "mailbox": {
    "id": "AC1a2b3c4d5e6f7g",
    "address": "user@example.com"
  },
  "destination": "jane@example.org",
  "is_keep_copy_enabled": true,
  "is_active": true,
  "is_confirmed": true,
  "created_at": "2026-07-24T12:00:00Z",
  "updated_at": "2026-07-24T12:00:00Z"
}

Delete forwarder

Delete a forwarder. The mailbox stops forwarding messages to the destination address immediately.

Path Parameters
  • forwarderId
    Type: string
    required

    Forwarder resource ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/mail/v1/forwarders/{forwarderId}
curl /api/mail/v1/forwarders/FW1a2b3c4d5e6f7g \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

List forwarders

Retrieve a paginated list of forwarders across all mailboxes of a mail order.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/forwarders
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/forwarders \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "FW1a2b3c4d5e6f7g",
      "mailbox": {
        "id": "AC1a2b3c4d5e6f7g",
        "address": "user@example.com"
      },
      "destination": "jane@example.org",
      "is_keep_copy_enabled": true,
      "is_active": true,
      "is_confirmed": true,
      "created_at": "2026-07-24T12:00:00Z",
      "updated_at": "2026-07-24T12:00:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Resend forwarder confirmation

Resend the confirmation email to the destination address of an unconfirmed forwarder.

Path Parameters
  • forwarderId
    Type: string
    required

    Forwarder resource ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/mail/v1/forwarders/{forwarderId}/confirmation/resend
curl /api/mail/v1/forwarders/FW1a2b3c4d5e6f7g/confirmation/resend \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Update forwarder keep-copy setting

Enable or disable keeping a copy of forwarded messages in the mailbox.

Path Parameters
  • forwarderId
    Type: string
    required

    Forwarder resource ID

Body·
required
application/json
  • is_keep_copy_enabled
    Type: boolean
    required

    Whether to keep a copy of forwarded messages in the mailbox

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/mail/v1/forwarders/{forwarderId}/keep-copy
curl /api/mail/v1/forwarders/FW1a2b3c4d5e6f7g/keep-copy \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "is_keep_copy_enabled": true
}'
{
  "message": "Request accepted"
}

Catchalls

Manage catch-alls of your domains. A catch-all routes all messages sent to unknown addresses of a domain to a designated mailbox. The mailbox address must confirm the catch-all before it becomes active.

Create catch-all

Create a catch-all that routes all messages sent to unknown addresses of the domain to the given mailbox. The mailbox address receives a confirmation email and the catch-all becomes active only after it is confirmed. A domain can have only one catch-all.

Path Parameters
  • mailboxId
    Type: string
    required

    Mailbox resource ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/mail/v1/mailboxes/{mailboxId}/catchalls
curl /api/mail/v1/mailboxes/AC1a2b3c4d5e6f7g/catchalls \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": "CA1a2b3c4d5e6f7g",
  "mailbox": {
    "id": "AC1a2b3c4d5e6f7g",
    "address": "user@example.com"
  },
  "domain": "example.com",
  "is_active": true,
  "is_confirmed": true,
  "created_at": "2026-07-27T12:00:00Z",
  "updated_at": "2026-07-27T12:00:00Z"
}

Delete catch-all

Delete a catch-all. Messages sent to unknown addresses of the domain are no longer routed to the mailbox.

Path Parameters
  • catchallId
    Type: string
    required

    Catch-all resource ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/mail/v1/catchalls/{catchallId}
curl /api/mail/v1/catchalls/CA1a2b3c4d5e6f7g \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

List catch-alls

Retrieve a paginated list of catch-alls across all mailboxes of a mail order.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/catchalls
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/catchalls \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "CA1a2b3c4d5e6f7g",
      "mailbox": {
        "id": "AC1a2b3c4d5e6f7g",
        "address": "user@example.com"
      },
      "domain": "example.com",
      "is_active": true,
      "is_confirmed": true,
      "created_at": "2026-07-27T12:00:00Z",
      "updated_at": "2026-07-27T12:00:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Resend catch-all confirmation

Resend the confirmation email to the mailbox address of an unconfirmed catch-all.

Path Parameters
  • catchallId
    Type: string
    required

    Catch-all resource ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/mail/v1/catchalls/{catchallId}/confirmation/resend
curl /api/mail/v1/catchalls/CA1a2b3c4d5e6f7g/confirmation/resend \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Webhooks

Create webhook

Create a webhook for the given mailbox. The generated secret is returned only in this response and is sent as a bearer token with every delivery.

Path Parameters
  • mailboxId
    Type: string
    required

    Mailbox resource ID

Body·
required
application/json
  • events
    Type: array string[] enum
    const:  
    message.received
    required

    Events that trigger this webhook

    values
    • message.received
  • name
    Type: string
    max length:  
    255
    required

    Human-readable name for this webhook

  • url
    Type: string
    max length:  
    2048
    required

    Publicly reachable URL that receives the webhook POST requests

  • description
    Type: string | null

    Optional description of the webhook's purpose

  • status
    Type: string enum

    Initial status of the webhook

    values
    • active
    • disabled
    • paused
Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/mail/v1/mailboxes/{mailboxId}/webhooks
curl /api/mail/v1/mailboxes/AC1a2b3c4d5e6f7g/webhooks \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "New message notifier",
  "description": "Notifies our CRM when a new email arrives",
  "events": [
    "message.received"
  ],
  "status": "active",
  "url": "https://example.com/webhooks/incoming"
}'
{
  "id": "019683f8-1234-7abc-8def-0123456789ab",
  "mailbox": {
    "id": "AC1a2b3c4d5e6f7g",
    "address": "user@example.com"
  },
  "name": "New message notifier",
  "description": "Notifies our CRM when a new email arrives",
  "events": [
    "message.received"
  ],
  "status": "active",
  "url": "https://example.com/webhooks/incoming",
  "secret": "4a6f8b2d1e9c3f7a0b5d8e2c4f1a7b3d9e6c2f8a1b4d7e0c3f6a9b2d5e8c1f4",
  "created_at": "2026-07-23T12:00:00Z",
  "updated_at": "2026-07-23T12:00:00Z"
}

List webhook delivery logs

Retrieve a paginated list of webhook delivery logs for the given mail order, including delivery outcome, duration, and retry counts. Supports filtering by mailbox.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Query Parameters
  • mailbox_id
    Type: string | null

    Filter by the mailbox resource ID the webhooks are attached to

  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/webhooks/delivery-logs
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/webhooks/delivery-logs \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "created_at": "2026-07-23T12:00:00Z",
      "mailbox_address": "user@example.com",
      "webhook_url": "https://example.com/webhooks/incoming",
      "is_successful": true,
      "duration": 42,
      "retry_count": 1,
      "max_retry_count": 5
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Get webhook

Retrieve the details of a single webhook. The webhook secret is never included; it is returned only when a webhook is created or its secret is regenerated.

Path Parameters
  • webhookId
    Type: string
    required

    Webhook ID (returned when the webhook was created)

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/webhooks/{webhookId}
curl /api/mail/v1/webhooks/019683f8-1234-7abc-8def-0123456789ab \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": "019683f8-1234-7abc-8def-0123456789ab",
  "mailbox": {
    "id": "AC1a2b3c4d5e6f7g",
    "address": "user@example.com"
  },
  "name": "New message notifier",
  "description": "Notifies our CRM when a new email arrives",
  "events": [
    "message.received"
  ],
  "status": "active",
  "url": "https://example.com/webhooks/incoming",
  "created_at": "2026-07-23T12:00:00Z",
  "updated_at": "2026-07-23T12:00:00Z"
}

Delete webhook

Permanently delete a webhook. This action cannot be undone. After deletion the URL no longer receives event notifications.

Path Parameters
  • webhookId
    Type: string
    required

    Webhook ID (returned when the webhook was created)

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/mail/v1/webhooks/{webhookId}
curl /api/mail/v1/webhooks/019683f8-1234-7abc-8def-0123456789ab \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Update webhook

Partially update a webhook. Only the fields included in the request body are changed; omitted fields retain their current values. Pass "description": null to clear the description.

Path Parameters
  • webhookId
    Type: string
    required

    Webhook ID (returned when the webhook was created)

Body·
required
application/json

Fields to update. All fields are optional; only provided fields are changed. Pass "description": null to clear the description.

  • description
    Type: string | null

    New description, or null to clear it

  • events
    Type: array string[] enum
    const:  
    message.received

    Replaces the full list of subscribed events

    values
    • message.received
  • name
    Type: string
    max length:  
    255

    New human-readable name for the webhook

  • status
    Type: string enum

    New status for the webhook

    values
    • active
    • disabled
    • paused
  • url
    Type: string
    max length:  
    2048

    New URL to deliver events to

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/mail/v1/webhooks/{webhookId}
curl /api/mail/v1/webhooks/019683f8-1234-7abc-8def-0123456789ab \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "Updated notifier",
  "description": "Now also handles newsletters",
  "events": [
    "message.received"
  ],
  "status": "paused",
  "url": "https://example.com/webhooks/incoming"
}'
{
  "id": "019683f8-1234-7abc-8def-0123456789ab",
  "mailbox": {
    "id": "AC1a2b3c4d5e6f7g",
    "address": "user@example.com"
  },
  "name": "New message notifier",
  "description": "Notifies our CRM when a new email arrives",
  "events": [
    "message.received"
  ],
  "status": "active",
  "url": "https://example.com/webhooks/incoming",
  "created_at": "2026-07-23T12:00:00Z",
  "updated_at": "2026-07-23T12:00:00Z"
}

List webhooks

Retrieve a paginated list of webhooks belonging to the given mail order. Supports filtering by mailbox and status. The webhook secret is never included; it is returned only when a webhook is created or its secret is regenerated.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Query Parameters
  • mailbox_id
    Type: string | null

    Filter by the mailbox resource ID the webhooks are attached to

  • status
    Type: string | null enum

    Filter webhooks by status

    values
    • active
    • disabled
    • paused
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/webhooks
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/webhooks \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "019683f8-1234-7abc-8def-0123456789ab",
      "mailbox": {
        "id": "AC1a2b3c4d5e6f7g",
        "address": "user@example.com"
      },
      "name": "New message notifier",
      "description": "Notifies our CRM when a new email arrives",
      "events": [
        "message.received"
      ],
      "status": "active",
      "url": "https://example.com/webhooks/incoming",
      "created_at": "2026-07-23T12:00:00Z",
      "updated_at": "2026-07-23T12:00:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Regenerate webhook secret

Regenerate the secret of a webhook. The previous secret is immediately invalidated. The new secret is returned only in this response and is sent as a bearer token with every delivery.

Path Parameters
  • webhookId
    Type: string
    required

    Webhook ID (returned when the webhook was created)

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/mail/v1/webhooks/{webhookId}/regenerate-secret
curl /api/mail/v1/webhooks/019683f8-1234-7abc-8def-0123456789ab/regenerate-secret \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": "019683f8-1234-7abc-8def-0123456789ab",
  "mailbox": {
    "id": "AC1a2b3c4d5e6f7g",
    "address": "user@example.com"
  },
  "name": "New message notifier",
  "description": "Notifies our CRM when a new email arrives",
  "events": [
    "message.received"
  ],
  "status": "active",
  "url": "https://example.com/webhooks/incoming",
  "secret": "4a6f8b2d1e9c3f7a0b5d8e2c4f1a7b3d9e6c2f8a1b4d7e0c3f6a9b2d5e8c1f4",
  "created_at": "2026-07-23T12:00:00Z",
  "updated_at": "2026-07-23T12:00:00Z"
}

Test webhook

Send a test delivery to the webhook URL and return the result. Test requests are rate limited upstream.

Path Parameters
  • webhookId
    Type: string
    required

    Webhook ID (returned when the webhook was created)

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/mail/v1/webhooks/{webhookId}/test
curl /api/mail/v1/webhooks/019683f8-1234-7abc-8def-0123456789ab/test \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "http_status": 200,
  "is_successful": true,
  "error": "Something bad happened"
}

API Tokens

Manage API tokens for the Hostinger Email API. Tokens are scoped to mailboxes of a mail order and grant access to mailbox provisioning and management through the Email API.

Create API token

Create an API token for the given mail order. The token grants access to the Hostinger Email API, where you can provision and manage the mailboxes it is scoped to.

The plaintext token is returned only in this response, never again. A maximum of 10 tokens can exist per order. Use scope.has_all_mailboxes to cover all current and future mailboxes, or list specific mailboxes in scope.mailbox_ids.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Body·
required
application/json
  • name
    Type: string
    max length:  
    255
    required

    Human-readable label for this token

  • scope
    Type: object
    required

    Mailbox scope this token can access

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/mail/v1/orders/{orderId}/api-tokens
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/api-tokens \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "CRM integration",
  "scope": {
    "has_all_mailboxes": false,
    "mailbox_ids": [
      "AC1a2b3c4d5e6f7g"
    ]
  }
}'
{
  "id": "019683f8-1234-7abc-8def-0123456789ab",
  "token": "4a6f8b2d1e9c3f7a0b5d8e2c4f1a7b3d9e6c2f8a1b4d7e0c3f6a9b2d5e8c1f4a",
  "name": "CRM integration",
  "scope": {
    "has_all_mailboxes": false,
    "mailboxes": [
      {
        "id": "AC1a2b3c4d5e6f7g",
        "address": "user@example.com"
      }
    ]
  },
  "created_at": "2026-05-05T12:00:00Z",
  "type": "api_token"
}

Revoke API token

Revoke an API token. The token immediately loses access to the Hostinger Email API. This action cannot be undone.

Path Parameters
  • tokenId
    Type: string
    required

    API token ID (returned when the token was created)

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/mail/v1/api-tokens/{tokenId}
curl /api/mail/v1/api-tokens/019683f8-1234-7abc-8def-0123456789ab \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

List API tokens

Retrieve a paginated list of Hostinger Email API tokens across all your mail orders, optionally filtered by order. Plaintext tokens are never included; they are returned only when a token is created.

Query Parameters
  • order_id
    Type: string | null

    Filter tokens by order resource ID. Single value or comma-separated list.

  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/api-tokens
curl /api/mail/v1/api-tokens \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "019683f8-1234-7abc-8def-0123456789ab",
      "order_id": "OR1a2b3c4d5e6f7g",
      "name": "CRM integration",
      "scope": {
        "has_all_mailboxes": false,
        "mailboxes": [
          {
            "id": "AC1a2b3c4d5e6f7g",
            "address": "user@example.com"
          }
        ]
      },
      "created_at": "2026-05-05T12:00:00Z",
      "last_used_at": "2026-05-15T08:30:00Z",
      "type": "api_token"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Logs

Inspect activity logs of your mail orders. This category includes endpoints for access logs, inbound and outbound delivery logs, mailbox action logs, and account action logs.

List access logs

Retrieve paginated access logs for the domain attached to the given mail order. Supports filtering by account, date range, protocol, status, and deletion flag. Results are sorted by timestamp descending.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Query Parameters
  • account
    Type: string | null Format: email

    Filter log entries by a specific email account

  • date
    Type: string | null Format: date

    Exact date filter (YYYY-MM-DD). Takes precedence over from_date/to_date when both are given.

  • from_date
    Type: string | null Format: date-time

    Date range start (RFC 3339)

  • to_date
    Type: string | null Format: date-time

    Date range end (RFC 3339)

  • status
    Type: string | null enum

    Filter log entries by status

    values
    • Successful
    • Failed
  • protocol
    Type: string | null enum

    Filter access log entries by protocol

    values
    • imap
    • pop3
    • smtp
  • has_deletions
    Type: boolean | null

    Filter access log entries by whether the session had deletions

  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/logs/access
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/logs/access \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "account": "user@example.com",
      "domain": "example.com",
      "session": "nVpwr1XahpcqAkeAAAQAAJjSnW8aYxyM",
      "protocol": "imap",
      "remote_ip": "192.168.0.1",
      "login_time": "2026-03-16T13:13:54Z",
      "in": 421,
      "out": 9381,
      "deleted": 0,
      "expunged": 0,
      "trashed": 0,
      "logout_time": "2026-03-16T13:13:55Z",
      "timestamp": "2026-03-16T13:13:55Z",
      "app_name": "com.google.android.gm",
      "has_deletions": false,
      "result": "ok",
      "status": "Access",
      "is_important": false
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

List action logs

Retrieve paginated account action logs (administrative and user actions) for the given mail order. Supports filtering by account, date range, and status. Results are sorted by timestamp descending.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Query Parameters
  • account
    Type: string | null Format: email

    Filter log entries by a specific email account

  • date
    Type: string | null Format: date

    Exact date filter (YYYY-MM-DD). Takes precedence over from_date/to_date when both are given.

  • from_date
    Type: string | null Format: date-time

    Date range start (RFC 3339)

  • to_date
    Type: string | null Format: date-time

    Date range end (RFC 3339)

  • status
    Type: string | null enum

    Filter log entries by status

    values
    • Successful
    • Failed
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/logs/action
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/logs/action \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "action": "Account created",
      "extra": null,
      "created_at": "2026-03-16T12:11:34Z",
      "ip_address": "127.0.0.1",
      "role": "user",
      "action_context": "example.com",
      "response_status": "OK"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

List inbound logs

Retrieve paginated inbound (received mail) delivery logs for the domain attached to the given mail order. Supports filtering by account, date range, status, sender, and recipient. Results are sorted by timestamp descending.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Query Parameters
  • account
    Type: string | null Format: email

    Filter log entries by a specific email account

  • date
    Type: string | null Format: date

    Exact date filter (YYYY-MM-DD). Takes precedence over from_date/to_date when both are given.

  • from_date
    Type: string | null Format: date-time

    Date range start (RFC 3339)

  • to_date
    Type: string | null Format: date-time

    Date range end (RFC 3339)

  • status
    Type: string | null enum

    Filter log entries by status

    values
    • Successful
    • Failed
  • sender
    Type: string | null

    Filter log entries by sender. Accepts a full email address or a domain.

  • recipient
    Type: string | null

    Filter log entries by recipient. Accepts a full email address or a domain.

  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/logs/inbound
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/logs/inbound \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "account": "user@example.com",
      "rcpt": "recipient@example.com",
      "rcpts": "recipient@example.com",
      "client_ip": "192.168.0.1",
      "from": "user@example.com",
      "nrcpt": "1",
      "timestamp": "2026-03-16T13:13:55Z",
      "relay_events": [
        {
          "address_to": "user@example.com",
          "relay": "server.example.com[192.168.0.1]:587",
          "delay": "3.1",
          "dsn": "2.0.0",
          "status": "Sent",
          "response": "250 2.0.0 Ok: queued as 6153112091D",
          "time": "2026-03-16T13:13:55Z"
        }
      ],
      "status": "Delivered",
      "is_spam": false
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

List mailbox action logs

Retrieve paginated mailbox action logs (message and mailbox events) for a mailbox in the given mail order. The mailbox email must belong to the order's domain. Supports date range and event type filters. Results are sorted by timestamp descending.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Query Parameters
  • email
    Type: string Format: email
    required

    Mailbox email address. Must belong to the order's domain.

  • date
    Type: string | null Format: date

    Exact date filter (YYYY-MM-DD). Takes precedence over from_date/to_date when both are given.

  • from_date
    Type: string | null Format: date-time

    Date range start (RFC 3339)

  • to_date
    Type: string | null Format: date-time

    Date range end (RFC 3339)

  • event
    Type: string | null enum

    Filter mailbox action log entries by event type

    values
    • MessageNew
    • MessageRead
    • MessageAppend
    • MessageExpunge
    • MailboxCreate
    • MailboxDelete
    • MailboxRename
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/logs/mailbox-actions
curl '/api/mail/v1/orders/OR1a2b3c4d5e6f7g/logs/mailbox-actions?email=user%40example.com' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "folder": "INBOX.Sent",
      "time": 1773906125,
      "event": "MessageNew",
      "mailbox": "user@example.com",
      "hostname": "de-fra-mailstorage71.hostinger.io",
      "timestamp": "2026-03-16T13:13:55Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

List outbound logs

Retrieve paginated outbound (sent mail) delivery logs for the domain attached to the given mail order. Supports filtering by account, date range, status, sender, and recipient. Results are sorted by timestamp descending.

Path Parameters
  • orderId
    Type: string
    required

    Order resource ID

Query Parameters
  • account
    Type: string | null Format: email

    Filter log entries by a specific email account

  • date
    Type: string | null Format: date

    Exact date filter (YYYY-MM-DD). Takes precedence over from_date/to_date when both are given.

  • from_date
    Type: string | null Format: date-time

    Date range start (RFC 3339)

  • to_date
    Type: string | null Format: date-time

    Date range end (RFC 3339)

  • status
    Type: string | null enum

    Filter log entries by status

    values
    • Successful
    • Failed
  • sender
    Type: string | null

    Filter log entries by sender. Accepts a full email address or a domain.

  • recipient
    Type: string | null

    Filter log entries by recipient. Accepts a full email address or a domain.

  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/mail/v1/orders/{orderId}/logs/outbound
curl /api/mail/v1/orders/OR1a2b3c4d5e6f7g/logs/outbound \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "account": "user@example.com",
      "rcpt": "recipient@example.com",
      "rcpts": "recipient@example.com",
      "client_ip": "192.168.0.1",
      "from": "user@example.com",
      "nrcpt": "1",
      "timestamp": "2026-03-16T13:13:55Z",
      "relay_events": [
        {
          "address_to": "user@example.com",
          "relay": "server.example.com[192.168.0.1]:587",
          "delay": "3.1",
          "dsn": "2.0.0",
          "status": "Sent",
          "response": "250 2.0.0 Ok: queued as 6153112091D",
          "time": "2026-03-16T13:13:55Z"
        }
      ],
      "status": "Delivered",
      "is_spam": false
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Cache

Clear website cache

Permanently clears all server-side cache for the website at once. Use it when content was updated and needs to be visible immediately, or after making major changes.

Also purges the Hostinger CDN cache when CDN is enabled on the website. For a WordPress installation living in a subdirectory, pass the directory query parameter to clear its cache.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Query Parameters
  • directory
    Type: string

    Directory of the website installation to clear, relative to the website root. Defaults to the website root.

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/hosting/v1/accounts/{username}/websites/{domain}/cache/clear
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/cache/clear \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Toggle cacheless mode

Turns development (cacheless) mode on or off, based on the enabled flag. When enabled, nothing is cached, effectively turning off all caching for the website; use it while actively developing, testing changes, debugging issues, or when real-time updates must be visible. Disable it after finishing development work to restore the performance benefits of caching.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • enabled
    Type: boolean
    required

    Turn development (cacheless) mode on (true) or off (false) for the website.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/hosting/v1/accounts/{username}/websites/{domain}/cacheless-mode/toggle
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/cacheless-mode/toggle \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "enabled": true
}'
{
  "message": "Request accepted"
}

Toggle website cache

Turns server-side caching for the website on or off, based on the enabled flag. Enable it for faster page loads, reduced server load, and improved user experience; recommended for production websites. Disabling may impact performance; to temporarily bypass caching while developing or debugging, prefer toggling cacheless mode instead.

Does nothing if caching is already in the requested state.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • enabled
    Type: boolean
    required

    Turn server-side caching on (true) or off (false) for the website.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/hosting/v1/accounts/{username}/websites/{domain}/cache/toggle
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/cache/toggle \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "enabled": true
}'
{
  "message": "Request accepted"
}

Cron Jobs

List account cron jobs

Returns the list of cron jobs configured for the specified account, including their schedule and command.

Path Parameters
  • username
    Type: string
    required
Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/cron-jobs
curl /api/hosting/v1/accounts/u123456789/cron-jobs \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "uid": "cron_abc123",
    "username": "u123456789",
    "time": "0 2 * * *",
    "command": "php /home/u123456789/cleanup.php"
  }
]

Create account cron job

Creates a cron job for the specified account from a schedule expression and a command.

Returns the created cron job, including its uid, which is required to delete the cron job or fetch its output.

Path Parameters
  • username
    Type: string
    required
Body·
required
application/json
  • command
    Type: string
    required

    Command to execute on the schedule.

  • time
    Type: string
    required

    Cron schedule expression (for example "0 2 * * *" runs daily at 02:00).

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/cron-jobs
curl /api/hosting/v1/accounts/u123456789/cron-jobs \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "time": "0 2 * * *",
  "command": "php /home/u123456789/cleanup.php"
}'
{
  "uid": "cron_abc123",
  "username": "u123456789",
  "time": "0 2 * * *",
  "command": "php /home/u123456789/cleanup.php"
}

Delete account cron job

Permanently deletes the cron job identified by its uid.

The uid is returned by the list cron jobs endpoint.

Path Parameters
  • username
    Type: string
    required
  • uid
    Type: string
    required

    Unique identifier of the cron job as returned by the list cron jobs endpoint.

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/hosting/v1/accounts/{username}/cron-jobs/{uid}
curl /api/hosting/v1/accounts/u123456789/cron-jobs/cron_abc123 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Get cron job output

Returns the output captured from the last execution of the cron job identified by its uid.

The uid is returned by the list cron jobs endpoint.

Path Parameters
  • username
    Type: string
    required
  • uid
    Type: string
    required

    Unique identifier of the cron job as returned by the list cron jobs endpoint.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/cron-jobs/{uid}/output
curl /api/hosting/v1/accounts/u123456789/cron-jobs/cron_abc123/output \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "output": ""
}

Datacenters

Access information about available datacenters for hosting services. This category provides details about data center locations and capabilities to help you choose the optimal region for your hosting needs.

Datacenters Operations

List available datacenters

Retrieve a list of datacenters available for setting up hosting plans based on available datacenter capacity and hosting plan of your order. The first item in the list is the best match for your specific order requirements.

Query Parameters
  • order_id
    Type: integer
    required

    Order ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/datacenters
curl '/api/hosting/v1/datacenters?order_id=123' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "title": "Europe (UK)",
    "code": "uk-fast",
    "coordinates": {
      "latitude": 51.5074,
      "longitude": 0.1278
    }
  }
]

Databases

Change database password

Changes the password for the specified database user.

The database name must be the full name returned by the list databases endpoint. The password must also be updated in any website configuration that uses this database.

Path Parameters
  • username
    Type: string
    required
  • name
    Type: string
    required

    Full database name as returned by the list databases endpoint.

Body·
required
application/json
  • password
    Type: string Format: password
    required

    New database user password.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/hosting/v1/accounts/{username}/databases/{name}/change-password
curl /api/hosting/v1/accounts/u123456789/databases/u123456789_test_db/change-password \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "password": "Secu4ePa$$wor!D"
}'
{
  "message": "Request accepted"
}

List account databases

Returns a paginated list of databases for the specified account.

Use the domain and is_assigned filters to find databases assigned to a specific domain.

Path Parameters
  • username
    Type: string
    required
Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

  • domain
    Type: string | null

    Filter by domain name (case-insensitive substring match)

  • is_assigned
    Type: boolean | null

    When used with domain, return only databases assigned to that domain.

  • search
    Type: string | null
    max length:  
    512

    Search databases by name, user, or creation date.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/databases
curl /api/hosting/v1/accounts/u123456789/databases \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "name": "u123456789_test_db",
      "user": "u123456789_admin",
      "domain": "example.com",
      "permissions": {
        "Alter": 1,
        "Drop": 0
      },
      "created_at": "2024-05-29T05:49:49+00:00",
      "updated_at": "2024-05-29T05:49:49+00:00",
      "disk_usage_mb": 32,
      "max_size_mb": 3072,
      "host": "srv1517.hstgr.io",
      "port": 3306
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create account database

Creates a database with a database user and password for the specified account.

The database name and user are automatically prefixed with the account username when needed.

Path Parameters
  • username
    Type: string
    required
Body·
required
application/json
  • name
    Type: string
    required

    Database name. If the account username prefix is omitted, it is added automatically.

  • password
    Type: string Format: password
    required

    Database user password.

  • user
    Type: string
    required

    Database user. If the account username prefix is omitted, it is added automatically.

  • website_domain
    Type: string
    required

    Website domain assigned to the database.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/databases
curl /api/hosting/v1/accounts/u123456789/databases \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "u123456789_test_db",
  "user": "u123456789_admin",
  "password": "Str0ngP@ssword!",
  "website_domain": "example.com"
}'
{
  "message": "Request accepted"
}

Delete account database

Permanently deletes a database and its remote connections.

The database name must be the full name returned by the list databases endpoint.

Path Parameters
  • username
    Type: string
    required
  • name
    Type: string
    required

    Full database name as returned by the list databases endpoint.

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/hosting/v1/accounts/{username}/databases/{name}
curl /api/hosting/v1/accounts/u123456789/databases/u123456789_test_db \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Create database remote connection

Allows a remote host to connect to the specified database.

Provide an IPv4/IPv6 address, or "%" to allow any host. The database name must be the full name returned by the list databases endpoint.

Path Parameters
  • username
    Type: string
    required
  • name
    Type: string
    required

    Full database name as returned by the list databases endpoint.

Body·
required
application/json
  • ip
    Type: string
    required

    Remote host to allow: an IPv4/IPv6 address, or "%" for any host.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/databases/{name}/remote-connections
curl /api/hosting/v1/accounts/u123456789/databases/u123456789_test_db/remote-connections \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "ip": "192.0.2.10"
}'
{
  "message": "Request accepted"
}

Delete database remote connection

Permanently removes a remote-access rule, revoking the given host's remote access to the database.

Identify the rule with the required ip query parameter (the IPv4/IPv6 address, or "%", exactly as returned by the list remote connections endpoint). The database name must be the full name returned by the list databases endpoint.

Path Parameters
  • username
    Type: string
    required
  • name
    Type: string
    required

    Full database name as returned by the list databases endpoint.

Query Parameters
  • ip
    Type: string
    required

    Remote host to revoke: the IPv4/IPv6 address, or "%", exactly as returned by the list remote connections endpoint.

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/hosting/v1/accounts/{username}/databases/{name}/remote-connections
curl '/api/hosting/v1/accounts/u123456789/databases/u123456789_test_db/remote-connections?ip=192.0.2.10' \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

List database remote connections

Returns the remote-access rules for the specified account: the remote hosts (IPv4/IPv6 addresses, or "%" for any host) allowed to connect to the account databases.

Use the domain filter to only return rules for databases assigned to a specific domain.

Path Parameters
  • username
    Type: string
    required
Query Parameters
  • domain
    Type: string | null

    Filter remote connections by the domain the database is assigned to. Rules for databases not assigned to any domain are always included.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/databases/remote-connections
curl /api/hosting/v1/accounts/u123456789/databases/remote-connections \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "database_name": "u123456789_shop",
    "database_user": "u123456789_admin",
    "ip": "192.0.2.10"
  }
]

Repair database

Repairs corrupted database tables asynchronously.

Use when database errors, crashes, or corruption are reported. The database name must be the full name returned by the list databases endpoint.

Path Parameters
  • username
    Type: string
    required
  • name
    Type: string
    required

    Full database name as returned by the list databases endpoint.

Responses
  • application/json
  • application/json
  • application/json
Request Example for patch/api/hosting/v1/accounts/{username}/databases/{name}/repair
curl /api/hosting/v1/accounts/u123456789/databases/u123456789_test_db/repair \
  --request PATCH \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Domains

Generate a free subdomain

Generate a unique free subdomain that can be used for hosting services without purchasing custom domains. Free subdomains allow you to start using hosting services immediately and you can always connect a custom domain to your site later.

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/domains/free-subdomains
curl /api/hosting/v1/domains/free-subdomains \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "domain": "palegreen-fox-548498.hostingersite.com"
}

List website parked domains

Retrieve all parked or alias domains created under the selected website.

Use this endpoint to inspect parked domain configuration for a specific website, including the parent domain and root directory assigned to each parked domain.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/parked-domains
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/parked-domains \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "username": "u123456789",
    "domain": "parked-domain.com",
    "parent_domain": "example.com",
    "root_directory": "/home/u123456789/domains/example.com/public_html",
    "type": "domain"
  }
]

Create website parked domain

Create a parked or alias domain for the selected website.

Provide a domain name or IP address to park on the website so it serves the same content as the parent domain.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • parked_domain
    Type: string
    required

    Domain name or IP address to park on the selected website

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/websites/{domain}/parked-domains
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/parked-domains \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "parked_domain": "parked-domain.com"
}'
{
  "message": "Request accepted"
}

Delete website parked domain

Delete an existing parked or alias domain from the selected website.

Use this endpoint to remove parked domains that are no longer needed.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

  • parkedDomain
    Type: string
    required
Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/hosting/v1/accounts/{username}/websites/{domain}/parked-domains/{parkedDomain}
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/parked-domains/parked-domain.com \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

List website subdomains

Retrieve all subdomains created under the selected website.

Use this endpoint to inspect subdomain configuration for a specific website, including the parent domain and root directory assigned to each subdomain.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/subdomains
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/subdomains \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "username": "u123456789",
    "domain": "blog.example.com",
    "parent_domain": "example.com",
    "root_directory": "/home/u123456789/domains/blog.example.com/public_html",
    "subdomain": "blog"
  }
]

Create website subdomain

Create a new subdomain for the selected website.

Provide a subdomain prefix and, optionally, a custom directory or the website public directory to use as the subdomain root.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • subdomain
    Type: string
    required

    Subdomain prefix to create under the selected website

  • directory
    Type: string | null

    Directory name for the subdomain relative to the website root

  • is_using_public_directory
    Type: boolean

    Use the website public directory as the subdomain root directory

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/websites/{domain}/subdomains
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/subdomains \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "subdomain": "blog",
  "directory": "blog",
  "is_using_public_directory": true
}'
{
  "message": "Request accepted"
}

Delete website subdomain

Delete an existing subdomain from the selected website.

Use this endpoint to remove subdomains that are no longer needed.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

  • subdomain
    Type: string
    required
Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/hosting/v1/accounts/{username}/websites/{domain}/subdomains/{subdomain}
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/subdomains/blog \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Verify domain ownership

Verify ownership of a single domain and return the verification status.

Use this endpoint to check if a domain is accessible for you before using it for new websites. If the domain is accessible, the response will have is_accessible: true. If not, add the given TXT record to your domain's DNS records and try verifying again. Keep in mind that it may take up to 10 minutes for new TXT DNS records to propagate.

Skip this verification when using Hostinger's free subdomains (*.hostingersite.com).

Body·
required
application/json
  • domain
    Type: string
    required

    Domain to verify ownership for

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/domains/verify-ownership
curl /api/hosting/v1/domains/verify-ownership \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain": "example.com"
}'
{
  "domain": "example.com",
  "is_accessible": false,
  "txt_to_verify": "example.com=example-verification-code"
}

Files

Generate upload URL

Generate a file browser upload URL with authentication credentials for uploading files directly to a website's file storage.

Returns url, auth_key and rest_auth_key. Use these to upload a file to the website's public_html directory via the TUS resumable upload protocol (TUS 1.0.0). Send X-Auth: {auth_key} and X-Auth-Rest: {rest_auth_key} headers on every request below.

  1. Create the upload: POST to {url}/{relative_file_path}?override=true with headers upload-length: {file size in bytes} and upload-offset: 0. Expect 201 Created.
  2. Upload the file: send the file bytes to the same location (any TUS 1.0.0 client, or PATCH requests with an upload-offset header tracking progress) until complete.

relative_file_path is the destination path inside public_html, e.g. app.zip.

Instead of a TUS client, plain curl also works:

FILE=app.zip
SIZE=$(stat -f%z "$FILE")   # stat -c%s on Linux

curl -i -X POST "{url}/${FILE}?override=true" \
  -H "X-Auth: {auth_key}" \
  -H "X-Auth-Rest: {rest_auth_key}" \
  -H "Tus-Resumable: 1.0.0" \
  -H "Upload-Length: ${SIZE}" \
  -H "Upload-Offset: 0"
# -> 201 Created

curl -i -X PATCH "{url}/${FILE}?override=true" \
  -H "X-Auth: {auth_key}" \
  -H "X-Auth-Rest: {rest_auth_key}" \
  -H "Tus-Resumable: 1.0.0" \
  -H "Content-Type: application/offset+octet-stream" \
  -H "Upload-Offset: 0" \
  --data-binary "@${FILE}"
# -> 204 No Content, Upload-Offset response header equals SIZE when done
Body·
required
application/json
  • domain
    Type: string
    required

    Website domain

  • username
    Type: string
    required

    Account username

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/files/upload-urls
curl /api/hosting/v1/files/upload-urls \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "username": "u123456789",
  "domain": "example.com"
}'
{
  "url": "https://srv12345-files.hstgr.io/",
  "auth_key": "eYJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Im15dXNlcm5hbWUiLCJkb21haW4iOiJteWRvbWFpbi5jb20iLCJpYXQiOjE2ODgwMjM2MDAsImV4cCI6MTY4ODA2MDgwMH0.4fXoX1HnY2b8jv7gX9h8vZ6xX3K1t7y5H3Z5Z5Z5Z5Q",
  "rest_auth_key": "d555be24e1096adcb6a029fbd1f25fdf18db587c5dbd01e0e49b22f67108b121-f496d493c2swfwea"
}

List website files and directories

List files and directories under a website's document root.

Use directory to browse a subdirectory relative to the document root. Symlinked entries are listed but never traversed into or resolved.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Query Parameters
  • directory
    Type: string

    Directory path to check

  • max_depth
    Type: integer | null
    min:  
    1
    max:  
    10

    How many directory levels deep to recurse.

  • max_items
    Type: integer | null
    min:  
    1
    max:  
    2000

    Max number of entries to return in this page.

  • offset
    Type: integer | null
    min:  
    0

    Number of entries to skip. Page with offset + item count until reaching total_items.

  • file_types
    Type: array string[] enum

    Filter by entry type, e.g. file,directory. Omit for all types.

    values
    • file
    • directory
    • symlink
    • other
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/domains/{domain}/files
curl /api/hosting/v1/accounts/u123456789/domains/mydomain.tld/files \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "path": "wp-content",
  "items": [
    {
      "name": "index.php",
      "path": "wp-content/index.php",
      "type": "file",
      "size_bytes": 512
    }
  ],
  "total_items": 42,
  "total_items_current_page": 20,
  "offset": 0
}

Get website file content

Get a single file's content, relative to a website's document root.

Read-only; refuses symlinks, oversized files, non-text file types, and files identified as containing secrets (e.g. credential files) — none of these are returned by this endpoint.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Query Parameters
  • path
    Type: string
    required

    File path, relative to the document root.

  • from_line
    Type: integer | null
    min:  
    0

    Line offset to start reading from.

  • max_lines
    Type: integer | null
    min:  
    1
    max:  
    5000

    Max number of lines to return.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/domains/{domain}/files/content
curl '/api/hosting/v1/accounts/u123456789/domains/mydomain.tld/files/content?path=index.php' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "path": "index.php",
  "content": "<?php\necho 'Hello world';\n",
  "from_line": 0,
  "total_lines": 84,
  "size_bytes": 2048
}

NodeJS

List NodeJS builds

Retrieve a paginated list of Node.js build processes for a specific website.

Each build represents a single run of the Node.js build pipeline. Use the states query parameter to filter results by build state (pending, running, completed, failed). Use the uuid from a build to poll its output via the Get Node.js Build Logs endpoint.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

  • states
    Type: array string[] enum

    Build states to filter by

    values
    • pending
    • running
    • completed
    • failed
Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/builds \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "uuid": "69f07fe2-197a-4fb3-9dae-606f965ad13d",
      "state": "pending",
      "options": {
        "node_version": 24,
        "app_type": "vite",
        "root_directory": "src",
        "output_directory": "dist",
        "build_script": "build",
        "entry_file": "server.js",
        "package_manager": "npm",
        "source_type": "archive",
        "source_options": {
          "archive_path": "archive.zip"
        }
      },
      "created_at": "2024-05-29T05:49:49.067239Z",
      "updated_at": "2024-05-29T05:49:49.067239Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Start Node.js build

Start a Node.js build process using files already present on the website's file storage.

WARNING: on success this overwrites the website's existing contents and cannot be undone — verify this is intended before calling this endpoint.

The source_type must be archive and source_options.archive_path must point to an existing archive file on the server (relative to the website document root). Use the Generate Upload URL endpoint to obtain credentials and upload the archive first.

To auto-detect build settings from an archive before starting, first call the Get Node.js Build Settings from Archive endpoint.

The returned build uuid can be used to poll progress and retrieve logs via the Get Node.js Build Logs endpoint.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • app_type
    Type: string | null enum
    required

    Node.js application type

    values
    • create-react-app
    • gatsby
    • vite
    • angular
    • react
  • build_script
    Type: string | null
    min length:  
    1
    max length:  
    64
    required

    Build script that will be ran to build the application

  • node_version
    Type: integer enum
    required

    Node.js version

    values
    • 18
    • 20
    • 22
    • 24
  • output_directory
    Type: string | null
    min length:  
    1
    max length:  
    200
    required

    Build output directory relative to the root directory

  • root_directory
    Type: string | null
    min length:  
    1
    max length:  
    200
    required

    Application root directory (where package.json is located) relative to public_html

  • source_options
    Type: object | null
    required

    Source-specific options

  • source_type
    enum
    const:  
    archive
    required

    The source type of the files

    values
    • archive
  • entry_file
    Type: string | null
    min length:  
    1
    max length:  
    200

    The main entry point file for the application

  • package_manager
    Type: string | null
    min length:  
    1
    max length:  
    20
    enum

    Package manager

    values
    • npm
    • yarn
    • pnpm
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/builds \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "node_version": 20,
  "app_type": "vite",
  "root_directory": "webapp",
  "output_directory": "dist",
  "build_script": "build",
  "entry_file": "server.js",
  "package_manager": "npm",
  "source_type": "archive",
  "source_options": {
    "archive_path": "example.zip"
  }
}'
{
  "uuid": "69f07fe2-197a-4fb3-9dae-606f965ad13d",
  "state": "pending",
  "options": {
    "node_version": 24,
    "app_type": "vite",
    "root_directory": "src",
    "output_directory": "dist",
    "build_script": "build",
    "entry_file": "server.js",
    "package_manager": "npm",
    "source_type": "archive",
    "source_options": {
      "archive_path": "archive.zip"
    }
  },
  "created_at": "2024-05-29T05:49:49.067239Z",
  "updated_at": "2024-05-29T05:49:49.067239Z"
}

Get Node.js build settings

Returns the build settings stored for the website: framework (app_type), Node.js version, root and output directory, build script, entry file and package manager. Stored settings drive Git auto-deployment builds. A build started through the API uses the values sent in that request and saves them here only when no settings exist yet.

Returns 404 until the first build or the first settings update stores them. Use this after a failed build to check whether the framework or the entry file were detected wrong, then fix them with the Update Node.js build settings endpoint.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds/settings
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/builds/settings \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "node_version": 20,
  "app_type": "vite",
  "root_directory": "frontend",
  "output_directory": "dist",
  "build_script": "build",
  "entry_file": "server.js",
  "package_manager": "npm"
}

Update Node.js build settings

Replaces the build settings stored for the website. Send the full set: node_version is required and every nullable field you omit is stored as null. Creates the settings when none exist yet.

This does not start a build. Stored settings drive Git auto-deployment builds; a build started through the API uses the values sent in that request, so to rebuild with corrected settings call Start Node.js build with the same values. Typical fixes: a wrong app_type after auto-detection, or a missing entry_file for express, fastify, nest, nuxt and hono apps.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • node_version
    Type: integer enum
    required

    Node.js major version

    values
    • 18
    • 20
    • 22
    • 24
  • app_type
    Type: string | null enum

    Node.js application framework. Set it explicitly when auto-detection picked the wrong one.

    values
    • create-react-app
    • gatsby
    • vite
    • angular
    • react
  • build_script
    Type: string | null
    min length:  
    1
    max length:  
    64

    The package.json script that builds the application

  • entry_file
    Type: string | null
    min length:  
    1
    max length:  
    200

    The main entry point file for the application (required for express, fastify, nest, nuxt and hono app types)

  • output_directory
    Type: string | null
    min length:  
    1
    max length:  
    200

    Build output directory relative to the root directory

  • package_manager
    Type: string | null
    min length:  
    1
    max length:  
    20
    enum

    Package manager used to install dependencies

    values
    • npm
    • yarn
    • pnpm
  • root_directory
    Type: string | null
    min length:  
    1
    max length:  
    200

    Application root directory (where package.json is located) relative to public_html. Omit it, or send ".", for public_html itself.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds/settings
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/builds/settings \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "node_version": 20,
  "app_type": "vite",
  "root_directory": "webapp",
  "output_directory": "dist",
  "build_script": "build",
  "entry_file": "server.js",
  "package_manager": "npm"
}'
{
  "node_version": 20,
  "app_type": "vite",
  "root_directory": "frontend",
  "output_directory": "dist",
  "build_script": "build",
  "entry_file": "server.js",
  "package_manager": "npm"
}

Get Node.js build settings from archive

Auto-detect Node.js build settings from a package.json inside an archive already on the server.

Use this before calling Start Node.js Build to preview what settings will be used, or to let the user review and override values (framework, node version, root directory, output directory, build script) before committing to a build.

The archive must already be present on the website's file storage. Use the Generate Upload URL endpoint to obtain credentials and upload the archive first.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Query Parameters
  • archive_path
    Type: string
    required

    The path to the archive file relative to the document root of the vhost

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds/settings/from-archive
curl '/api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/builds/settings/from-archive?archive_path=example.zip' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "app_type": "create-react-app",
  "node_version": 18,
  "root_directory": "frontend",
  "output_directory": "dist",
  "build_script": "build",
  "entry_file": "server.js",
  "package_manager": "npm",
  "available_scripts": [
    "build",
    "test"
  ]
}

List Node.js environment variables

Lists the Node.js environment variables currently set for the website. Values are always masked as ******** and cannot be read back through this API. Use this endpoint to see which keys are configured or to verify a change, not to read values.

To change variables, use the Replace Node.js environment variables endpoint. It replaces the whole set, so never copy the masked values from this response into that request; send the full desired set with real values taken from the project .env file or the user prompt instead.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds/settings/env
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/builds/settings/env \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "key": "DATABASE_URL",
    "value": "********"
  }
]

Replace Node.js environment variables

Replaces the website's Node.js environment variables with the ones provided. This is a full replace: any variable not in the request is deleted, and sending an empty env_vars array deletes every variable. Saving writes the values and restarts the running Node.js process.

A restart is enough for apps that read environment variables at process start, such as Express or NestJS. It is not enough for frameworks that bake variables into the build. Next.js standalone is one of those: build-time values (including NEXT_PUBLIC_*) need a fresh build. After this call, use the Start Node.js build endpoint so those apps pick up the new values.

The List Node.js environment variables endpoint returns masked values (********), so never copy values from it into this request. Always send the full desired set with real values taken from the project .env file or the user prompt.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • env_vars
    Type: array object[] …1000
    required

    Environment variables to set. This is the full desired set: any variable not in this list is deleted, and an empty array deletes every variable.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds/settings/env
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/builds/settings/env \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "env_vars": [
    {
      "key": "API_URL",
      "value": "https://api.example.com"
    }
  ]
}'
{
  "message": "Request accepted"
}

Analyse failed Node.js build

Returns an AI analysis of why a build failed and how to fix it, based on the build logs, the project file list and package.json. Only builds in the failed state can be analysed; any other state returns 422. When no analysis could be produced both analysis and solution are null, in which case read Get NodeJS build logs instead.

Each call runs the analysis again, so call it once per failed build and keep the result. Limited to 5 calls per minute per API client (429 above that).

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

  • uuid
    Type: string Format: uuid
    required

    Build UUID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds/{uuid}/analysis
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/builds/123e4567-e89b-12d3-a456-426614174000/analysis \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "analysis": "The build failed because the entry file server.js does not exist in the project root.",
  "solution": "Set entry_file to the file that starts the server, for example index.js."
}

Get Node.js build details

Returns one build by UUID: its state (pending, running, completed, failed), the options it ran with and timestamps. Poll this while a build is pending or running. When it is failed, read Get NodeJS build logs and Analyse failed Node.js build for the cause. Returns 404 when the UUID does not belong to a build of this website.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

  • uuid
    Type: string Format: uuid
    required

    Build UUID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds/{uuid}
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/builds/123e4567-e89b-12d3-a456-426614174000 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "uuid": "69f07fe2-197a-4fb3-9dae-606f965ad13d",
  "state": "pending",
  "options": {
    "node_version": 24,
    "app_type": "vite",
    "root_directory": "src",
    "output_directory": "dist",
    "build_script": "build",
    "entry_file": "server.js",
    "package_manager": "npm",
    "source_type": "archive",
    "source_options": {
      "archive_path": "archive.zip"
    }
  },
  "created_at": "2024-05-29T05:49:49.067239Z",
  "updated_at": "2024-05-29T05:49:49.067239Z"
}

Get NodeJS build logs

Retrieve logs from a specific Node.js build process.

To stream live output while a build is running, poll this endpoint repeatedly while the build state is running, passing the previously returned lines count as from_line to fetch only new output since the last call. Log content may contain ANSI escape sequences (color codes).

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

  • uuid
    Type: string Format: uuid
    required

    Build UUID

Query Parameters
  • from_line
    Type: integer | null

    Line from which to start retrieving logs

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/builds/{uuid}/logs
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/builds/123e4567-e89b-12d3-a456-426614174000/logs \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "logs": "added 10 packages, and audited 11 packages in 8s\n\n3 packages are looking for funding\n  run `npm fund` for details",
  "lines": 3
}

Get Node.js runtime logs

Returns the Node.js application's runtime console log entries, oldest first, each with timestamp, level and message. On the first call send period (1h, 1d, 1w or 1m) and optionally levels and limit (1-5000, default 1000); when more entries match than limit, the newest are kept.

To poll for new entries send total_lines + 1 from the previous response as from_line and omit period; period and from_line cannot be combined. Lines that are not JSON with a timestamp, level and message are skipped, so logs may hold fewer than limit entries while total_lines counts every raw line. Entries with a timestamp before last_deployed_at belong to the previous deployment. Returns an empty logs list when the application has not written a log file yet.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Query Parameters
  • period
    Type: string enum

    Time window for the first fetch. Required when from_line is not sent.

    values
    • 1h
    • 1d
    • 1w
    • 1m
  • from_line
    Type: integer
    min:  
    1

    1-based line of the log file to start from. For polling send total_lines + 1 from the previous response. Cannot be combined with period.

  • limit
    Type: integer
    min:  
    1
    max:  
    5000

    Maximum number of log entries to return. When more entries match, the newest are kept.

  • levels
    Type: array string[] enum

    Return only entries with these log levels, sent as a comma-separated list, e.g. ERROR,WARN. Matching runs on the raw log line, so entries written with numeric levels (for example by pino) are excluded while this filter is set.

    values
    • LOG
    • ERROR
    • WARN
    • INFO
    • DEBUG
    • TRACE
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/runtime-logs
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/runtime-logs \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "logs": [
    {
      "timestamp": "2026-03-03T09:11:02.001Z",
      "level": "INFO",
      "message": "Server started on port 3000"
    }
  ],
  "started_at": "2026-03-03T09:11:02Z",
  "total_lines": 5042,
  "last_deployed_at": "2026-03-03T08:58:41Z"
}

Clear Node.js runtime logs

Empties the Node.js application's runtime log file. This cannot be undone, so confirm with the user before calling it. Returns success even when no log file exists yet.

Use it before reproducing a problem so the next Get Node.js runtime logs call returns only fresh entries; start that call with period again instead of reusing a from_line from before the clear.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/runtime-logs
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/runtime-logs \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Restart Node.js application

Restarts the Node.js server process for the website. Does not rebuild or redeploy the application. Use it to apply environment or configuration changes, or to recover a hung application.

Only applicable to server-side applications (Express, Next.js, NestJS, etc.). Static front-end apps (React, Vue, Vite) have no persistent server process, so restarting them has no effect. Returns success even when the website has no server process to restart.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/server/restart
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/server/restart \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

List Node.js vulnerabilities

Lists known npm package vulnerabilities detected on a Node.js website, enriched with advisory metadata (severity, CVSS score, CVE, advisory URL). Results are sorted from the most severe to the least severe, then by publish date (newest first). Use the severities query parameter to filter.

Vulnerabilities with is_patchable set to true can be auto-fixed via the Patch Node.js Vulnerabilities endpoint, which opens a GitHub pull request with updated package versions. Auto-fix is only available for websites deployed from a connected GitHub repository. Vulnerabilities with is_patching_in_progress set to true are already included in an open patch pull request; while any patch pull request is open, new patch requests for this website are rejected until it is merged or closed.

Data comes from periodic dependency scans, so it may lag behind the latest deployment. An empty list means the most recent scan found no vulnerabilities; it does not guarantee the current deployment is vulnerability-free. Available on Business and Cloud Hosting plans.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Query Parameters
  • severities
    Type: array string[] enum

    Severities to filter by

    values
    • low
    • moderate
    • high
    • critical
    • unknown
Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/vulnerabilities
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/vulnerabilities \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "package_name": "lodash",
    "installed_version": "4.17.0",
    "is_direct": true,
    "is_patchable": true,
    "fix_version": "4.17.21",
    "vulnerability_id": "GHSA-jf85-cpcp-j695",
    "severity": "high",
    "title": "Prototype Pollution in lodash",
    "description": "Versions of lodash prior to 4.17.11 are vulnerable to prototype pollution.",
    "cvss_score": 9.8,
    "cve": "CVE-2019-10744",
    "cwe": "CWE-1321",
    "url": "https://github.com/advisories/GHSA-jf85-cpcp-j695",
    "published_at": "2019-07-26T00:00:00Z",
    "is_patching_in_progress": false
  }
]

Patch Node.js vulnerabilities

Patches the selected Node.js vulnerabilities by updating the affected package versions in package.json and opening a GitHub pull request in the connected repository. The customer reviews and merges the pull request; merging triggers the automatic deployment.

Auto-fix is only available for websites deployed from a connected GitHub repository. Websites deployed from an archive have no auto-fix path and return a 404. The Hostinger GitHub App needs write access to the repository; without it the request fails with a 403 explaining the missing permission.

Only vulnerabilities with is_patchable set to true can be patched. Non-patchable IDs in the selection are skipped; the pull request covers the patchable subset, listed in patched_vulnerability_ids. Selections without any patchable vulnerability are rejected with a 422. Only one patch pull request can be open at a time per website; close or merge it before patching again. Available on Business and Cloud Hosting plans.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • vulnerability_ids
    Type: array string[] 1…
    required

    List of vulnerability IDs to patch, as returned by the list vulnerabilities endpoint.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/websites/{domain}/nodejs/vulnerabilities/patch
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/nodejs/vulnerabilities/patch \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "vulnerability_ids": [
    "GHSA-1111-2222-3333"
  ]
}'
{
  "pr_url": "https://github.com/owner/repo/pull/42",
  "pr_number": 42,
  "head_branch": "fix/patch-vulnerabilities-a1b2c3d4",
  "patched_vulnerability_ids": [
    "GHSA-jf85-cpcp-j695"
  ]
}

Orders

Manage hosting service orders and subscriptions. This category provides access to order information, status tracking, and order management capabilities for hosting services.

List orders

Retrieve a paginated list of orders accessible to the authenticated client.

This endpoint returns orders of your hosting accounts as well as orders of other client hosting accounts that have shared access with you.

Use the available query parameters to filter results by order statuses or specific order IDs for more targeted results.

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

  • statuses
    Type: array string[] | null enum

    Filter by order statuses

    values
    • active
    • deleting
    • deleted
    • suspended
  • order_ids
    Type: array integer[] | null

    Filter by specific order IDs

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/orders
curl /api/hosting/v1/orders \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": 12345,
      "client_id": 67890,
      "subscription_id": "sub_abc123",
      "created_at": "2023-10-08T12:00:00+00:00",
      "plan": {
        "name": "hostinger_business"
      },
      "status": "active"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

PHP

Reset PHP extensions

Resets all PHP extensions of the website to their default state.

Use it to recover from extension conflicts or restore the original configuration.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for patch/api/hosting/v1/accounts/{username}/websites/{domain}/php/extensions/reset
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/php/extensions/reset \
  --request PATCH \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Get PHP details

Returns the full PHP configuration for the website: current version, available versions (supported and unsupported), enabled/disabled extensions, options with their current value, default, type and the plan limit (max), and conflicting extension groups.

Use it to check the current PHP setup before updating the version, extensions or options.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/php/details
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/php/details \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "php_version": "8.1",
  "php_version_full": "8.1.27",
  "php_versions": {
    "supported": {
      "8.1": "PHP 8.1"
    },
    "unsupported": {
      "5.2": "PHP 5.2"
    }
  },
  "options": {
    "additionalProperty": {
      "type": "bool",
      "value": "On",
      "comment": "Allows PHP file functions to retrieve data from remote locations",
      "default": "On",
      "range": "8M-512M",
      "max": "512M"
    }
  },
  "extensions": {
    "yaml": {
      "state": "enabled",
      "description": ""
    }
  },
  "conflicting_extensions": [
    [
      "apc",
      "opcache"
    ]
  ]
}

Get PHP info

Returns the full phpinfo page (HTML) for the website.

Use it to debug PHP issues or inspect the complete PHP environment of the website.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/php/php-info
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/php/php-info \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "info": "<html>...</html>"
}

Update PHP extensions

Enables or disables PHP extensions (modules) for the website.

Use the Get PHP details endpoint to check the current extension states before changing them.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • disable
    Type: array string[]

    PHP extensions to disable.

  • enable
    Type: array string[]

    PHP extensions to enable.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/hosting/v1/accounts/{username}/websites/{domain}/php/extensions
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/php/extensions \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "enable": [
    "json",
    "yaml"
  ],
  "disable": [
    "imagick"
  ]
}'
{
  "message": "Request accepted"
}

Update PHP options

Updates PHP options for the website (e.g. memory_limit, max_execution_time, upload_max_filesize). Only provide the options you want to change, inside the options object.

Values above the account plan limit are silently capped to that limit, so the request can succeed with a smaller applied value. Call the Get PHP details endpoint afterwards to read the applied value.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • options
    Type: object
    required

    Map of PHP options to update, keyed by option name. Only include options you want to change.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/hosting/v1/accounts/{username}/websites/{domain}/php/options
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/php/options \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "options": {
    "memory_limit": "512M",
    "max_execution_time": 300,
    "upload_max_filesize": "256M"
  }
}'
{
  "message": "Request accepted"
}

Update PHP version

Changes the PHP version of the website.

Use the Get PHP details endpoint to see the versions available for the website.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • version
    Type: string
    required

    PHP version to switch the website to.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/hosting/v1/accounts/{username}/websites/{domain}/php/version
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/php/version \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "version": "8.1"
}'
{
  "message": "Request accepted"
}

Redirects

Manage redirects for hosted websites. This category includes endpoints for listing, creating, and deleting redirects.

List website redirects

Returns a paginated list of redirects configured for the selected website.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/websites/{domain}/redirects
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/redirects \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "from": "https://example.com/old-page",
      "to": "https://example.com/new-page"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create website redirect

Creates a redirect from a URL on the selected website to another URL or IP address.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • from
    Type: string
    max length:  
    255
    required

    Source URL on the selected website

  • to
    Type: string
    max length:  
    255
    required

    Destination URL or IP address

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/websites/{domain}/redirects
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/redirects \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "from": "https://example.com/old-page",
  "to": "https://example.com/new-page"
}'
{
  "from": "https://example.com/old-page",
  "to": "https://example.com/new-page"
}

Delete website redirect

Permanently deletes the redirect identified by its source URL.

Pass the from value exactly as returned by the list redirects endpoint.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Query Parameters
  • from
    Type: string
    max length:  
    255
    Format: uri
    required

    Source URL returned by the list redirects endpoint.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/hosting/v1/accounts/{username}/websites/{domain}/redirects
curl '/api/hosting/v1/accounts/u123456789/websites/mydomain.tld/redirects?from=https%3A%2F%2Fexample.com%2Fold-page' \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Websites

Manage hosted websites and web applications. This category includes endpoints for website deployment, configuration, monitoring, and management of hosting resources.

List websites

Retrieve a paginated list of websites (CloudLinux, Builder, and Horizons) accessible to the authenticated client.

This endpoint returns websites from your hosting accounts as well as websites from other client hosting accounts that have shared access with you.

Each website includes a website_type field describing the type of website detected on the underlying platform (wordpress, builder, horizons, nodejs, or other). Some fields, such as vhost_type, username, and root_directory, only apply to CloudLinux websites and are null for other platforms.

Use website_types to list only websites of a given detected type, e.g. only WordPress websites (website_types=wordpress) or only Node.js websites (website_types=nodejs). Combine with the other available query parameters to filter by username, order ID, enabled status, or domain name for more targeted results.

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

  • username
    Type: string | null

    Filter by specific username

  • order_id
    Type: integer | null

    Order ID

  • is_enabled
    Type: boolean | null

    Filter by enabled status

  • domain
    Type: string | null

    Filter by domain name (case-insensitive substring match)

  • website_types
    Type: array string[] | null enum

    Filter by detected website type, e.g. wordpress,nodejs. Accepts a comma-separated list.

    values
    • wordpress
    • builder
    • horizons
    • nodejs
    • other
Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/websites
curl /api/hosting/v1/websites \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "domain": "example.com",
      "vhost_type": "main",
      "is_enabled": true,
      "username": "cl_user123",
      "client_id": 67890,
      "order_id": 12345,
      "created_at": "2024-01-15T10:30:00+00:00",
      "root_directory": "/home/u123456798/domains/example.com/public_html",
      "parent_domain": "parent.com",
      "website_type": "wordpress",
      "horizons_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create website

Create a new website for the authenticated client.

Provide the domain name and associated order ID to create a new website. The datacenter_code parameter is required when creating the first website on a new hosting plan - this will set up and configure new hosting account in the selected datacenter.

Subsequent websites will be hosted on the same datacenter automatically.

Website creation takes up to a few minutes to complete. Check the websites list endpoint to see when your new website becomes available.

Body·
required
application/json
  • domain
    Type: string
    required

    Domain name for the website. Cannot start with "www."

  • order_id
    Type: integer
    required

    ID of the associated order

  • datacenter_code
    Type: string | null

    Datacenter code. This parameter is required when creating the first website on a new hosting plan.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/websites
curl /api/hosting/v1/websites \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain": "example.com",
  "order_id": 12345,
  "datacenter_code": "us-east-1"
}'
{
  "message": "Request accepted"
}

Deploy static site archive

Deploy a static application from an archive file.

WARNING: this overwrites the website's existing contents and cannot be undone — verify this is intended before calling this endpoint.

This endpoint allows you to deploy a static application from an archive file that has been uploaded to the website's directory.

This only works for static sites (pre-built HTML/CSS/JS with no build step). For Node.js applications, use Create NodeJS build from archive instead, or Start Node.js build if the archive is already uploaded. For WordPress sites, use Import WordPress website.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • archive_path
    Type: string
    required

    Relative path to the archive file from website root directory

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/websites/{domain}/deploy
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/deploy \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "archive_path": "uploads/archive.zip"
}'
{
  "message": "Request accepted"
}

Delete website

This endpoint permanently removes a website and all of its data. This action cannot be undone. Before calling it, make sure the user understands the consequences and explicitly confirms that they want to proceed.

All website files, databases and related configuration will be removed. The hosting plan itself is kept, so a new website can be created on it afterwards.

Supported websites: main and addon domain websites on web hosting plans, and Website Builder websites. Parked domains and subdomains cannot be deleted with this endpoint. The domain must be the exact website domain, not a preview domain or an alias.

Returns 404 when the domain does not exist or does not belong to the authenticated client.

Website removal is processed asynchronously and can take a few minutes to complete. The response returns before the removal finishes.

Path Parameters
  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/hosting/v1/websites/{domain}
curl /api/hosting/v1/websites/mydomain.tld \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Cache

Agency Hosting: Cache

Clear website cache

Clears cache for all domains associated with an Agency Plan website, including its preview domain.

This operation clears all cache types for the website.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/agency-hosting/v1/websites/{website_uid}/cache
curl /api/agency-hosting/v1/websites/zpwlGlp19/cache \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Cron Jobs

List website cron jobs

Returns a paginated list of cron jobs configured for an Agency Plan website.

Each entry includes the schedule expression and the command executed on that schedule.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/websites/{website_uid}/cron-jobs
curl /api/agency-hosting/v1/websites/zpwlGlp19/cron-jobs \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "uuid": "01931d6f-68f5-7b72-8d9e-09c6e1e6aa0e",
      "time": "*/30 * * * *",
      "command": "php artisan schedule:run",
      "created_at": "2024-10-28T12:00:00+00:00"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create website cron job

Creates a cron job for an Agency Plan website from a schedule expression and a command.

Returns the created cron job, including its uuid, which is required to delete the cron job.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Body·
required
application/json
  • command
    Type: string
    required

    Command to run on the schedule. Must not contain pipe (|) or redirection (<, >) characters.

  • time
    Type: string
    required

    Cron schedule expression (standard 5-field crontab syntax).

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/agency-hosting/v1/websites/{website_uid}/cron-jobs
curl /api/agency-hosting/v1/websites/zpwlGlp19/cron-jobs \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "time": "*/30 * * * *",
  "command": "php artisan schedule:run"
}'
{
  "uuid": "01931d6f-68f5-7b72-8d9e-09c6e1e6aa0e",
  "time": "*/30 * * * *",
  "command": "php artisan schedule:run",
  "created_at": "2024-10-28T12:00:00+00:00"
}

Delete website cron job

Permanently deletes the cron job identified by its uuid from an Agency Plan website.

The operation is idempotent: deleting a cron job that does not exist succeeds without error.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

  • uuid
    Type: string Format: uuid
    required

    Unique identifier of the cron job as returned by the list cron jobs endpoint.

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/agency-hosting/v1/websites/{website_uid}/cron-jobs/{uuid}
curl /api/agency-hosting/v1/websites/zpwlGlp19/cron-jobs/01931d6f-68f5-7b72-8d9e-09c6e1e6aa0e \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Databases

List website databases

Returns a paginated list of MySQL databases created for an Agency Plan website.

Each entry includes the database's non-system users.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/websites/{website_uid}/databases
curl /api/agency-hosting/v1/websites/zpwlGlp19/databases \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "name": "my_database",
      "created_at": "2024-05-29T05:49:49+00:00",
      "users": [
        {
          "name": "my_user",
          "host": "localhost",
          "created_at": "2024-05-29T05:49:49+00:00"
        }
      ]
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create website database

Creates a MySQL database with a dedicated user for an Agency Plan website.

The database name, username, and password must all be provided by the caller.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Body·
required
application/json
  • database_name
    Type: string
    min length:  
    3
    max length:  
    30
    required

    Database name to create (alphanumeric characters).

  • database_user
    Type: string
    min length:  
    3
    max length:  
    12
    required

    Database username to create alongside the database (alphanumeric characters).

  • password
    Type: string
    min length:  
    8
    max length:  
    50
    Format: password
    required

    Password for the database user (requires mixed case, letters, and numbers).

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/agency-hosting/v1/websites/{website_uid}/databases
curl /api/agency-hosting/v1/websites/zpwlGlp19/databases \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "database_name": "mydatabase",
  "database_user": "myuser",
  "password": "Str0ngP@ssword!"
}'
{
  "name": "my_database",
  "created_at": "2024-05-29T05:49:49+00:00",
  "users": [
    {
      "name": "my_user",
      "host": "localhost",
      "created_at": "2024-05-29T05:49:49+00:00"
    }
  ]
}

Delete website database

Permanently deletes a MySQL database and all its data from an Agency Plan website, including its users.

The operation is idempotent: deleting a database that does not exist succeeds without error.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

  • database_name
    Type: string
    required

    Full database name as returned by the list databases endpoint.

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/agency-hosting/v1/websites/{website_uid}/databases/{database_name}
curl /api/agency-hosting/v1/websites/zpwlGlp19/databases/my_database \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Create website database user

Creates a user for an existing database on an Agency Plan website.

Each database supports a single non-system user; creating a user for a database that already has one fails.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

  • database_name
    Type: string
    required

    Full database name as returned by the list databases endpoint.

Body·
required
application/json
  • database_user
    Type: string
    min length:  
    3
    max length:  
    12
    required

    Database username to create (alphanumeric and underscores).

  • password
    Type: string
    min length:  
    8
    max length:  
    50
    Format: password
    required

    Password for the database user (requires mixed case, letters, and numbers).

  • host
    Type: string | null
    min length:  
    1
    max length:  
    40

    Host the user connects from (IPv4, IPv6, % wildcard, or localhost). Defaults to localhost.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/agency-hosting/v1/websites/{website_uid}/databases/{database_name}/users
curl /api/agency-hosting/v1/websites/zpwlGlp19/databases/my_database/users \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "database_user": "my_user",
  "password": "Str0ngP@ssword!",
  "host": "localhost"
}'
{
  "name": "my_user",
  "host": "localhost",
  "created_at": "2024-05-29T05:49:49+00:00"
}

Delete website database user

Permanently deletes a database user from an Agency Plan website database, revoking all access it had.

The operation is idempotent: deleting a user that does not exist succeeds without error.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

  • database_name
    Type: string
    required

    Full database name as returned by the list databases endpoint.

  • database_user_name
    Type: string
    required

    Database username as returned by the list databases endpoint.

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/agency-hosting/v1/websites/{website_uid}/databases/{database_name}/users/{database_user_name}
curl /api/agency-hosting/v1/websites/zpwlGlp19/databases/my_database/users/my_user \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Datacenters

Agency Hosting: Datacenters

List available datacenters

Lists the datacenters available for provisioning a new website on the given Agency Plan hosting order.

Each datacenter includes a pinger_url you can ping from the client to measure round-trip latency; comparing the results across datacenters lets you pick the nearest one (lowest ping) before choosing its code as the datacenter_code when creating a website setup.

Path Parameters
  • order_id
    Type: integer
    required

    Agency Plan order ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/orders/{order_id}/datacenters
curl /api/agency-hosting/v1/orders/123456/datacenters \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "title": "Europe (Netherlands)",
    "code": "ukfast",
    "country": "uk",
    "coordinates": {
      "latitude": 51.5074,
      "longitude": 0.1278
    },
    "pinger_url": "https://my-website.com/ping.php"
  }
]

Domains

Change website domain

Changes the primary domain for an Agency Plan website.

Provide the current domain in the path and the new domain in the request body. Set domain to null to revert to the temporary domain.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

  • from_domain
    Type: string
    required

    Current domain name to change from

Body·
required
application/json
  • domain
    Type: string | null
    required

    New domain to assign to the website. Set to null to revert to the temporary domain.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/agency-hosting/v1/websites/{website_uid}/domains/{from_domain}
curl /api/agency-hosting/v1/websites/zpwlGlp19/domains/old.example.com \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain": "new.example.com"
}'
{
  "message": "Request accepted"
}

Link domain to website

Links a domain to the specified Agency Plan website so it can serve traffic for that domain.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Body·
required
application/json
  • domain
    Type: string
    required

    Fully qualified domain name to link to the website

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/agency-hosting/v1/websites/{website_uid}/domains
curl /api/agency-hosting/v1/websites/zpwlGlp19/domains \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain": "example.com"
}'
{
  "message": "Request accepted"
}

List domains

Returns a paginated list of domains associated with Agency Plan websites accessible to the authenticated client.

Use the website_uuids filter to narrow results to specific websites.

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

  • website_uuids
    Type: array string[] | null

    Filter by website UIDs

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/domains
curl /api/agency-hosting/v1/domains \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "fqdn": "example.com",
      "website_uid": "zpwlGlp19",
      "created_at": "2024-05-29T05:49:49+00:00"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Unlink domain from website

Unlinks a domain from the specified Agency Plan website.

The website stops serving traffic on this domain immediately.

Website files and database are preserved, and any other linked domains remain accessible.

If this is the only domain on the website, unlinking leaves the website without an accessible domain.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

  • domain
    Type: string
    required

    Domain name

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/agency-hosting/v1/websites/{website_uid}/domains/{domain}
curl /api/agency-hosting/v1/websites/zpwlGlp19/domains/mydomain.tld \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Files

Generate upload URL

Generate a file browser upload URL with authentication credentials for uploading files to an Agency Plan website's file storage.

Returns url, auth_key and rest_auth_key. Use these to upload a file to the website's file storage via the TUS resumable upload protocol (TUS 1.0.0). Send X-Auth: {auth_key} and X-Auth-Rest: {rest_auth_key} headers on every request below.

  1. Create the upload: POST to {url}/{relative_file_path}?override=true with headers upload-length: {file size in bytes} and upload-offset: 0. Expect 201 Created.
  2. Upload the file: send the file bytes to the same location (any TUS 1.0.0 client, or PATCH requests with an upload-offset header tracking progress) until complete.

relative_file_path is the destination path inside the website's file storage, e.g. app.zip.

Instead of a TUS client, plain curl also works:

FILE=app.zip
SIZE=$(stat -f%z "$FILE")   # stat -c%s on Linux

curl -i -X POST "{url}/${FILE}?override=true" \
  -H "X-Auth: {auth_key}" \
  -H "X-Auth-Rest: {rest_auth_key}" \
  -H "Tus-Resumable: 1.0.0" \
  -H "Upload-Length: ${SIZE}" \
  -H "Upload-Offset: 0"
# -> 201 Created

curl -i -X PATCH "{url}/${FILE}?override=true" \
  -H "X-Auth: {auth_key}" \
  -H "X-Auth-Rest: {rest_auth_key}" \
  -H "Tus-Resumable: 1.0.0" \
  -H "Content-Type: application/offset+octet-stream" \
  -H "Upload-Offset: 0" \
  --data-binary "@${FILE}"
# -> 204 No Content, Upload-Offset response header equals SIZE when done
Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/agency-hosting/v1/websites/{website_uid}/files/upload-urls
curl /api/agency-hosting/v1/websites/zpwlGlp19/files/upload-urls \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "url": "https://h5g12345-fm.hstgr.io/rest/1b2b4e5d5a5f795f/api/tus",
  "auth_key": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxfX0.O-x6KeHMkNqnbYvbRcdDEQXOSLcqyE7xNrnKvftbG3A",
  "rest_auth_key": "5c3b12fabf3d9652780a23ae705d2feb556c89907d0db50cddb8dffc27c1149d-1b2b4e5d5a5f795f"
}

Import website from archive

Imports an Agency Plan website from an already-uploaded archive.

Upload the archive to the website's root directory via file browser first, then provide its filename in this request. Website contents are overwritten by the archive contents. Supported archive types: .zip, .tar, .tar.gz, .tgz.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Body·
required
application/json

Import a website from an already-uploaded archive

  • archive_name
    Type: string
    required

    Archive filename (e.g., archive.zip). The file must already be uploaded to the website's .h5g/ directory.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/agency-hosting/v1/websites/{website_uid}/files/import-archive
curl /api/agency-hosting/v1/websites/zpwlGlp19/files/import-archive \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "archive_name": "archive.zip"
}'
{
  "message": "Request accepted"
}

Metrics

List Agency Plan order disk usage metrics

Returns aggregated disk and inode usage for the Agency Plan order over the selected time frame, plus the plan quotas. Figures cover the whole order account. Values may be up to one hour stale. CPU, memory, and process usage are on the resource-usage-metrics endpoint.

Path Parameters
  • order_id
    Type: integer
    required

    Agency Plan order ID

Query Parameters
  • time_frame_days
    Type: integer enum

    Length of the window in days, ending now. Bucket size grows with the window.

    values
    • 1
    • 7
    • 14
    • 30
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/orders/{order_id}/disk-usage-metrics
curl /api/agency-hosting/v1/orders/123456/disk-usage-metrics \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "limits": {
    "disk_bytes": 104857600,
    "inodes": 400000
  },
  "metrics": [
    {
      "disk_bytes": 104857600,
      "inodes": 400000,
      "timestamp": 1736325738
    }
  ]
}

List order resource usage metrics

Returns aggregated CPU, memory, and process usage for the Agency Plan order over the selected time frame, plus the plan quotas and a per-website breakdown. Each website is identified by uid. Suspended and deleted websites are excluded from both the order totals and the per-website breakdown. Values may be up to one hour stale. Disk and inode usage are on the disk-usage-metrics endpoint.

Path Parameters
  • order_id
    Type: integer
    required

    Agency Plan order ID

Query Parameters
  • time_frame_hours
    Type: integer enum

    Length of the window in hours, ending now. Bucket size grows with the window.

    values
    • 1
    • 24
    • 168
    • 336
    • 720
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/orders/{order_id}/resource-usage-metrics
curl /api/agency-hosting/v1/orders/123456/resource-usage-metrics \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "limits": {
    "memory_bytes": 104857600,
    "cpu_percent": 400,
    "processes": 100
  },
  "metrics": [
    {
      "cpu_percent": 15.5,
      "memory_bytes": 125829120,
      "processes": 12,
      "timestamp": 1736325738
    }
  ],
  "websites": [
    {
      "uid": "cvDuwAOvq",
      "domains": [
        "example.com",
        "www.example.com"
      ],
      "metrics": [
        {
          "cpu_percent": 15.5,
          "memory_bytes": 125829120,
          "processes": 12,
          "timestamp": 1736325738
        }
      ]
    }
  ]
}

Orders

Agency Hosting: Orders

List orders

Returns a paginated list of Agency Plan orders accessible to the authenticated client.

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/orders
curl /api/agency-hosting/v1/orders \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": 123456,
      "client_id": 123456,
      "status": "active",
      "plan": {
        "name": "Shared Business hosting",
        "key": "shared_business_hosting"
      },
      "datacenter": {
        "code": "ukfast",
        "country": "uk"
      },
      "created_at": "2024-05-29T05:49:49+00:00"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

PHP

List PHP extensions for a website

Lists every PHP extension available to an Agency Plan website and whether it is currently enabled.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/websites/{website_uid}/php-settings/extensions
curl /api/agency-hosting/v1/websites/zpwlGlp19/php-settings/extensions \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "name": "zip",
    "description": "Lets PHP read and write compressed ZIP archives.",
    "state": "enabled"
  }
]

Replace website PHP extensions

Replaces the set of PHP extensions enabled on an Agency Plan website with the ones provided. Any toggleable extension not in the request is disabled, so call the extensions endpoint first and send the full desired set. Extensions compiled into PHP, reported with the "built-in" state, are always active and are unaffected.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Body·
required
application/json
  • extensions
    Type: array string[] …500
    required

    Extension names, exactly as returned by the extensions endpoint.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/agency-hosting/v1/websites/{website_uid}/php-settings/extensions
curl /api/agency-hosting/v1/websites/zpwlGlp19/php-settings/extensions \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "extensions": [
    "bz2",
    "zip"
  ]
}'
{
  "message": "Request accepted"
}

List PHP options for a website

Lists the php.ini directives that can be configured for an Agency Plan website, each with its default, the value currently in effect, and the values it accepts.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/websites/{website_uid}/php-settings/options
curl /api/agency-hosting/v1/websites/zpwlGlp19/php-settings/options \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "name": "upload_max_filesize",
    "description": "The maximum size in bytes of an uploaded file.",
    "default_value": "128M",
    "allowed_values": [
      "128M",
      "256M",
      "512M"
    ],
    "value": "256M",
    "type": "value"
  }
]

Replace website PHP options

Replaces the custom php.ini values on an Agency Plan website with the ones provided. Any option not in the request is reset to its default, so call the options endpoint first and send the full desired set. Sending an empty array resets every option to its default.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Body·
required
application/json
  • options
    Type: array object[] …500
    required

    Option names and values. Each name must be one of the options returned by the options endpoint, and each value must satisfy that option's allowed_values when it declares them.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/agency-hosting/v1/websites/{website_uid}/php-settings/options
curl /api/agency-hosting/v1/websites/zpwlGlp19/php-settings/options \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "options": [
    {
      "name": "memory_limit",
      "value": "256M"
    }
  ]
}'
{
  "message": "Request accepted"
}

List available PHP versions for an order

Lists the PHP versions available to websites created under an Agency Plan order, determined by the server the order is hosted on. Use this before creating a website; for a website that already exists, call the website-scoped versions endpoint instead.

Path Parameters
  • order_id
    Type: integer
    required

    Agency Plan order ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/orders/{order_id}/websites/php-settings/versions
curl /api/agency-hosting/v1/orders/123456/websites/php-settings/versions \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "version": "8.2"
  }
]

List available PHP versions for a website

Lists the PHP versions an Agency Plan website can be switched to. The version the website is currently running is returned as settings.php.version by the website details endpoint.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/websites/{website_uid}/php-settings/versions
curl /api/agency-hosting/v1/websites/zpwlGlp19/php-settings/versions \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "version": "8.2"
  }
]

Update website PHP version

Switches an Agency Plan website to a different PHP version. Call the available versions endpoint first to see which versions can be selected. The website restarts on the new version, so requests served during the switch may fail and code that is incompatible with the target version will break.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Body·
required
application/json
  • version
    Type: string
    required

    PHP version to switch the website to, as major.minor. Must be one of the versions returned by the available versions endpoint.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/agency-hosting/v1/websites/{website_uid}/php-settings/version
curl /api/agency-hosting/v1/websites/zpwlGlp19/php-settings/version \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "version": "8.2"
}'
{
  "message": "Request accepted"
}

Website Setups

Create a new website

Provisions a new website on one of your Agency Plan hosting orders.

Choose the datacenter, stack (flavor), and PHP version for the site. Optionally attach your own domain — omit it, set it to null, or leave it unavailable and a free *.hostingersite.com subdomain is generated instead — and/or install WordPress by supplying the wordpress details (admin account, site title, and language).

Common setups:

  • Plain PHP site: flavor set to php-fpm, with settings.php.version; omit wordpress and type.
  • WordPress site: flavor set to the desired WordPress version (e.g. wp-7.0), plus the wordpress block (admin account, title, language).
  • Static/Node.js frontend app: flavor set to php-fpm and type set to node-static.

Provisioning runs in the background, so the response returns immediately with a setup UUID that identifies the job. The new website becomes reachable once provisioning finishes.

Path Parameters
  • order_id
    Type: integer
    required

    Agency Plan order ID

Body·
required
application/json

Create a new Agency Plan website setup on the given order

  • datacenter_code
    Type: string
    required

    Datacenter code where the website should be provisioned. Available codes depend on live capacity and are not a fixed set.

  • flavor
    Type: string Pattern: ^(wp-[0-9]+(\.[0-9]+){1,2}|php-fpm)$
    required

    Setup flavor: a specific WordPress version in the format wp-<major>.<minor> or wp-<major>.<minor>.<patch> (e.g. wp-6.8.2), or php-fpm for a plain PHP stack. Generic versions like wp-latest are not allowed.

  • settings
    Type: object
    required

    Website settings

  • domain
    Type: string | null

    Primary domain to attach to the website. Omit or set to null to get a free auto-generated *.hostingersite.com subdomain instead.

  • type
    enum
    const:  
    node-static

    Website type

    values
    • node-static
  • wordpress
    Type: object

    WordPress installation options

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/agency-hosting/v1/orders/{order_id}/websites/setups
curl /api/agency-hosting/v1/orders/123456/websites/setups \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "datacenter_code": "us-east",
  "flavor": "wp-6.8.2",
  "settings": {
    "php": {
      "version": "8.3"
    }
  },
  "domain": "example.com",
  "type": "node-static",
  "wordpress": {
    "language": "en_US",
    "title": "My Blog",
    "admin": {
      "user": "admin",
      "password": "S3cureP@ssw0rd",
      "email": "admin@example.com"
    }
  }
}'
{
  "setup_uuid": "0193b6d4-fabb-70e0-8ea4-cfe060a45898"
}

Get website setup status

Returns the current status of an Agency Plan website setup started via the setups endpoint.

Poll this endpoint using the setup_uuid returned from the provisioning request until status becomes completed, at which point website_uid identifies the new website.

Path Parameters
  • order_id
    Type: integer
    required

    Agency Plan order ID

  • setup_uuid
    Type: string Format: uuid
    required

    Website setup UUID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/orders/{order_id}/websites/setups/{setup_uuid}
curl /api/agency-hosting/v1/orders/123456/websites/setups/0193b6d4-fabb-70e0-8ea4-cfe060a45898 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "website_uid": "zpwlGlp19",
  "status": "running"
}

Websites

Build website NodeJS assets

Builds and deploys a Node.js application for an Agency Plan website from an already-uploaded archive.

Upload the archive to file browser first, then provide its relative path from document root in this request. Website contents are overwritten by the build result, which is deployed to public_html.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Body·
required
application/json

Build Node.js assets from an already-uploaded archive

  • archive_path
    Type: string
    required

    Directory, relative to the website document root, where the uploaded site archive currently lives. Most commonly this is simply public_html.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/agency-hosting/v1/websites/{website_uid}/build-assets
curl /api/agency-hosting/v1/websites/zpwlGlp19/build-assets \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "archive_path": "public_html"
}'
{
  "message": "Request accepted"
}

Get website details

Retrieves detailed information about a specific Agency Plan website, including configuration, status, metadata, hosting plan details, and resource quotas.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/websites/{website_uid}
curl /api/agency-hosting/v1/websites/zpwlGlp19 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "uid": "zpwlGlp19",
  "ipv4": "192.161.10.1",
  "flavor": "wp-6.2.0",
  "type": "node-static",
  "description": "Very awesome website",
  "state": "active",
  "created_at": "2024-05-29T05:49:49+00:00",
  "domains": [
    {
      "fqdn": "test.com",
      "parent_fqdn": "test.com",
      "ipv6": "2001:db8::1",
      "created_at": "2024-05-29T05:49:49+00:00",
      "nameservers": [
        "a.dns-parking.com",
        "b.dns-parking.com"
      ],
      "ssl_cert": {
        "names": [
          "test.com",
          "www.test.com"
        ],
        "expires_at": "2024-05-29T05:49:49+00:00",
        "created_at": "2024-05-29T05:49:49+00:00"
      },
      "custom_ssl_cert": {
        "is_expired": false,
        "expires_at": "2024-05-29T05:49:49+00:00",
        "created_at": "2024-05-29T05:49:49+00:00"
      }
    }
  ],
  "preview_domain": {
    "fqdn": "plum-bee-184082.hostingersite.com",
    "created_at": "2024-05-29T05:49:49+00:00"
  },
  "settings": {
    "php": {
      "version": "8.3",
      "workers": 4
    }
  },
  "wordpress": {
    "domain": "test.com",
    "title": "My Blog",
    "language": "en_US",
    "is_config_locked": true,
    "created_at": "2024-05-29T05:49:49+00:00"
  },
  "remote_access": {
    "mode": "ssh_and_sftp",
    "ssh": {
      "username": "u123456789_abcDeFg",
      "host": "192.161.10.1",
      "port": 65002,
      "is_enabled": true,
      "is_password_enabled": true
    },
    "sftp": {
      "username": "u123456789_abcDeFg",
      "host": "192.161.10.1",
      "port": 65002,
      "is_enabled": true
    }
  },
  "server": {
    "hostname": "us-west-1.hstgr.io",
    "country_code": "us"
  },
  "order": {
    "id": 123456,
    "status": "active",
    "created_at": "2024-05-29T05:49:49+00:00",
    "plan": {
      "name": "Hosting Single",
      "parameters": {
        "disk_quota_bytes": 21474836480,
        "inode_quota": 10000,
        "cpu_cores": 2,
        "memory_quota_bytes": 1073741824,
        "disk_iops_quota": 100000,
        "process_quota": 10000,
        "website_quota": 10,
        "max_databases_per_website": 5,
        "is_cdn_available": true
      }
    }
  },
  "user": {
    "username": "u123456789",
    "state": "active"
  },
  "staging_root": {
    "uid": "zpwlGlp19"
  }
}

Delete website

Permanently deletes an Agency Plan website. Deletion is processed asynchronously: the website is immediately transitioned to a deleting state and the underlying server resources are removed in the background.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/agency-hosting/v1/websites/{website_uid}
curl /api/agency-hosting/v1/websites/zpwlGlp19 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

List Agency Plan websites

Retrieve a paginated list of Agency Plan websites (H5G, Builder, and Horizons) accessible to the authenticated client.

This endpoint returns websites from your hosting accounts as well as websites from other client hosting accounts that have shared access with you.

The response shape differs per platform — see the platform field on each item.

Use website_types to list only websites of a given detected type, e.g. only WordPress websites (website_types=wordpress) or only Node.js websites (website_types=nodejs). Combine with order_ids, states, or domain for more targeted results.

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

  • order_ids
    Type: array integer[] | null

    Filter by order IDs. Accepts a comma-separated list.

  • states
    Type: array string[] | null enum

    Filter by website state. Accepts a comma-separated list.

    values
    • active
    • locked
    • suspended
    • deleting
    • deleted
  • website_types
    Type: array string[] | null enum

    Filter by detected website type, e.g. wordpress,nodejs. Accepts a comma-separated list.

    values
    • wordpress
    • builder
    • horizons
    • nodejs
    • other
  • domain
    Type: string | null

    Filter by domain name (case-insensitive substring match)

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/websites
curl /api/agency-hosting/v1/websites \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "zpwlGlp19",
      "client_id": 123,
      "order_id": 1234,
      "platform": "h5g",
      "state": "active",
      "created_at": "2024-05-29T05:49:49.067239Z",
      "plan": {
        "name": "hostinger_premium",
        "display_name": "Premium Hosting",
        "has_cdn": true
      },
      "details": {
        "uid": "zpwlGlp19",
        "ipv4": "192.161.10.1",
        "flavor": "wp-6.2.0",
        "type": "wordpress",
        "username": "u123456789",
        "description": "Very awesome website",
        "state": "active",
        "created_at": "2024-05-29T05:49:49.067239Z",
        "settings": {},
        "wordpress": null,
        "domains": [
          {}
        ],
        "preview_domain": null,
        "processes": [
          {}
        ],
        "horizons_uuid": null
      },
      "suspension_reason": "non_payment"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

List website processes

Lists active and recently completed asynchronous processes for an Agency Plan website.

Each process has a unique ID (for tracking), a type, and a status (running, completed, failed). Poll this endpoint after initiating async operations (SSL setup, backups, cloning) to track progress.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/websites/{website_uid}/processes
curl /api/agency-hosting/v1/websites/zpwlGlp19/processes \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "id": "0193b6d4-fabb-70e0-8ea4-cfe060a45898",
    "type": "backup_generation",
    "status": "running"
  }
]

WordPress

Change WordPress version

Changes the installed WordPress core version on an Agency Plan website to one of the versions available for installation.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Body·
required
application/json
  • version
    Type: string
    required

    Target WordPress core version to install. Must be one of the available versions.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/agency-hosting/v1/websites/{website_uid}/wordpress/settings/version
curl /api/agency-hosting/v1/websites/zpwlGlp19/wordpress/settings/version \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "version": "6.5.5"
}'
{
  "message": "Request accepted"
}

Get WordPress settings

Returns the current WordPress settings for an Agency Plan website: installed core version, LiteSpeed Cache plugin status, object cache status, and maintenance mode status.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/websites/{website_uid}/wordpress/settings
curl /api/agency-hosting/v1/websites/zpwlGlp19/wordpress/settings \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "core_version": "6.5.5",
  "is_lite_speed_cache_enabled": true,
  "is_object_cache_enabled": false,
  "is_maintenance_mode_enabled": false
}

List available WordPress versions

Lists the WordPress core versions available for installation on an Agency Plan website.

Path Parameters
  • website_uid
    Type: string
    required

    Agency Plan website UID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/agency-hosting/v1/websites/{website_uid}/wordpress/settings/versions
curl /api/agency-hosting/v1/websites/zpwlGlp19/wordpress/settings/versions \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "version": "6.5.5"
  }
]

Installations

Check if WordPress installations are valid

Check whether one or more WordPress installations are valid and working correctly. Detects broken installations caused by missing files, broken plugins, themes and similar issues.

Provide the WordPress installation (software) identifiers in the body. They can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
Body·
required
application/json
  • software_ids
    Type: array string[] 1…100
    required

    WordPress installation (software) identifiers to validate.

  • force
    Type: boolean

    Force fresh validation without cache. Preferable for troubleshooting purposes.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/installations/check-is-valid
curl /api/hosting/v1/accounts/u123456789/wordpress/installations/check-is-valid \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "software_ids": [
    "123",
    "456"
  ],
  "force": false
}'
[
  {
    "software_id": "123",
    "is_valid": true
  }
]

Delete WordPress installation

Delete the specified WordPress installation, with optional file and database removal. This removes all associated components including plugins, themes, staging websites and any other related data.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • delete_database
    Type: boolean

    Delete the installation database.

  • delete_files
    Type: boolean

    Delete installation files from disk.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/hosting/v1/accounts/{username}/wordpress/{software}
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789 \
  --request DELETE \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "delete_files": false,
  "delete_database": false
}'
{
  "message": "Request accepted"
}

Detect WordPress installations

Trigger a background scan to detect WordPress installations for the account.

This operation is asynchronous: a successful response only means the scan has been queued. Poll GET /api/hosting/v1/wordpress/installations to fetch the detected installations once the scan completes.

Path Parameters
  • username
    Type: string
    required
Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/installations/detect
curl /api/hosting/v1/accounts/u123456789/wordpress/installations/detect \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Import WordPress website

Import WordPress website to the specified domain.

WARNING: this overwrites the website's existing contents and cannot be undone — verify this is intended before calling this endpoint.

This endpoint allows you to import a WordPress website from archive and database files that have been uploaded to the website's directory.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • archive_path
    Type: string
    required

    Path to the WordPress archive file (relative to website root)

  • sql_path
    Type: string
    required

    Path to the database SQL file (relative to website root)

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/websites/{domain}/wordpress/import
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/wordpress/import \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "archive_path": "backup.zip",
  "sql_path": "database.sql"
}'
{
  "message": "Request accepted"
}

Install WordPress

Install WordPress on an existing website.

The website must already exist before calling this endpoint. To create a new website first, use POST /api/hosting/v1/websites and poll GET /api/hosting/v1/websites until it appears.

Call GET /api/hosting/v1/wordpress/installations filtered by username and domain before proceeding to check whether WordPress is already installed on the target domain/path. If WordPress already exists and overwrite is false (the default), the async job will fail.

This operation is asynchronous: a successful response only means the install job has been queued, not that WordPress is ready. Installation typically takes 1-2 minutes. Poll GET /api/hosting/v1/wordpress/installations filtered by username and domain to track progress. When the installation appears in that list, WordPress is ready.

Path Parameters
  • username
    Type: string
    required
Body·
required
application/json
  • credentials
    Type: object
    required

    WordPress admin credentials

  • domain
    Type: string
    required

    Domain of the existing website where WordPress will be installed

  • site_title
    Type: string
    required

    Title of the WordPress site

  • auto_updates
    Type: string | null enum

    WordPress core auto-update policy

    values
    • all
    • none
    • minor
  • database
    Type: object | null

    Optional. If the named database already exists, it will be used for this WordPress install. Otherwise a new database is created with a generated name and random credentials.

  • directory
    Type: string | null

    Relative directory to install WordPress into. Defaults to the website root when omitted.

  • language
    Type: string | null

    WordPress locale. Defaults to en_US when omitted.

  • overwrite
    Type: boolean | null

    When false (default), does not replace an existing installation. If WordPress is already installed on the domain/path, the async install job fails unless true.

  • version
    Type: string | null

    WordPress core version to install. If omitted, the latest core version compatible with the account vhost PHP version is selected.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/installations
curl /api/hosting/v1/accounts/u123456789/wordpress/installations \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain": "example.com",
  "site_title": "My site",
  "language": "en_US",
  "directory": "public_html",
  "overwrite": false,
  "auto_updates": "minor",
  "version": "6.5.2",
  "credentials": {
    "email": "owner@example.com",
    "login": "admin",
    "password": "********"
  },
  "database": {
    "name": "mydb",
    "password": "********"
  }
}'
{
  "message": "Request accepted"
}

List WordPress installations

List WordPress installations accessible to the authenticated client.

Use this endpoint to discover existing WordPress installations and to poll for installation status after calling the install endpoint. When a newly requested installation appears in this list, WordPress is ready. Filter by username and domain to narrow results to a specific website.

Each installation includes a valid flag and, when invalid, a validationError describing why.

Query Parameters
  • username
    Type: string | null

    Filter by specific username

  • domain
    Type: string | null

    Filter by domain name (case-insensitive substring match)

  • ownership
    Type: string | null enum

    Filter by ownership type. Defaults to "owned". Use "all" to include both owned and managed installations.

    values
    • owned
    • managed
    • all
Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/wordpress/installations
curl /api/hosting/v1/wordpress/installations \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "id": "123",
    "username": "u123456789",
    "domain": "example.com",
    "site_title": "My site",
    "url": "https://example.com",
    "directory": "public_html",
    "language": "en_US",
    "login": "admin",
    "email": "owner@example.com",
    "is_valid": true,
    "validation_error": "Invalid domain",
    "created_at": "2022-01-01T00:00:00Z"
  }
]

List available WordPress core updates

List available WordPress core updates for the specified installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/wordpress/{software}/updates
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/updates \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "version": "6.5.2",
    "type": "minor",
    "url": "https://wordpress.org/wordpress-6.5.2.zip"
  }
]

Get installation JWT token

Return a JWT token used to authenticate requests against the specified WordPress installation, including its MCP (Model Context Protocol) endpoint.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/wordpress/{software}/jwt-token
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/jwt-token \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9",
  "expires_in": 3600,
  "expires_at": "2024-06-05T12:08:00Z",
  "mcp_url": "https://example.com/wp-json/hostinger/mcp"
}

Show WordPress core version

Show the WordPress core version for the specified installation, along with known vulnerabilities affecting it.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/wordpress/{software}/version
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/version \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "version": "6.5.2",
  "vulnerabilities": [
    {
      "title": "Cross-Site Scripting (XSS)",
      "description": "A stored XSS vulnerability affecting older versions.",
      "affected_in": "4.7.0",
      "fixed_in": "4.7.1",
      "direct_url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/example"
    }
  ]
}

Update WordPress core

Update the WordPress core for the specified installation (minor update or a specific version).

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

This operation is asynchronous: a successful response only means the update job has been queued.

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • minor
    Type: boolean

    Update the minor version only.

  • version
    Type: string | null

    Update to a specific WordPress core version.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/{software}/update
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/update \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "minor": false,
  "version": "6.5.0"
}'
{
  "message": "Request accepted"
}

Plugins

Activate WordPress plugin

Activate an installed plugin on a WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

This operation is asynchronous: a successful response only means the activation job has been queued.

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • plugin
    Type: string
    min length:  
    1
    max length:  
    255
    required

    Slug of the installed plugin to activate.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/{software}/plugins/activate
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/plugins/activate \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "plugin": "akismet"
}'
{
  "message": "Request accepted"
}

Deactivate WordPress plugin

Deactivate an installed plugin on a WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

This operation is asynchronous: a successful response only means the deactivation job has been queued.

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • plugin
    Type: string
    min length:  
    1
    max length:  
    255
    required

    Slug of the installed plugin to deactivate.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/{software}/plugins/deactivate
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/plugins/deactivate \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "plugin": "akismet"
}'
{
  "message": "Request accepted"
}

Deploy WordPress plugin

Deploy a WordPress plugin from an already uploaded directory.

This endpoint allows you to deploy a WordPress plugin that has been uploaded to the website's directory. The plugin will be activated and made available in the WordPress admin panel.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • plugin_path
    Type: string
    required

    Relative path to the plugin directory from wp-content/plugins

  • slug
    Type: string
    required

    Slug of the plugin

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/websites/{domain}/wordpress/plugins/deploy
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/wordpress/plugins/deploy \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "slug": "my-plugin",
  "plugin_path": "my-plugin-new"
}'
{
  "message": "Request accepted"
}

Install WordPress plugins

Install one or more plugins on an existing WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field). Use GET /api/hosting/v1/wordpress/plugins to discover the plugin slugs available for installation.

This operation is asynchronous: a successful response only means the install job has been queued, not that the plugins are ready.

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • plugins
    Type: array string[] 1…20
    required

    Plugin slugs to install. Use GET /api/hosting/v1/wordpress/plugins to discover available slugs.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/{software}/plugins/install
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/plugins/install \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "plugins": [
    "akismet",
    "hello-dolly"
  ]
}'
{
  "message": "Request accepted"
}

List available WordPress plugins

List plugins recommended for installation on a WordPress installation that are not yet installed.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/wordpress/{software}/plugins/available
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/plugins/available \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "slug": "akismet",
    "title": "Akismet Anti-Spam",
    "description": "Protect your site from spam.",
    "onboarding_description_slug": "akismet_onboarding_description",
    "recommended_description_slug": "akismet_recommended_description",
    "link": "https://wordpress.org/plugins/akismet/",
    "version": "5.3",
    "required_wordpress_version": "5.8",
    "required_php_version": "7.2",
    "is_plan_upgrade_needed": false
  }
]

List installed WordPress plugins

List plugins installed on a WordPress installation, including their status, available updates and known vulnerabilities.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Query Parameters
  • category
    enum
    const:  
    cache

    Filter installed plugins by category.

    values
    • cache
Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/wordpress/{software}/plugins
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/plugins \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "name": "akismet",
    "title": "Akismet Anti-Spam",
    "version": "5.3",
    "status": "active",
    "update": "none",
    "vulnerabilities": [
      {
        "title": "Cross-Site Scripting (XSS)",
        "description": "A stored XSS vulnerability affecting older versions.",
        "affected_in": "4.7.0",
        "fixed_in": "4.7.1",
        "direct_url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/example"
      }
    ]
  }
]

Search WordPress plugins

Search the WordPress.org plugin directory for plugins available to install.

Use the returned slug values with POST /api/hosting/v1/accounts/{username}/wordpress/{software}/plugins/install.

Query Parameters
  • search
    Type: string
    min length:  
    3
    required

    Search term to match against plugin names. Minimum 3 characters.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/wordpress/plugins
curl '/api/hosting/v1/wordpress/plugins?search=seo' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "slug": "akismet",
    "title": "Akismet Anti-Spam",
    "icons": {
      "1x": "https://ps.w.org/akismet/assets/icon-128x128.png",
      "2x": "https://ps.w.org/akismet/assets/icon-256x256.png"
    },
    "description": "Used by millions, Akismet is quite possibly the best way to protect your site from spam."
  }
]

List suggested WordPress plugins

List curated plugin suggestions grouped by website type.

Use the returned slug values with POST /api/hosting/v1/accounts/{username}/wordpress/{software}/plugins/install.

Query Parameters
  • order_id
    Type: integer | null

    Optionally scope suggestions to a specific order.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/wordpress/plugins/suggested
curl /api/hosting/v1/wordpress/plugins/suggested \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "website_type": "blog",
    "plugins": [
      {
        "slug": "akismet",
        "title": "Akismet Anti-Spam",
        "description": "Protect your site from spam.",
        "onboarding_description_slug": "akismet_onboarding_description",
        "recommended_description_slug": "akismet_recommended_description",
        "link": "https://wordpress.org/plugins/akismet/",
        "version": "5.3",
        "required_wordpress_version": "5.8",
        "required_php_version": "7.2",
        "is_preselected": true,
        "is_plan_upgrade_needed": false
      }
    ]
  }
]

Check if WooCommerce is installed

Check whether WooCommerce is installed on any WordPress installation of a domain. Optionally filter by domain to scope the check.

Query Parameters
  • domain
    Type: string | null

    Filter by domain name (case-insensitive substring match)

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/wordpress/plugins/is-woocommerce-installed
curl /api/hosting/v1/wordpress/plugins/is-woocommerce-installed \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "is_installed": true
}

Uninstall WordPress plugins

Uninstall one or more plugins from a WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

This operation is asynchronous: a successful response only means the uninstall job has been queued.

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • plugins
    Type: array string[] 1…20
    required

    Slugs of the installed plugins to uninstall.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/{software}/plugins/uninstall
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/plugins/uninstall \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "plugins": [
    "akismet",
    "hello-dolly"
  ]
}'
{
  "message": "Request accepted"
}

Update Hostinger WordPress plugin

Update a Hostinger plugin to its latest version on a WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

This operation is asynchronous: a successful response only means the update job has been queued.

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • slug
    Type: string enum
    required

    Slug of the Hostinger plugin to update to its latest version.

    values
    • hostinger
    • hostinger-ai-assistant
    • hostinger-affiliate-plugin
    • hostinger-easy-onboarding
    • hostinger-reach
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/{software}/plugins/hostinger/update
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/plugins/hostinger/update \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "slug": "hostinger-affiliate-plugin"
}'
{
  "message": "Request accepted"
}

Update WordPress plugins

Update one or more installed plugins to their latest version on a WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

This operation is asynchronous: a successful response only means the update job has been queued.

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • plugins
    Type: array string[] 1…20
    required

    Slugs of the installed plugins to update to their latest version.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/{software}/plugins/update
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/plugins/update \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "plugins": [
    "akismet",
    "hello-dolly"
  ]
}'
{
  "message": "Request accepted"
}

Themes

Activate WordPress theme

Activate an installed theme on a WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

This operation is asynchronous: a successful response only means the activation job has been queued.

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • theme
    Type: string
    min length:  
    1
    max length:  
    50
    required

    Slug of the installed theme to activate.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/{software}/themes/activate
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/themes/activate \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "theme": "twentytwentyone"
}'
{
  "message": "Request accepted"
}

Deploy WordPress theme

Deploy a WordPress theme from an already uploaded directory.

This endpoint allows you to deploy a WordPress theme that has been uploaded to the website's directory. The theme can be optionally activated after deployment.

Path Parameters
  • username
    Type: string
    required
  • domain
    Type: string
    required

    Domain name

Body·
required
application/json
  • slug
    Type: string
    required

    Slug of the theme

  • theme_path
    Type: string
    required

    Relative path to the theme directory from wp-content/themes

  • is_activated
    Type: boolean | null

    Whether to activate the theme after deployment

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/websites/{domain}/wordpress/themes/deploy
curl /api/hosting/v1/accounts/u123456789/websites/mydomain.tld/wordpress/themes/deploy \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "slug": "twentytwentyone",
  "theme_path": "twentytwentyone-new",
  "is_activated": false
}'
{
  "message": "Request accepted"
}

Install WordPress theme

Install a theme on an existing WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

When the theme is one of the Hostinger themes (hostinger-blog, hostinger-affiliate-theme, hostinger-ai-theme), the optional palette, layout, and font fields are forwarded to the custom installer (defaults: palette1, layout1, default). For any other theme they are ignored.

This operation is asynchronous: a successful response only means the install job has been queued, not that the theme is ready.

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • theme
    Type: string
    min length:  
    1
    max length:  
    50
    required

    Slug of the theme to install. Hostinger theme slugs (hostinger-blog, hostinger-affiliate-theme, hostinger-ai-theme) trigger the custom installer and forward the optional palette/layout/font fields; any other WordPress theme slug uses the standard installer and ignores those fields.

  • font
    Type: string | null enum

    Font identifier. Only applied when the theme is a Hostinger theme; the default is used when omitted.

    values
    • professional
    • modern
    • elegant
    • creative
    • dynamic
    • default
  • layout
    Type: string | null
    min length:  
    1
    max length:  
    50

    Layout identifier. Only applied when the theme is a Hostinger theme; the default is used when omitted.

  • palette
    Type: string | null
    min length:  
    1
    max length:  
    50

    Palette identifier. Only applied when the theme is a Hostinger theme; the default is used when omitted.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/{software}/themes/install
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/themes/install \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "theme": "hostinger-blog",
  "palette": "palette1",
  "layout": "layout1",
  "font": "default"
}'
{
  "message": "Request accepted"
}

List installed WordPress themes

List themes installed on a WordPress installation, including their status, available updates and known vulnerabilities.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/wordpress/{software}/themes
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/themes \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "name": "twentytwentyone",
    "title": "Twenty Twenty-One",
    "version": "2.2",
    "status": "active",
    "update": "none",
    "vulnerabilities": [
      {
        "title": "Cross-Site Scripting (XSS)",
        "description": "A stored XSS vulnerability affecting older versions.",
        "affected_in": "4.7.0",
        "fixed_in": "4.7.1",
        "direct_url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/example"
      }
    ]
  }
]

List WordPress themes

List WordPress themes available to install.

Use the returned slug values with POST /api/hosting/v1/accounts/{username}/wordpress/{software}/themes/install.

Query Parameters
  • order_id
    Type: integer | null

    Optionally scope themes to a specific order.

  • search
    Type: string | null

    Search term to match against theme names.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/wordpress/themes
curl /api/hosting/v1/wordpress/themes \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "slug": "twentytwentyone",
    "title": "Twenty Twenty-One",
    "url": "https://wordpress.org/themes/twentytwentyone/",
    "featured_image_url": "https://ts.w.org/wp-content/themes/twentytwentyone/screenshot.png",
    "full_image_url": "https://ts.w.org/wp-content/themes/twentytwentyone/screenshot.png",
    "description": "A blank canvas for your ideas.",
    "logo_url": "https://ts.w.org/wp-content/themes/twentytwentyone/logo.png",
    "is_plan_upgrade_needed": false
  }
]

Uninstall WordPress themes

Uninstall one or more themes from a WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

This operation is asynchronous: a successful response only means the uninstall job has been queued.

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • themes
    Type: array string[] 1…20
    required

    Slugs of the installed themes to uninstall.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/{software}/themes/uninstall
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/themes/uninstall \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "themes": [
    "twentytwenty",
    "twentytwentyone"
  ]
}'
{
  "message": "Request accepted"
}

Update WordPress themes

Update one or more installed themes to their latest version on a WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

This operation is asynchronous: a successful response only means the update job has been queued.

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • themes
    Type: array string[] 1…20
    required

    Slugs of the installed themes to update to their latest version.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/{software}/themes/update
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/themes/update \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "themes": [
    "twentytwenty",
    "twentytwentyone"
  ]
}'
{
  "message": "Request accepted"
}

Object Cache

Show Memcached object cache status

Show the Memcached object cache status for the specified WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/wordpress/{software}/memcached/status
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/memcached/status \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "status": "active"
}

Toggle Memcached object cache

Activate or deactivate the Memcached object cache for the specified WordPress installation, based on the enabled flag.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • enabled
    Type: boolean
    required

    Activate (true) or deactivate (false) the Memcached object cache for the WordPress installation.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/hosting/v1/accounts/{username}/wordpress/{software}/memcached/toggle
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/memcached/toggle \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "enabled": true
}'
{
  "message": "Request accepted"
}

LiteSpeed Cache

Purge LiteSpeed Cache

Purge the LiteSpeed Cache for the specified WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/hosting/v1/accounts/{username}/wordpress/{software}/litespeed-cache/purge
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/litespeed-cache/purge \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Show LiteSpeed Cache status

Show the LiteSpeed Cache status for the specified WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/wordpress/{software}/litespeed-cache/status
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/litespeed-cache/status \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "is_installed": true,
  "is_active": true
}

Maintenance

Show maintenance status

Show the maintenance mode status for the specified WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/wordpress/{software}/maintenance/status
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/maintenance/status \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "status": "enabled"
}

Toggle maintenance mode

Enable or disable maintenance mode for the specified WordPress installation, based on the enabled flag.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • enabled
    Type: boolean
    required

    Enable (true) or disable (false) maintenance mode for the WordPress installation.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/hosting/v1/accounts/{username}/wordpress/{software}/maintenance/toggle
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/maintenance/toggle \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "enabled": true
}'
{
  "message": "Request accepted"
}

Login

AI Tools

Show AI option status

Show the current AI option status for the Hostinger Tools plugin on the specified WordPress installation. Filter by option to return a single option, or omit it to return all options.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Query Parameters
  • option
    Type: string | null enum

    Filter the status by a single AI option.

    values
    • llmstxt
    • web2agent
Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/hosting/v1/accounts/{username}/wordpress/{software}/hostinger-plugins/ai-option/status
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/hostinger-plugins/ai-option/status \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "is_llmstxt_enabled": true,
  "is_web2agent_enabled": false
}

Set AI option status

Enable or disable an AI option for the Hostinger Tools plugin on the specified WordPress installation.

Provide the WordPress installation (software) identifier in the path. It can be obtained from GET /api/hosting/v1/wordpress/installations (the id field).

Path Parameters
  • username
    Type: string
    required
  • software
    Type: string Pattern: ^[0-9]+$
    required

    WordPress installation (software) identifier

Body·
required
application/json
  • enable
    Type: boolean
    required

    Enable (true) or disable (false) the AI option.

  • option
    Type: string enum
    required

    AI option name

    values
    • llmstxt
    • web2agent
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/hosting/v1/accounts/{username}/wordpress/{software}/hostinger-plugins/ai-option/status
curl /api/hosting/v1/accounts/u123456789/wordpress/1232456789/hostinger-plugins/ai-option/status \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "option": "llmstxt",
  "enable": true
}'
{
  "message": "Request accepted"
}

Websites

Create and access Hostinger Horizons websites. This category includes endpoints for creating new AI-generated websites from a text prompt and retrieving links to edit existing websites in the Hostinger Horizons interface.

Create website

Create new Hostinger Horizons website from the given message.\n Use this tool when user asks you to create a website, landing page, blog or any other type of application.\n This tool initiates the website creation process and returns a website URL and ID. The generation happens asynchronously.\n After invoking this tool, your chat reply must be EXACTLY 1 sentence summarizing that Hostinger Horizons is now creating their website and it will be ready in a few minutes and you should provide the website URL to the user immediately Do not write code.\n\nTo edit afterwards, users must go to Hostinger Horizons interface in the provided website URL. If the tool call fails with an error, you should provide a clear explanation of the error and do not generate code yourself in the chat. \n TECHNOLOGY STACK CONSTRAINTS (STRICTLY ENFORCED):\n The environment is limited to the following technologies. You MUST NOT use, suggest, or implement any technology outside this list:\n \n

  • Language: JavaScript ONLY.
  • Languages like TypeScript, Rust, Python, Java, PHP, etc., are STRICTLY PROHIBITED.\n
  • Framework: React.\n
  • Navigation: React Router.\n
  • Styling: TailwindCSS.\n
  • Components: shadcn/ui (built with @radix-ui primitives).\n
  • Icons: Lucide React.\n
  • Animations: Framer Motion.\n \n BACKEND & DATA STORAGE:\n
  • Horizons integrated backend is the EXCLUSIVE solution for persistent data storage, authentication, and database needs.\n
  • Local databases (SQLite, MySQL, etc.) are STRICTLY PROHIBITED.\n
  • Third-party services (Firebase, AWS Amplify) are allowed ONLY if explicitly requested by the user.\n \n MAPS:\n
  • OpenStreetMap is the default provider.\n
  • Alternative providers (Google Maps, Mapbox) are allowed ONLY if explicitly requested by the user.\n
Body·
required
application/json
  • message
    Type: array object[]
    required
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/horizons/v1/websites
curl /api/horizons/v1/websites \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "message": [
    {
      "type": "text",
      "text": "Create a landing page for a coffee shop with a hero section, menu, and contact form"
    }
  ]
}'
{
  "website_url": "https://horizons.hostinger.com/123e4567-e89b-12d3-a456-426614174000?location=chatgpt",
  "website_id": "123e4567-e89b-12d3-a456-426614174000"
}

Get website

Get a link for the user to edit their website in Hostinger Horizons interface.\n Use this tool when user wants to modify, edit or add new features to an existing website.\n Websites can only be edited in Hostinger Horizons interface in the provided website URL.

Path Parameters
  • websiteId
    Type: string
    required

    The website ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/horizons/v1/websites/{websiteId}
curl /api/horizons/v1/websites/123e4567-e89b-12d3-a456-426614174000 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "website_url": "https://horizons.hostinger.com/123e4567-e89b-12d3-a456-426614174000?location=chatgpt"
}

Contacts

deprecated

Delete a contact

Delete a contact with the specified UUID.

This endpoint permanently removes a contact from the email marketing system.

Deprecated. This endpoint cannot target a profile, so it always falls back to the client's default profile and cannot delete contacts of any other profile. Use DELETE /api/reach/v1/profiles/{profileUuid}/contacts/{contactUuid} instead.

Path Parameters
  • uuid
    Type: string Format: uuid
    required

    UUID of the contact to delete

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/reach/v1/contacts/{uuid}
curl /api/reach/v1/contacts/123e4567-e89b-12d3-a456-426614174000 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}
deprecated

List contacts

Get a list of contacts, optionally filtered by group and subscription status.

This endpoint returns a paginated list of contacts with their basic information. You can filter contacts by group UUID and subscription status.

Deprecated. This endpoint cannot target a profile, so it always falls back to the client's default profile and cannot list contacts of any other profile. Use GET /api/reach/v1/profiles/{profileUuid}/contacts instead, which also replaces the group filter with a tag filter.

Query Parameters
  • group_uuid
    Type: string

    Filter contacts by group UUID

  • subscription_status
    Type: string enum

    Filter contacts by subscription status

    values
    • subscribed
    • unsubscribed
    • confirmed
    • pending
  • page
    Type: integer

    Page number

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/contacts
curl /api/reach/v1/contacts \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "name": "John",
      "surname": "Doe",
      "email": "john.doe@example.com",
      "subscription_status": "subscribed",
      "subscribed_at": "2023-01-01T00:00:00Z",
      "source": "sync",
      "note": "VIP customer"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Get contact details

Get the full details of a single contact.

Alongside the contact's own attributes this returns the tags assigned to it and the values it holds for the profile's custom contact fields.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • contactUuid
    Type: string Format: uuid
    required

    Contact uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/contacts/{contactUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/contacts/550e8400-e29b-41d4-a716-446655440000 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "email": "john.doe@example.com",
  "name": "John",
  "surname": "Doe",
  "phone": "+14155552671",
  "subscription_status": "subscribed",
  "subscribed_at": "2023-01-01T00:00:00Z",
  "unsubscribed_at": "2023-06-15T00:00:00Z",
  "created_at": "2022-12-01T00:00:00Z",
  "domain": "example.com",
  "source": "api",
  "note": "VIP customer",
  "tags": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "type": "custom",
      "value": "Newsletter",
      "created_at": "2025-02-27T11:54:22Z"
    }
  ],
  "fields": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "type": "text",
      "label": "Job title",
      "slug": "job_title",
      "value": "Developer",
      "selected_option_uuids": [
        "string"
      ],
      "options": [
        {
          "uuid": "550e8400-e29b-41d4-a716-446655440000",
          "label": "Gold",
          "sort_order": 0
        }
      ]
    }
  ]
}

Delete a profile contact

Permanently delete a contact from a profile.

The contact is removed together with its custom field values and tag assignments.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • contactUuid
    Type: string Format: uuid
    required

    Contact uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/reach/v1/profiles/{profileUuid}/contacts/{contactUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/contacts/550e8400-e29b-41d4-a716-446655440000 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Update a contact

Update a contact's attributes and custom field values.

Only the properties present in the request body are changed, so a partial body is enough to change a single attribute. Sending a property as null clears it.

The response carries the contact's core attributes. Read back its tags, custom field values, source and note with GET /api/reach/v1/profiles/{profileUuid}/contacts/{contactUuid}.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • contactUuid
    Type: string Format: uuid
    required

    Contact uuid parameter

Body·
required
application/json

Fields to change on a contact. Omitted properties are left untouched.

  • email
    Type: string | null
  • fields
    Type: array object[]

    Set custom field values. Omit to leave untouched, send an empty array to clear them all.

  • name
    Type: string | null
  • note
    Type: string | null
    max length:  
    75
  • phone
    Type: string | null
    max length:  
    20

    Phone number in E.164 format (leading "+" then 7-15 digits)

  • subscription_status
    Type: string | null enum
    values
    • subscribed
    • unsubscribed
    • confirmed
    • pending
  • surname
    Type: string | null
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/reach/v1/profiles/{profileUuid}/contacts/{contactUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/contacts/550e8400-e29b-41d4-a716-446655440000 \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "email": "john.doe@example.com",
  "name": "John",
  "surname": "Doe",
  "phone": "+14155552671",
  "subscription_status": "subscribed",
  "note": "VIP customer",
  "fields": [
    {
      "uuid": "",
      "value": null,
      "selected_option_uuids": [
        ""
      ]
    }
  ]
}'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "name": "John",
  "surname": "Doe",
  "email": "john.doe@example.com",
  "phone": "+14155552671",
  "subscription_status": "subscribed",
  "subscribed_at": "2023-01-01T00:00:00Z",
  "unsubscribed_at": "2023-06-15T00:00:00Z"
}

Create contacts in bulk

Create many contacts in a profile in a single call.

The contacts are imported in the background, so a success response means the import was accepted rather than finished. Contacts whose email already exists in the profile are left as they are. If double opt-in is enabled, new contacts start off pending and are sent a confirmation email.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Body·
required
application/json

Create many contacts in one call

  • contacts
    Type: array object[] 1…1000
    required
  • note
    Type: string | null
    max length:  
    75

    Note applied to every created contact

  • tag_uuids
    Type: array string[]

    Existing tags to attach to every created contact

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/reach/v1/profiles/{profileUuid}/contacts/bulk
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/contacts/bulk \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "contacts": [
    {
      "email": "john.doe@example.com",
      "name": "John",
      "surname": "Doe",
      "phone": "+14155552671"
    }
  ],
  "tag_uuids": [
    ""
  ],
  "note": "Imported from CRM"
}'
{
  "message": "Request accepted"
}

List profile contacts

Get a paginated list of contacts belonging to a profile.

Contacts can be filtered by subscription status, by tag, and by an email search term. The meta.total field of the response is the number of contacts matching the filters, so calling this endpoint without filters gives the profile's total contact count.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Query Parameters
  • subscription_status
    Type: string enum

    Filter contacts by subscription status

    values
    • subscribed
    • unsubscribed
    • confirmed
    • pending
  • tag_uuid
    Type: string Format: uuid

    Filter contacts by tag UUID

  • search
    Type: string
    max length:  
    255

    Search contacts by email

  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/contacts
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/contacts \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "name": "John",
      "surname": "Doe",
      "email": "john.doe@example.com",
      "phone": "+14155552671",
      "subscription_status": "subscribed",
      "subscribed_at": "2023-01-01T00:00:00Z",
      "unsubscribed_at": "2023-06-15T00:00:00Z",
      "source": "api",
      "note": "VIP customer"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create new contacts

Create a new contact in the email marketing system.

This endpoint allows you to create a new contact with basic information like name, email, and surname.

If double opt-in is enabled, the contact will be created with a pending status and a confirmation email will be sent.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Body·
required
application/json
  • email
    Type: string
    required
  • name
    Type: string | null
  • note
    Type: string | null
    max length:  
    75
  • phone
    Type: string | null
    max length:  
    20

    Phone number in E.164 format (leading "+" then 7-15 digits)

  • surname
    Type: string | null
  • tag_uuids
    Type: array string[]

    Existing tags to attach to the created contact

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/reach/v1/profiles/{profileUuid}/contacts
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/contacts \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "email": "john.doe@example.com",
  "name": "John",
  "surname": "Doe",
  "phone": "+14155552671",
  "note": "VIP customer",
  "tag_uuids": [
    ""
  ]
}'
{
  "message": "Request accepted"
}

Contact Fields

Delete a contact field

Delete a custom contact field.

Every value contacts hold for the field is deleted with it, and for the choice types so are its options. The contacts themselves are not affected.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • fieldUuid
    Type: string Format: uuid
    required

    Contact field uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/reach/v1/profiles/{profileUuid}/contacts/fields/{fieldUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/contacts/fields/550e8400-e29b-41d4-a716-446655440000 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Update a contact field

Rename a custom contact field and, for the choice types, replace its option set.

Options carrying a uuid are kept and relabelled, options without one are created, and any existing option left out of the list is deleted along with the values contacts hold for it. The field type and slug cannot be changed.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • fieldUuid
    Type: string Format: uuid
    required

    Contact field uuid parameter

Body·
required
application/json

Rename a custom contact field and, for the choice types, replace its option set. The field type and slug are immutable.

  • label
    Type: string
    max length:  
    255
    required
  • options
    Type: array object[] | null …100

    Replaces the option set when provided. Entries carrying a uuid are kept and relabelled, entries without one are created, and any existing option missing from the list is deleted along with the values contacts hold for it.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/reach/v1/profiles/{profileUuid}/contacts/fields/{fieldUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/contacts/fields/550e8400-e29b-41d4-a716-446655440000 \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "label": "Job title",
  "options": [
    {
      "uuid": null,
      "label": ""
    }
  ]
}'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "type": "text",
  "label": "Job title",
  "slug": "job_title",
  "options": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "label": "Gold",
      "sort_order": 0
    }
  ],
  "created_at": "2025-02-27T11:54:22Z"
}

List contact fields

Get the custom contact fields defined in a profile.

Custom fields let you store your own attributes on contacts. The returned uuids are what you pass to the contact update endpoint to set values, and choice fields also list the options available to pick from.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/contacts/fields
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/contacts/fields \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "type": "text",
    "label": "Job title",
    "slug": "job_title",
    "options": [
      {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "label": "Gold",
        "sort_order": 0
      }
    ],
    "created_at": "2025-02-27T11:54:22Z"
  }
]

Create a contact field

Define a new custom contact field in a profile.

The slug is derived from the label and, like the field type, cannot be changed later. Use the returned uuid to set values on contacts.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Body·
required
application/json

Define a custom contact field for the profile

  • label
    Type: string
    max length:  
    255
    required
  • type
    Type: string enum
    required

    Immutable once the field exists

    values
    • text
    • number
    • date
    • single_choice
    • multi_choice
  • options
    Type: array string[] 1…100
    max length:  
    255

    Required for single_choice and multi_choice, ignored for the scalar types. Labels must be unique regardless of casing.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/reach/v1/profiles/{profileUuid}/contacts/fields
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/contacts/fields \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "type": "text",
  "label": "Job title",
  "options": [
    ""
  ]
}'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "type": "text",
  "label": "Job title",
  "slug": "job_title",
  "options": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "label": "Gold",
      "sort_order": 0
    }
  ],
  "created_at": "2025-02-27T11:54:22Z"
}

Tags

Assign a contact to a tag

Assign a tag to a single contact.

Unlike the bulk endpoint this is applied immediately rather than queued. Assigning a tag the contact already carries succeeds without duplicating it.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • tagUuid
    Type: string Format: uuid
    required

    Tag uuid parameter

  • contactUuid
    Type: string Format: uuid
    required

    Contact uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/reach/v1/profiles/{profileUuid}/tags/{tagUuid}/contacts/{contactUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/tags/550e8400-e29b-41d4-a716-446655440000/contacts/550e8400-e29b-41d4-a716-446655440000 \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "type": "custom",
  "value": "Newsletter",
  "created_at": "2025-02-27T11:54:22Z"
}

Remove a contact from a tag

Remove a tag from a single contact.

Unlike the bulk endpoint this is applied immediately rather than queued. Neither the tag nor the contact is deleted.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • tagUuid
    Type: string Format: uuid
    required

    Tag uuid parameter

  • contactUuid
    Type: string Format: uuid
    required

    Contact uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/reach/v1/profiles/{profileUuid}/tags/{tagUuid}/contacts/{contactUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/tags/550e8400-e29b-41d4-a716-446655440000/contacts/550e8400-e29b-41d4-a716-446655440000 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Assign contacts to a tag

Assign a tag to many contacts at once.

Pass contact_uuids to target specific contacts, or all_contacts to target every contact in the profile. The work is queued, so a success response means it was accepted rather than finished. Contacts that already carry the tag are left alone.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • tagUuid
    Type: string Format: uuid
    required

    Tag uuid parameter

Body·
required
application/json

Contacts to assign to, or remove from, a tag

  • all_contacts
    Type: boolean

    Apply to every contact in the profile

  • contact_uuids
    Type: array string[]

    Contacts to apply the change to. Required unless all_contacts is true.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/reach/v1/profiles/{profileUuid}/tags/{tagUuid}/contacts
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/tags/550e8400-e29b-41d4-a716-446655440000/contacts \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "contact_uuids": [
    ""
  ],
  "all_contacts": false
}'
{
  "message": "Request accepted"
}

Remove contacts from a tag

Remove a tag from many contacts at once.

Pass contact_uuids to target specific contacts, or all_contacts to target every contact in the profile. The work is queued, so a success response means it was accepted rather than finished. The tag itself and the contacts are not deleted.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • tagUuid
    Type: string Format: uuid
    required

    Tag uuid parameter

Body·
required
application/json

Contacts to assign to, or remove from, a tag

  • all_contacts
    Type: boolean

    Apply to every contact in the profile

  • contact_uuids
    Type: array string[]

    Contacts to apply the change to. Required unless all_contacts is true.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/reach/v1/profiles/{profileUuid}/tags/{tagUuid}/contacts
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/tags/550e8400-e29b-41d4-a716-446655440000/contacts \
  --request DELETE \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "contact_uuids": [
    ""
  ],
  "all_contacts": false
}'
{
  "message": "Request accepted"
}

Delete a tag

Delete a tag and remove it from every contact carrying it.

The contacts themselves are not deleted. This is idempotent: deleting a tag that does not exist in the profile still succeeds.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • tagUuid
    Type: string Format: uuid
    required

    Tag uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/reach/v1/profiles/{profileUuid}/tags/{tagUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/tags/550e8400-e29b-41d4-a716-446655440000 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Rename a tag

Rename a tag.

The contacts assigned to the tag are unaffected. Names are unique within a profile, so renaming a tag to a name that is already taken is rejected.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • tagUuid
    Type: string Format: uuid
    required

    Tag uuid parameter

Body·
required
application/json

Rename a tag

  • value
    Type: string
    max length:  
    255
    required

    New tag name

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/reach/v1/profiles/{profileUuid}/tags/{tagUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/tags/550e8400-e29b-41d4-a716-446655440000 \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "value": "Newsletter"
}'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "type": "custom",
  "value": "Newsletter",
  "created_at": "2025-02-27T11:54:22Z"
}

List profile tags

Get all tags defined in a profile.

Tags are the way contacts are grouped in Reach, and can be used to filter the contact list or to build segments.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/tags
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/tags \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "type": "custom",
    "value": "Newsletter",
    "created_at": "2025-02-27T11:54:22Z"
  }
]

Create or find tags

Create tags in a profile.

Names that already exist in the profile are not duplicated: the existing tag is returned instead, so the call is safe to repeat. Every tag in the request is returned, whether it was created now or already existed.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Body·
required
application/json

Names to create. Names that already exist in the profile are returned as they are.

  • names
    Type: array string[] 1…100
    max length:  
    255
    required
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/reach/v1/profiles/{profileUuid}/tags
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/tags \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "names": [
    "Newsletter",
    "VIP",
    "Promo"
  ]
}'
[
  {
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "type": "custom",
    "value": "Newsletter",
    "created_at": "2025-02-27T11:54:22Z"
  }
]

Segments

deprecated

List segments

Get a list of all contact segments.

This endpoint returns a list of contact segments that can be used to organize contacts.

Deprecated. This endpoint cannot target a profile, so it always falls back to the client's default profile and cannot list the segments of any other profile. Use GET /api/reach/v1/profiles/{profileUuid}/segmentation/segments instead.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/segmentation/segments
curl /api/reach/v1/segmentation/segments \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Newsletter Subscribers",
    "created_at": "2025-02-27T11:54:22Z",
    "updated_at": "2025-02-27T11:54:22Z"
  }
]
deprecated

Create a new contact segment

Create a new contact segment.

This endpoint allows creating a new contact segment that can be used to organize contacts. The segment can be configured with specific criteria like email, name, subscription status, etc.

Deprecated. This endpoint cannot target a profile, so it always falls back to the client's default profile and cannot create segments in any other profile. Use POST /api/reach/v1/profiles/{profileUuid}/segmentation/segments instead.

Body·
required
application/json
  • conditions
    Type: array object[] 1…5
    required
  • logic
    Type: string enum
    required
    values
    • AND
    • OR
  • name
    Type: string
    required
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/reach/v1/segmentation/segments
curl /api/reach/v1/segmentation/segments \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "New segment name",
  "conditions": [
    {
      "operator": "equals",
      "value": "example@example.com",
      "attribute": "note"
    }
  ],
  "logic": "AND"
}'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Segment name",
  "query": {
    "conditions": [
      {
        "attribute": "email",
        "operator": "contains",
        "value": "example.com"
      }
    ],
    "logic": "and"
  },
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-02-27T11:54:22Z"
}

Count profile segment contacts

Count the contacts currently matching a segment without listing them.

Cheaper than paging through the segment contacts endpoint when only the size is needed.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • segmentUuid
    Type: string
    required

    Segment uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/segmentation/segments/{segmentUuid}/count
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/segmentation/segments/550e8400-e09b-41d4-a716-400055000000/count \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "count": 150
}

List profile segment contacts

Retrieve contacts associated with a specific segment for a given profile.

This endpoint allows you to fetch and filter contacts that belong to a particular segment, identified by its UUID, scoped to a specific profile.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • segmentUuid
    Type: string
    required

    Segment uuid parameter

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/segmentation/segments/{segmentUuid}/contacts
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/segmentation/segments/550e8400-e09b-41d4-a716-400055000000/contacts \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "name": "John",
      "surname": "Doe",
      "email": "john.doe@example.com",
      "subscription_status": "subscribed",
      "subscribed_at": "2023-01-01T00:00:00Z",
      "source": "sync",
      "note": "VIP customer"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Get profile segment details

Get a single segment of a profile, including the conditions that define it.

To retrieve the contacts currently matching those conditions, use the segment contacts endpoint instead.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • segmentUuid
    Type: string
    required

    Segment uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/segmentation/segments/{segmentUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/segmentation/segments/550e8400-e09b-41d4-a716-400055000000 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Segment name",
  "query": {
    "conditions": [
      {
        "attribute": "email",
        "operator": "contains",
        "value": "example.com"
      }
    ],
    "logic": "and"
  },
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-02-27T11:54:22Z"
}

Update a profile segment

Rename a segment and/or replace the conditions that define it.

name is always required. Omit conditions to rename without touching the conditions; supply them and they replace the existing set entirely rather than being merged into it. Contacts are never modified, but which of them match the segment can change immediately.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • segmentUuid
    Type: string
    required

    Segment uuid parameter

Body·
required
application/json

Rename a segment and/or replace the conditions that define it

  • name
    Type: string
    max length:  
    255
    required
  • conditions
    Type: array object[] 1…5

    Replaces the existing conditions entirely. Omit to keep the current ones.

  • logic
    Type: string enum

    How to combine multiple conditions. Required when conditions are given.

    values
    • AND
    • OR
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/reach/v1/profiles/{profileUuid}/segmentation/segments/{segmentUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/segmentation/segments/550e8400-e09b-41d4-a716-400055000000 \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "VIP Customers",
  "conditions": [
    {
      "attribute": "email",
      "operator": "equals",
      "value": "example@example.com"
    }
  ],
  "logic": "AND"
}'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Segment name",
  "query": {
    "conditions": [
      {
        "attribute": "email",
        "operator": "contains",
        "value": "example.com"
      }
    ],
    "logic": "and"
  },
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-02-27T11:54:22Z"
}

Delete a profile segment

Delete a segment.

Only the segment definition is removed. The contacts that matched it are left untouched.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • segmentUuid
    Type: string
    required

    Segment uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/reach/v1/profiles/{profileUuid}/segmentation/segments/{segmentUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/segmentation/segments/550e8400-e09b-41d4-a716-400055000000 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

List segment filter attributes

List every attribute a segment condition can filter on, with the operators each attribute accepts, the value format they expect and, where the value is constrained, the allowed values.

The list is profile specific: it includes the profile's custom contact fields, its tags and its 20 most recently published campaigns, so the valid attributes cannot be hardcoded. Read it before creating or updating a segment to discover the valid attribute, operator and value combinations.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/segmentation/filters/attributes
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/segmentation/filters/attributes \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "attributes": {
    "additionalProperty": {
      "name": "email",
      "type": "contacts",
      "description": "Contact email address",
      "operators": {
        "additionalProperty": {
          "operator": "equals",
          "description": "Exact match",
          "input_type": "text",
          "example": "john.doe@example.com",
          "enum_values": {
            "yes": "yes",
            "no": "no"
          }
        }
      }
    }
  },
  "logic_operators": {
    "AND": "AND",
    "OR": "OR"
  }
}

Preview contacts matching conditions

Preview the contacts matching a set of conditions without saving a segment.

The body is the same set of conditions accepted when creating or updating a segment, so this is how to check who a filter reaches, and how many, before persisting it. Nothing is stored and no contact is modified.

Call the segment filter attributes endpoint first to discover the valid attribute, operator and value combinations.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Body·
required
application/json

Conditions to preview, in the same shape accepted when creating a segment

  • conditions
    Type: array object[] 1…5
    required

    Conditions a contact must satisfy to appear in the preview

  • logic
    Type: string enum
    required

    How to combine multiple conditions

    values
    • AND
    • OR
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    min:  
    1
    max:  
    100

    Number of items per page

  • search
    Type: string

    Narrow the preview to contacts whose email matches

  • sort_by
    Type: string enum
    values
    • email
    • name
    • surname
    • phone
    • subscription_status
  • sort_direction
    Type: string enum
    values
    • asc
    • desc
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/reach/v1/profiles/{profileUuid}/segmentation/filters/contacts
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/segmentation/filters/contacts \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "conditions": [
    {
      "attribute": "email",
      "operator": "equals",
      "value": "example@example.com"
    }
  ],
  "logic": "AND",
  "page": 1,
  "per_page": 25,
  "search": "john.doe@example.com",
  "sort_by": "email",
  "sort_direction": "asc"
}'
{
  "data": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "name": "John",
      "surname": "Doe",
      "email": "john.doe@example.com",
      "phone": "+14155552671",
      "subscription_status": "subscribed",
      "subscribed_at": "2023-01-01T00:00:00Z",
      "unsubscribed_at": "2023-06-15T00:00:00Z",
      "source": "api",
      "note": "VIP customer"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

List profile segments

Get a paginated list of the segments defined in a profile.

Each entry carries the number of contacts currently matching it, which is recalculated on read rather than stored. Use count_type to count either every matching contact or only the subscribed ones.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Query Parameters
  • count_type
    Type: string enum

    Which matching contacts to count for each segment

    values
    • all
    • subscribed
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/segmentation/segments
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/segmentation/segments \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "name": "VIP Customers",
      "contacts_count": 150,
      "created_at": "2025-02-27T11:54:22Z",
      "updated_at": "2025-02-27T11:54:22Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create a profile segment

Create a segment in a profile.

A segment is a saved set of conditions rather than a fixed list, so its membership changes as contacts change. Creating one does not modify any contact.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Body·
required
application/json

Create a segment from a set of conditions

  • conditions
    Type: array object[] 1…5
    required

    Conditions a contact must satisfy to fall into the segment

  • logic
    Type: string enum
    required

    How to combine multiple conditions

    values
    • AND
    • OR
  • name
    Type: string
    max length:  
    255
    required
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/reach/v1/profiles/{profileUuid}/segmentation/segments
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/segmentation/segments \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "VIP Customers",
  "conditions": [
    {
      "attribute": "email",
      "operator": "equals",
      "value": "example@example.com"
    }
  ],
  "logic": "AND"
}'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Segment name",
  "query": {
    "conditions": [
      {
        "attribute": "email",
        "operator": "contains",
        "value": "example.com"
      }
    ],
    "logic": "and"
  },
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-02-27T11:54:22Z"
}
deprecated

List segment contacts

Retrieve contacts associated with a specific segment.

This endpoint allows you to fetch and filter contacts that belong to a particular segment, identified by its UUID.

Deprecated. This endpoint cannot target a profile, so it always falls back to the client's default profile and cannot read segments of any other profile. Use GET /api/reach/v1/profiles/{profileUuid}/segmentation/segments/{segmentUuid}/contacts instead.

Path Parameters
  • segmentUuid
    Type: string
    required

    Segment uuid parameter

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/segmentation/segments/{segmentUuid}/contacts
curl /api/reach/v1/segmentation/segments/550e8400-e09b-41d4-a716-400055000000/contacts \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "name": "John",
      "surname": "Doe",
      "email": "john.doe@example.com",
      "subscription_status": "subscribed",
      "subscribed_at": "2023-01-01T00:00:00Z",
      "source": "sync",
      "note": "VIP customer"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}
deprecated

Get segment details

Get details of a specific segment.

This endpoint retrieves information about a single segment identified by UUID. Segments are used to organize and group contacts based on specific criteria.

Deprecated. This endpoint cannot target a profile, so it always falls back to the client's default profile and cannot read segments of any other profile. Use GET /api/reach/v1/profiles/{profileUuid}/segmentation/segments/{segmentUuid} instead.

Path Parameters
  • segmentUuid
    Type: string
    required

    Segment uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/segmentation/segments/{segmentUuid}
curl /api/reach/v1/segmentation/segments/550e8400-e09b-41d4-a716-400055000000 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Segment name",
  "query": {
    "conditions": [
      {
        "attribute": "email",
        "operator": "contains",
        "value": "example.com"
      }
    ],
    "logic": "and"
  },
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-02-27T11:54:22Z"
}

Automations

Get automation details

Get a single automation with the counts of contacts that entered it, are moving through it, finished it or failed on the way.

This describes the automation itself. To see the workflow it runs, use the steps endpoint.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • automationUuid
    Type: string
    required

    Automation uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/automations/{automationUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/automations/550e8400-e09b-41d4-a716-400055000000 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Welcome series",
  "status": "active",
  "type": "welcome_series",
  "config": null,
  "events": {
    "started": 10,
    "in_progress": 5,
    "completed": 4,
    "failed": 1
  },
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-04T09:12:07Z"
}

List automations

Get a paginated list of the automations in a profile.

Every automation comes with the counts of contacts that entered it, are moving through it, finished it or failed on the way. Those counts describe the contact journey and are not email engagement metrics - for opens, clicks and unsubscribes use the campaign statistics endpoint instead.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Query Parameters
  • status
    Type: string enum

    Filter automations by status.

    There is no completed status. An automation that has finished for every contact still reports active.

    values
    • active
    • paused
    • draft
  • sort_direction
    Type: string enum

    Order automations by creation date. Newest first unless set to asc.

    values
    • asc
    • desc
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/automations
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/automations \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "name": "Welcome series",
      "status": "active",
      "type": "welcome_series",
      "config": null,
      "events": {
        "started": 10,
        "in_progress": 5,
        "completed": 4,
        "failed": 1
      },
      "created_at": "2025-02-27T11:54:22Z",
      "updated_at": "2025-03-04T09:12:07Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

List automation steps

Get the workflow of an automation as a flat list of steps.

The steps form a tree rather than a straight line: follow parent_uuid to reconstruct the branches, and use step_order to order the steps that share a parent. An automation with no steps yet returns an empty list.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • automationUuid
    Type: string
    required

    Automation uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/automations/{automationUuid}/steps
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/automations/550e8400-e09b-41d4-a716-400055000000/steps \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "parent_uuid": "2080cc86-e026-4f7b-9598-d4132f8c7c2f",
    "step_order": 1,
    "type": "action",
    "value": "send_email",
    "config": null
  }
]

Campaigns

Get campaign details

Get a single campaign with its sender, subject, template reference, targeting and delivery progress.

This describes how the campaign was set up and how far it has got. For opens, clicks and unsubscribes use the campaign statistics endpoint.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • campaignUuid
    Type: string
    required

    Campaign uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/campaigns/{campaignUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/campaigns/550e8400-e09b-41d4-a716-400055000000 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "title": "Black Friday Campaign",
  "subject": "Don't miss our Black Friday deals!",
  "sender_name": "Marketing Team",
  "sender_email": "marketing@example.com",
  "template_uuid": "2080cc86-e026-4f7b-9598-d4132f8c7c2f",
  "status": "publish",
  "type": "campaign",
  "failure_reason": "sending_limit_reached",
  "is_smart_send": false,
  "is_all_contacts": false,
  "delivery": {
    "total_sent": 100,
    "estimated_total_recipients": 900,
    "subscribers_count": 900
  },
  "segment_uuids": [
    "2080cc86-e026-4f7b-9598-d4132f8c7c2f"
  ],
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-04T09:12:07Z",
  "sent_at": "2025-03-04T09:12:07Z",
  "scheduled_at": "2025-03-04T08:00:00Z"
}

List campaigns

Get a paginated list of the campaigns in a profile.

Each campaign carries its headline engagement rates. Filter by status to find drafts, scheduled, sending or sent campaigns, keeping in mind that a fully sent campaign has the status publish. By default only regular campaigns are returned - pass type to get the emails sent by automations or the double opt-in confirmations instead.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Query Parameters
  • status
    Type: string enum

    Filter campaigns by status.

    A fully sent campaign has the status publish. There is no sent status, and campaigns can be neither paused nor archived.

    values
    • draft
    • scheduled
    • sending
    • publish
    • failed
  • type
    Type: string enum

    Filter campaigns by type.

    Defaults to campaign, which leaves out the emails sent by automations and the double opt-in confirmations.

    values
    • campaign
    • automation
    • double_opt_in
  • sort_direction
    Type: string enum

    Order campaigns by creation date. Newest first unless set to asc.

    values
    • asc
    • desc
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/campaigns
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/campaigns \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "title": "Black Friday Campaign",
      "subject": "Don't miss our Black Friday deals!",
      "sender_name": "Marketing Team",
      "sender_email": "marketing@example.com",
      "template_uuid": "2080cc86-e026-4f7b-9598-d4132f8c7c2f",
      "status": "publish",
      "type": "campaign",
      "created_at": "2025-02-27T11:54:22Z",
      "updated_at": "2025-03-04T09:12:07Z",
      "sent_at": "2025-03-04T09:12:07Z",
      "scheduled_at": "2025-03-04T08:00:00Z",
      "statistics": {
        "total_sent": 100,
        "open_rate": 42.5,
        "click_rate": 10,
        "click_to_open_rate": 23.5
      }
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create a draft campaign

Create a campaign in a profile.

The campaign is created as a draft, so nothing is sent and no contact is touched. It has no audience yet either - targeting and scheduling are not part of this request, the draft is finished and sent from the Reach interface.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Body·
required
application/json

Create a campaign in draft status

  • sender_email
    Type: string
    required

    From address of the campaign. Its domain has to be verified on the profile before the campaign can be sent.

  • sender_name
    Type: string
    max length:  
    50
    required

    From name shown to the recipients.

  • metadata
    Type: object | null

    Extra campaign fields. Any key outside the listed ones is rejected.

  • subject
    Type: string

    Subject line of the email.

  • template_uuid
    Type: string

    Template to send, as returned by the template endpoints. Can be left out and attached later, but the campaign cannot be sent without one.

  • title
    Type: string

    Name the campaign is listed under. Not shown to the recipients.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/reach/v1/profiles/{profileUuid}/campaigns
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/campaigns \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "sender_name": "Marketing Team",
  "sender_email": "marketing@example.com",
  "title": "Black Friday Campaign",
  "subject": "Don'\''t miss our Black Friday deals!",
  "template_uuid": "550e8400-e29b-41d4-a716-446655440000",
  "metadata": {
    "preheader": "Our biggest deals of the year",
    "source": "api"
  }
}'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "title": "Black Friday Campaign",
  "subject": "Don't miss our Black Friday deals!",
  "sender_name": "Marketing Team",
  "sender_email": "marketing@example.com",
  "template_uuid": "2080cc86-e026-4f7b-9598-d4132f8c7c2f",
  "status": "draft",
  "type": "campaign",
  "is_all_contacts": false,
  "metadata": {
    "preheader": "Our biggest deals of the year"
  },
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-04T09:12:07Z"
}

Get campaign performance

Get the performance of a campaign: delivery, opens, clicks and unsubscribes, with the matching rates.

Every count is unique contacts rather than raw events, so a contact who opens the same email five times is counted once.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • campaignUuid
    Type: string
    required

    Campaign uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/campaigns/{campaignUuid}/statistics
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/campaigns/550e8400-e09b-41d4-a716-400055000000/statistics \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "total_sent": 100,
  "estimated_total_recipients": 900,
  "processed_count": 100,
  "delivered_count": 90,
  "dropped_count": 2,
  "bounced_count": 8,
  "soft_bounced_count": 3,
  "opened_count": 80,
  "clicked_count": 10,
  "unsubscribed_count": 5,
  "open_rate": 42.5,
  "click_rate": 10,
  "click_to_open_rate": 23.5,
  "unsubscribe_rate": 1.5,
  "has_bounced_contacts": false
}

Templates

List email templates

Get a list of the email templates in a profile, most recently updated first.

Templates are the reusable email bodies a campaign is built from. The list is not paginated and only the metadata is returned - the template content itself is not exposed. Use the uuid of a template as the template_uuid when creating a campaign.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/templates
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/templates \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "title": "Newsletter Template",
    "created_at": "2025-02-27T11:54:22Z",
    "updated_at": "2025-03-04T09:12:07Z"
  }
]

Create an email template

Create an email template in a profile.

The template holds the HTML body a campaign reuses, so it can be created before any campaign exists. Only the template metadata comes back - keep the returned uuid to reference it as the template_uuid of a campaign.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Body·
required
application/json

Create a reusable email template

  • template_content
    Type: string
    required

    The email body as HTML. It is sanitised before it is stored, so the saved template can differ from what was sent - inline any styles the email clients need and keep the markup self-contained.

  • title
    Type: string | null
    max length:  
    255

    Name the template is listed under. Not shown to the recipients.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/reach/v1/profiles/{profileUuid}/templates
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/templates \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "template_content": "<html><body><h1>Email Template</h1><p>Hello, traveler!</p></body></html>",
  "title": "Summer Sale Draft"
}'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "title": "Newsletter Template",
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-04T09:12:07Z"
}

Forms

Get form details

Get a single form with the URL of its hosted template and the tags it applies to the contacts it captures.

There is no ready-made embed snippet in the response - either serve the template HTML yourself or build your own embed around the form uuid.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • formUuid
    Type: string
    required

    Form uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/forms/{formUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/forms/550e8400-e09b-41d4-a716-400055000000 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Newsletter signup",
  "status": "active",
  "type": "form",
  "template": {
    "uuid": "2080cc86-e026-4f7b-9598-d4132f8c7c2f",
    "path": "forms/8f2c1b9e-1f4a-4a1e-9a2b-2f3c4d5e6f70/9a1b2c3d.html",
    "url": "https://cdn-reach.hostinger.com/storage/client123/profile-uuid/form.html"
  },
  "tags": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "value": "Newsletter",
      "type": "system"
    }
  ],
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-04T09:12:07Z"
}

Delete form

Permanently delete a form together with its template.

A form that has already captured submissions cannot be deleted, so that the contacts it collected are never silently discarded - pause the form instead to stop it collecting new ones. Views alone do not block deletion.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

  • formUuid
    Type: string
    required

    Form uuid parameter

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/reach/v1/profiles/{profileUuid}/forms/{formUuid}
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/forms/550e8400-e09b-41d4-a716-400055000000 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

List forms

Get a paginated list of the signup forms in a profile.

Each form carries a reference to the template that renders it. Get the form details for a directly usable template URL and for the tags the form puts on the contacts it captures.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Query Parameters
  • page
    Type: integer

    Page number

  • per_page
    Type: integer
    max:  
    100

    Number of items per page

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/forms
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/forms \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "name": "Newsletter signup",
      "status": "active",
      "type": "form",
      "template": {
        "uuid": "2080cc86-e026-4f7b-9598-d4132f8c7c2f",
        "path": "forms/8f2c1b9e-1f4a-4a1e-9a2b-2f3c4d5e6f70/9a1b2c3d.html"
      },
      "created_at": "2025-02-27T11:54:22Z",
      "updated_at": "2025-03-04T09:12:07Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Profiles

Get profile domain DNS status

Retrieve the DNS configuration status for a profile's domain.

This endpoint reports the state of MX, SPF, DKIM and DMARC records, including the actual records found and the suggested records required for correct email delivery.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/domains/dns-status
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/domains/dns-status \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "domain": "example.com",
  "mx": {
    "actual": [
      {
        "type": "MX",
        "value": "mx1.example.com"
      }
    ],
    "suggested": [
      {
        "name": "@",
        "type": "MX",
        "value": "mx1.example.com"
      }
    ],
    "is_valid": true
  },
  "spf": {
    "actual": [
      {
        "type": "MX",
        "value": "mx1.example.com"
      }
    ],
    "suggested": [
      {
        "name": "@",
        "type": "MX",
        "value": "mx1.example.com"
      }
    ],
    "is_valid": true
  },
  "dkim": {
    "actual": [
      {
        "type": "MX",
        "value": "mx1.example.com"
      }
    ],
    "suggested": [
      {
        "name": "@",
        "type": "MX",
        "value": "mx1.example.com"
      }
    ],
    "is_valid": true
  },
  "dmarc": {
    "actual": [
      {
        "type": "MX",
        "value": "mx1.example.com"
      }
    ],
    "suggested": [
      {
        "name": "@",
        "type": "MX",
        "value": "mx1.example.com"
      }
    ],
    "is_valid": true
  }
}

Get connected sending domain

Get the sending domain connected to the profile, its verification status and any suspended sender addresses.

Campaigns only go out once a domain is connected and active, so this is the cheapest way to check that precondition before building one. A profile with no domain connected returns the same shape with every field set to null. For the individual MX, SPF, DKIM and DMARC records behind the status, use the DNS status endpoint.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/domains
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/domains \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "domain": "mail.example.com",
  "status": "active",
  "created_at": "2025-01-01T00:00:00Z",
  "updated_at": "2025-01-15T10:30:00Z",
  "suspended_sender_emails": [
    {
      "email": "newsletter@example.com",
      "email_local_part": "newsletter",
      "suspended_at": "2025-01-15T10:30:00Z"
    }
  ]
}

List plan feature access

List which plan features the profile can use.

This is the feature lock matrix, not a usage quota. available means the feature can be used right now and locked means it is not part of the base plan, so an upgrade is needed. For remaining emails, recipients and AI credits use the limits endpoint instead.

Worth checking before building something that cannot be activated afterwards, such as an automation on a plan without automation activation.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/features
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/features \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "feature": "AutomationActivation",
    "is_available": true,
    "is_locked": false
  }
]

Get remaining plan limits

Get how much of the plan is left for the current period.

Two things to keep in mind before you build alerting on this. The period is a calendar month rather than a billing anniversary, so the counters reset on the 1st no matter when the subscription started. And usage is tracked per order, so every profile on the same order shares one pool and reports the same numbers here. Only the current period is available, past usage is not kept.

Path Parameters
  • profileUuid
    Type: string
    required

    Profile uuid parameter

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles/{profileUuid}/limits
curl /api/reach/v1/profiles/550e8400-e09b-41d4-a716-400055000000/limits \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "emails": {
    "limit": 10000,
    "used": 2500,
    "remaining": 7500
  },
  "recipients": {
    "limit": 10000,
    "used": 2500,
    "remaining": 7500
  },
  "ai_credits": {
    "limit": 10000,
    "used": 2500,
    "remaining": 7500
  },
  "period_start": "2025-03-01T00:00:00Z",
  "period_end": "2025-03-31T23:59:59Z"
}

List Profiles

This endpoint returns all profiles available to the client, including their basic information.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/reach/v1/profiles
curl /api/reach/v1/profiles \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "limits": {
      "ai_messages_limit": 10,
      "subscribers_limit": 500,
      "emails_monthly_limit": 3500,
      "ai_messages_additional": 1096
    },
    "is_trial": false,
    "expires_at": "2027-10-21T05:38:23.000000Z",
    "resource_id": 44340307,
    "status": "active",
    "profiles": [
      {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "domain": "example.com",
        "created_at": "2026-01-21T07:35:04.000000Z",
        "updated_at": "2026-01-21T07:35:04.000000Z"
      }
    ]
  }
]

Actions

Track and review operations performed on your virtual machines. These endpoints provide details about specific actions—such as start, stop, or restart—including timestamps and statuses.

Get action details

Retrieve detailed information about a specific action performed on a specified virtual machine.

Use this endpoint to monitor specific VPS operation status and details.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

  • actionId
    Type: integer
    required

    Action ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines/{virtualMachineId}/actions/{actionId}
curl /api/vps/v1/virtual-machines/1268054/actions/8123712 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Get actions

Retrieve actions performed on a specified virtual machine.

Actions are operations or events that have been executed on the virtual machine, such as starting, stopping, or modifying the machine. This endpoint allows you to view the history of these actions, providing details about each action, such as the action name, timestamp, and status.

Use this endpoint to view VPS operation history and troubleshoot issues.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Query Parameters
  • page
    Type: integer

    Page number

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines/{virtualMachineId}/actions
curl /api/vps/v1/virtual-machines/1268054/actions \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": 8123712,
      "name": "action_name",
      "state": "success",
      "created_at": "2025-02-27T11:54:00Z",
      "updated_at": "2025-02-27T11:58:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Backups

Safeguard your data by managing backups. You can list available backups or restore a virtual machine from a backup.

Get backups

Retrieve backups for a specified virtual machine.

Use this endpoint to view available backup points for VPS data recovery.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Query Parameters
  • page
    Type: integer

    Page number

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines/{virtualMachineId}/backups
curl /api/vps/v1/virtual-machines/1268054/backups \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": 325,
      "size": 15240192,
      "restore_time": 3600,
      "location": "nl-srv-nodebackups",
      "created_at": "2025-02-27T11:54:22Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Restore backup

Restore a backup for a specified virtual machine.

The system will then initiate the restore process, which may take some time depending on the size of the backup.

All data on the virtual machine will be overwritten with the data from the backup.

Use this endpoint to recover VPS data from backup points.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

  • backupId
    Type: integer
    required

    Backup ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/backups/{backupId}/restore
curl /api/vps/v1/virtual-machines/1268054/backups/8676502/restore \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Data centers

Access information on available data centers, including location details, so you can choose the optimal region for deploying your virtual machines.

Data centers Operations

Get data center list

Retrieve all available data centers.

Use this endpoint to view location options before deploying VPS instances.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/data-centers
curl /api/vps/v1/data-centers \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "id": 29,
    "name": "phx",
    "location": "us",
    "city": "Phoenix",
    "continent": "North America"
  }
]

Docker Manager

Manage Docker Compose projects directly on your VPS instances. This feature is only available for VPS instances using Docker OS templates and is currently experimental - breaking changes may occur in future updates. It enables you to programmatically deploy projects from docker-compose.yml files by providing either a URL (including GitHub repositories) or the compose file contents directly. Control project lifecycle (start/stop/restart/update/delete) and retrieve runtime information including container lists, project details, and aggregated logs. All operations are scoped to a specific virtual machine for multi-tenant management.

experimental

Get project containers

Retrieves a list of all containers belonging to a specific Docker Compose project on the virtual machine.

This endpoint returns detailed information about each container including their current status, port mappings, and runtime configuration.

Use this to monitor the health and state of all services within your Docker Compose project.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

  • projectName
    Type: string
    min length:  
    3
    max length:  
    64
    required

    Docker Compose project name using alphanumeric characters, dashes, and underscores only

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines/{virtualMachineId}/docker/{projectName}/containers
curl /api/vps/v1/virtual-machines/1268054/docker/my-docker-project/containers \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "id": "bbd4c89e850d",
    "name": "nginx",
    "image": "nginx:latest",
    "command": "/docker-entrypoint.sh nginx -g daemon off;",
    "status": "Up 4 hours",
    "state": "running",
    "health": "healthy",
    "ports": [
      {
        "type": "published",
        "protocol": "tcp",
        "host_ip": "0.0.0.0",
        "host_port": 8080,
        "container_port": 80,
        "host_port_start": null,
        "host_port_end": null,
        "container_port_start": null,
        "container_port_end": null
      }
    ],
    "stats": {
      "cpu_percentage": 15.4,
      "memory_percentage": 0.4,
      "memory_used": 66532147.2,
      "memory_total": 16771847290.88,
      "net_in": 2110000,
      "net_out": 30100
    }
  }
]
experimental

Get project contents

Retrieves the complete project information including the docker-compose.yml file contents, project metadata, and current deployment status.

This endpoint provides the full configuration and state details of a specific Docker Compose project.

Use this to inspect project settings, review the compose file, or check the overall project health.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

  • projectName
    Type: string
    min length:  
    3
    max length:  
    64
    required

    Docker Compose project name using alphanumeric characters, dashes, and underscores only

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines/{virtualMachineId}/docker/{projectName}
curl /api/vps/v1/virtual-machines/1268054/docker/my-docker-project \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "content": "services:\n    my-app:\n        image: nginx\n        ports:\n            - \"80:80\"\n    my-db:\n        image: mysql",
  "environment": "VARIABLE1=value1\nVARIABLE2=value2"
}
experimental

Delete project

Completely removes a Docker Compose project from the virtual machine, stopping all containers and cleaning up associated resources including networks, volumes, and images.

This operation is irreversible and will delete all project data.

Use this when you want to permanently remove a project and free up system resources.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

  • projectName
    Type: string
    min length:  
    3
    max length:  
    64
    required

    Docker Compose project name using alphanumeric characters, dashes, and underscores only

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/vps/v1/virtual-machines/{virtualMachineId}/docker/{projectName}/down
curl /api/vps/v1/virtual-machines/1268054/docker/my-docker-project/down \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}
experimental

Get project list

Retrieves a list of all Docker Compose projects currently deployed on the virtual machine.

This endpoint returns basic information about each project including name, status, file path and list of containers with details about their names, image, status, health and ports. Container stats are omitted in this endpoint. If you need to get detailed information about container with stats included, use the Get project containers endpoint.

Use this to get an overview of all Docker projects on your VPS instance.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines/{virtualMachineId}/docker
curl /api/vps/v1/virtual-machines/1268054/docker \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "name": "my-project",
    "status": "running(2)",
    "state": "running",
    "path": "/docker/my-project/docker-compose.yaml",
    "containers": [
      {
        "id": "bbd4c89e850d",
        "name": "nginx",
        "image": "nginx:latest",
        "command": "/docker-entrypoint.sh nginx -g daemon off;",
        "status": "Up 4 hours",
        "state": "running",
        "health": "healthy",
        "ports": [
          {
            "type": "published",
            "protocol": "tcp",
            "host_ip": "0.0.0.0",
            "host_port": 8080,
            "container_port": 80,
            "host_port_start": null,
            "host_port_end": null,
            "container_port_start": null,
            "container_port_end": null
          }
        ],
        "stats": {
          "cpu_percentage": 15.4,
          "memory_percentage": 0.4,
          "memory_used": 66532147.2,
          "memory_total": 16771847290.88,
          "net_in": 2110000,
          "net_out": 30100
        }
      }
    ]
  }
]
experimental

Create new project

Deploy new project from docker-compose.yaml contents or download contents from URL.

URL can be Github repository url in format https://github.com/[user]/[repo] and it will be automatically resolved to docker-compose.yaml file in master branch. Any other URL provided must return docker-compose.yaml file contents.

If project with the same name already exists, existing project will be replaced.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Body·
required
application/json
  • content
    Type: string
    max length:  
    8192
    required

    URL pointing to docker-compose.yaml file, Github repository or raw YAML content of the compose file

  • project_name
    Type: string
    min length:  
    3
    max length:  
    64
    required

    Docker Compose project name using alphanumeric characters, dashes, and underscores only

  • environment
    Type: string | null
    max length:  
    8192

    Project environment variables

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/docker
curl /api/vps/v1/virtual-machines/1268054/docker \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "project_name": "my-project-1",
  "content": "",
  "environment": null
}'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}
experimental

Get project logs

Retrieves aggregated log entries from all services within a Docker Compose project.

This endpoint returns recent log output from each container, organized by service name with timestamps. The response contains the last 300 log entries across all services.

Use this for debugging, monitoring application behavior, and troubleshooting issues across your entire project stack.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

  • projectName
    Type: string
    min length:  
    3
    max length:  
    64
    required

    Docker Compose project name using alphanumeric characters, dashes, and underscores only

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines/{virtualMachineId}/docker/{projectName}/logs
curl /api/vps/v1/virtual-machines/1268054/docker/my-docker-project/logs \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "service": "web",
    "entries": [
      {
        "timestamp": "2024-01-15T10:30:45.123456Z",
        "line": "127.0.0.1 - - [15/Jan/2024:10:30:45 +0000] \"GET / HTTP/1.1\" 200 612"
      }
    ]
  }
]
experimental

Restart project

Restarts all services in a Docker Compose project by stopping and starting containers in the correct dependency order.

This operation preserves data volumes and network configurations while refreshing the running containers.

Use this to apply configuration changes or recover from service failures.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

  • projectName
    Type: string
    min length:  
    3
    max length:  
    64
    required

    Docker Compose project name using alphanumeric characters, dashes, and underscores only

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/docker/{projectName}/restart
curl /api/vps/v1/virtual-machines/1268054/docker/my-docker-project/restart \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}
experimental

Start project

Starts all services in a Docker Compose project that are currently stopped.

This operation brings up containers in the correct dependency order as defined in the compose file.

Use this to resume a project that was previously stopped or to start services after a system reboot.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

  • projectName
    Type: string
    min length:  
    3
    max length:  
    64
    required

    Docker Compose project name using alphanumeric characters, dashes, and underscores only

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/docker/{projectName}/start
curl /api/vps/v1/virtual-machines/1268054/docker/my-docker-project/start \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}
experimental

Stop project

Stops all running services in a Docker Compose project while preserving container configurations and data volumes.

This operation gracefully shuts down containers in reverse dependency order.

Use this to temporarily halt a project without removing data or configurations.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

  • projectName
    Type: string
    min length:  
    3
    max length:  
    64
    required

    Docker Compose project name using alphanumeric characters, dashes, and underscores only

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/docker/{projectName}/stop
curl /api/vps/v1/virtual-machines/1268054/docker/my-docker-project/stop \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}
experimental

Update project

Updates a Docker Compose project by pulling the latest image versions and recreating containers with new configurations.

This operation preserves data volumes while applying changes from the compose file.

Use this to deploy application updates, apply configuration changes, or refresh container images to their latest versions.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

  • projectName
    Type: string
    min length:  
    3
    max length:  
    64
    required

    Docker Compose project name using alphanumeric characters, dashes, and underscores only

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/docker/{projectName}/update
curl /api/vps/v1/virtual-machines/1268054/docker/my-docker-project/update \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

PTR records

Manage reverse DNS settings by creating or deleting PTR records for your virtual machines, ensuring that IP addresses correctly resolve to hostnames.

Create PTR record

Create or update a PTR (Pointer) record for a specified virtual machine.

Use this endpoint to configure reverse DNS lookup for VPS IP addresses.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

  • ipAddressId
    Type: integer
    required

    IP Address ID

Body·
required
application/json
  • domain
    Type: string
    required

    Pointer record domain

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/ptr/{ipAddressId}
curl /api/vps/v1/virtual-machines/1268054/ptr/246547 \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "domain": "example.tld"
}'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Delete PTR record

Delete a PTR (Pointer) record for a specified virtual machine.

Once deleted, reverse DNS lookups to the virtual machine's IP address will no longer return the previously configured hostname.

Use this endpoint to remove reverse DNS configuration from VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

  • ipAddressId
    Type: integer
    required

    IP Address ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/vps/v1/virtual-machines/{virtualMachineId}/ptr/{ipAddressId}
curl /api/vps/v1/virtual-machines/1268054/ptr/246547 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Firewall

Enhance network security with endpoints for creating, activating, deactivating, syncing, updating, and deleting firewalls and firewall rules for your virtual machines. This firewall applies rules at the network level, so it will take precedence over the virtual machine's internal firewall.

Access to firewall requires having at least one virtual machine.

Activate firewall

Activate a firewall for a specified virtual machine.

Only one firewall can be active for a virtual machine at a time.

Use this endpoint to apply firewall rules to VPS instances.

Path Parameters
  • firewallId
    Type: integer
    required

    Firewall ID

  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/firewall/{firewallId}/activate/{virtualMachineId}
curl /api/vps/v1/firewall/9449049/activate/1268054 \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Deactivate firewall

Deactivate a firewall for a specified virtual machine.

Use this endpoint to remove firewall protection from VPS instances.

Path Parameters
  • firewallId
    Type: integer
    required

    Firewall ID

  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/firewall/{firewallId}/deactivate/{virtualMachineId}
curl /api/vps/v1/firewall/9449049/deactivate/1268054 \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Get firewall details

Retrieve firewall by its ID and rules associated with it.

Use this endpoint to view specific firewall configuration and rules.

Path Parameters
  • firewallId
    Type: integer
    required

    Firewall ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/firewall/{firewallId}
curl /api/vps/v1/firewall/9449049 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 65224,
  "name": "HTTP and SSH only",
  "is_synced": false,
  "rules": [
    {
      "id": 24541,
      "action": "accept",
      "protocol": "TCP",
      "port": "1024:2048",
      "source": "any",
      "source_detail": "any"
    }
  ],
  "created_at": "2021-09-01T12:00:00Z",
  "updated_at": "2021-09-01T12:00:00Z"
}

Delete firewall

Delete a specified firewall.

Any virtual machine that has this firewall activated will automatically have it deactivated.

Use this endpoint to remove unused firewall configurations.

Path Parameters
  • firewallId
    Type: integer
    required

    Firewall ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/vps/v1/firewall/{firewallId}
curl /api/vps/v1/firewall/9449049 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Get firewall list

Retrieve all available firewalls.

Use this endpoint to view existing firewall configurations.

Query Parameters
  • page
    Type: integer

    Page number

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/firewall
curl /api/vps/v1/firewall \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": 65224,
      "name": "HTTP and SSH only",
      "is_synced": false,
      "rules": [
        {
          "id": 24541,
          "action": "accept",
          "protocol": "TCP",
          "port": "1024:2048",
          "source": "any",
          "source_detail": "any"
        }
      ],
      "created_at": "2021-09-01T12:00:00Z",
      "updated_at": "2021-09-01T12:00:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create new firewall

Create a new firewall.

Use this endpoint to set up new firewall configurations for VPS security.

Body·
required
application/json
  • name
    Type: string
    required
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/firewall
curl /api/vps/v1/firewall \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "My Firewall Group"
}'
{
  "id": 65224,
  "name": "HTTP and SSH only",
  "is_synced": false,
  "rules": [
    {
      "id": 24541,
      "action": "accept",
      "protocol": "TCP",
      "port": "1024:2048",
      "source": "any",
      "source_detail": "any"
    }
  ],
  "created_at": "2021-09-01T12:00:00Z",
  "updated_at": "2021-09-01T12:00:00Z"
}

Update firewall rule

Update a specific firewall rule from a specified firewall.

Any virtual machine that has this firewall activated will lose sync with the firewall and will have to be synced again manually.

Use this endpoint to modify existing firewall rules.

Path Parameters
  • firewallId
    Type: integer
    required

    Firewall ID

  • ruleId
    Type: integer
    required

    Firewall Rule ID

Body·
required
application/json
  • port
    Type: string
    required

    Port or port range, ex: 1024:2048

  • protocol
    Type: string enum
    required
    values
    • TCP
    • UDP
    • ICMP
    • GRE
    • any
  • source
    Type: string enum
    required
    values
    • any
    • custom
  • source_detail
    Type: string
    required

    IP range, CIDR, single IP or any

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/vps/v1/firewall/{firewallId}/rules/{ruleId}
curl /api/vps/v1/firewall/9449049/rules/8941182 \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "protocol": "TCP",
  "port": "443",
  "source": "any",
  "source_detail": "351.15.24.0/24"
}'
{
  "id": 24541,
  "action": "accept",
  "protocol": "TCP",
  "port": "1024:2048",
  "source": "any",
  "source_detail": "any"
}

Delete firewall rule

Delete a specific firewall rule from a specified firewall.

Any virtual machine that has this firewall activated will lose sync with the firewall and will have to be synced again manually.

Use this endpoint to remove specific firewall rules.

Path Parameters
  • firewallId
    Type: integer
    required

    Firewall ID

  • ruleId
    Type: integer
    required

    Firewall Rule ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/vps/v1/firewall/{firewallId}/rules/{ruleId}
curl /api/vps/v1/firewall/9449049/rules/8941182 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Replace all firewall rules in group

Replaces all firewall rules within a specified firewall group with the provided set of rules in a single atomic operation, instead of creating or deleting rules one by one.

Any virtual machine using this firewall group will need to be synchronized after replacing rules; pass the "sync" parameter to trigger synchronization immediately.

Path Parameters
  • firewallId
    Type: integer
    required

    Firewall ID

Body·
required
application/json
  • rules
    Type: array object[] ·
    required

    The complete set of firewall rules that atomically replaces all existing rules in the group

  • sync
    Type: boolean

    Synchronize the firewall group to all its virtual machines after replacing the rules

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/vps/v1/firewall/{firewallId}/rules
curl /api/vps/v1/firewall/9449049/rules \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "rules": [
    {
      "protocol": "TCP",
      "port": "443",
      "source": "any",
      "source_detail": "351.15.24.0/24"
    }
  ],
  "sync": true
}'
{
  "id": 65224,
  "name": "HTTP and SSH only",
  "is_synced": false,
  "rules": [
    {
      "id": 24541,
      "action": "accept",
      "protocol": "TCP",
      "port": "1024:2048",
      "source": "any",
      "source_detail": "any"
    }
  ],
  "created_at": "2021-09-01T12:00:00Z",
  "updated_at": "2021-09-01T12:00:00Z"
}

Create firewall rule

Create new firewall rule for a specified firewall.

By default, the firewall drops all incoming traffic, which means you must add accept rules for all ports you want to use.

Any virtual machine that has this firewall activated will lose sync with the firewall and will have to be synced again manually.

Use this endpoint to add new security rules to firewalls.

Path Parameters
  • firewallId
    Type: integer
    required

    Firewall ID

Body·
required
application/json
  • port
    Type: string
    required

    Port or port range, ex: 1024:2048

  • protocol
    Type: string enum
    required
    values
    • TCP
    • UDP
    • ICMP
    • GRE
    • any
  • source
    Type: string enum
    required
    values
    • any
    • custom
  • source_detail
    Type: string
    required

    IP range, CIDR, single IP or any

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/firewall/{firewallId}/rules
curl /api/vps/v1/firewall/9449049/rules \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "protocol": "TCP",
  "port": "443",
  "source": "any",
  "source_detail": "351.15.24.0/24"
}'
{
  "id": 24541,
  "action": "accept",
  "protocol": "TCP",
  "port": "1024:2048",
  "source": "any",
  "source_detail": "any"
}

Sync firewall to all assigned VMs

Sync a firewall's rules to every virtual machine it's assigned to.

Firewall can lose sync with a virtual machine if the firewall has new rules added, removed or updated.

Use this endpoint to apply updated firewall rules to all VPS instances assigned to the firewall.

Path Parameters
  • firewallId
    Type: integer
    required

    Firewall ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/firewall/{firewallId}/sync
curl /api/vps/v1/firewall/9449049/sync \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Malware scanner

Monitor your virtual machines' security using the Monarx malware scanner. Retrieve scan metrics or install/uninstall the scanner to help protect against malware threats.

Get scan metrics

Retrieve scan metrics for the Monarx malware scanner installed on a specified virtual machine.

The scan metrics provide detailed information about malware scans performed by Monarx, including number of scans, detected threats, and other relevant statistics. This information is useful for monitoring security status of the virtual machine and assessing effectiveness of the malware scanner.

Use this endpoint to monitor VPS security scan results and threat detection.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines/{virtualMachineId}/monarx
curl /api/vps/v1/virtual-machines/1268054/monarx \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "records": 1,
  "malicious": 2,
  "compromised": 3,
  "scanned_files": 193218,
  "scan_started_at": "2025-02-27T11:54:22Z",
  "scan_ended_at": "2025-03-27T11:54:22Z"
}

Install Monarx

Install the Monarx malware scanner on a specified virtual machine.

Monarx is a security tool designed to detect and prevent malware infections on virtual machines. By installing Monarx, users can enhance the security of their virtual machines, ensuring that they are protected against malicious software.

Use this endpoint to enable malware protection on VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/monarx
curl /api/vps/v1/virtual-machines/1268054/monarx \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Uninstall Monarx

Uninstall the Monarx malware scanner on a specified virtual machine.

If Monarx is not installed, the request will still be processed without any effect.

Use this endpoint to remove malware scanner from VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for delete/api/vps/v1/virtual-machines/{virtualMachineId}/monarx
curl /api/vps/v1/virtual-machines/1268054/monarx \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

OS Templates

Retrieve details of operating system templates or list all available templates to choose the right configuration when deploying or recreating virtual machines.

Get template details

Retrieve detailed information about a specific OS template for virtual machines.

Use this endpoint to view specific template specifications before deployment.

Path Parameters
  • templateId
    Type: integer
    required

    Template ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/templates/{templateId}
curl /api/vps/v1/templates/2868928 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 6523,
  "name": "Ubuntu 20.04 LTS",
  "description": "Ubuntu 20.04 LTS",
  "documentation": "https://docs.ubuntu.com"
}

Get templates

Retrieve available OS templates for virtual machines.

Use this endpoint to view operating system options before creating or recreating VPS instances.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/templates
curl /api/vps/v1/templates \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "id": 6523,
    "name": "Ubuntu 20.04 LTS",
    "description": "Ubuntu 20.04 LTS",
    "documentation": "https://docs.ubuntu.com"
  }
]

Post-install scripts

This category allows you to create, update, delete, and retrieve scripts that can be used for automated tasks after the operating system installation. Use case includes setting up software, configuring settings, or running custom commands.

Get post-install script

Retrieve post-install script by its ID.

Use this endpoint to view specific automation script details.

Path Parameters
  • postInstallScriptId
    Type: integer
    required

    Post-install script ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/post-install-scripts/{postInstallScriptId}
curl /api/vps/v1/post-install-scripts/9568314 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 325,
  "name": "My Setup Script",
  "content": "#!/bin/bash\\napt-get update\\napt-get install -y nginx",
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-19T11:54:22Z"
}

Update post-install script

Update a specific post-install script.

Use this endpoint to modify existing automation scripts.

Path Parameters
  • postInstallScriptId
    Type: integer
    required

    Post-install script ID

Body·
required
application/json
  • content
    Type: string
    required

    Content of the script

  • name
    Type: string
    required

    Name of the script

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/vps/v1/post-install-scripts/{postInstallScriptId}
curl /api/vps/v1/post-install-scripts/9568314 \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "My Script",
  "content": "#!/bin/bash\n\necho '\''Hello, World!'\''"
}'
{
  "id": 325,
  "name": "My Setup Script",
  "content": "#!/bin/bash\\napt-get update\\napt-get install -y nginx",
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-19T11:54:22Z"
}

Delete post-install script

Delete a post-install script from your account.

Use this endpoint to remove unused automation scripts.

Path Parameters
  • postInstallScriptId
    Type: integer
    required

    Post-install script ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/vps/v1/post-install-scripts/{postInstallScriptId}
curl /api/vps/v1/post-install-scripts/9568314 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Get post-install scripts

Retrieve post-install scripts associated with your account.

Use this endpoint to view available automation scripts for VPS deployment.

Query Parameters
  • page
    Type: integer

    Page number

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/post-install-scripts
curl /api/vps/v1/post-install-scripts \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": 325,
      "name": "My Setup Script",
      "content": "#!/bin/bash\\napt-get update\\napt-get install -y nginx",
      "created_at": "2025-02-27T11:54:22Z",
      "updated_at": "2025-03-19T11:54:22Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create post-install script

Add a new post-install script to your account, which can then be used after virtual machine installation.

The script contents will be saved to the file /post_install with executable attribute set and will be executed once virtual machine is installed. The output of the script will be redirected to /post_install.log. Maximum script size is 48KB.

Use this endpoint to create automation scripts for VPS setup tasks.

Body·
required
application/json
  • content
    Type: string
    required

    Content of the script

  • name
    Type: string
    required

    Name of the script

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/post-install-scripts
curl /api/vps/v1/post-install-scripts \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "My Script",
  "content": "#!/bin/bash\n\necho '\''Hello, World!'\''"
}'
{
  "id": 325,
  "name": "My Setup Script",
  "content": "#!/bin/bash\\napt-get update\\napt-get install -y nginx",
  "created_at": "2025-02-27T11:54:22Z",
  "updated_at": "2025-03-19T11:54:22Z"
}

Public Keys

Manage SSH keys for secure access. This category covers adding new public keys, attaching them to virtual machines, retrieving key lists, and deleting keys.

Attach public key

Attach existing public keys from your account to a specified virtual machine.

Multiple keys can be attached to a single virtual machine.

Use this endpoint to enable SSH key authentication for VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Body·
required
application/json
  • ids
    Type: array integer[]
    required

    Public Key IDs to attach

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/public-keys/attach/{virtualMachineId}
curl /api/vps/v1/public-keys/attach/1268054 \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "ids": [
    18232,
    10230230
  ]
}'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Delete public key

Delete a public key from your account.

Deleting public key from account does not remove it from virtual machine

Use this endpoint to remove unused SSH keys from account.

Path Parameters
  • publicKeyId
    Type: integer
    required

    Public Key ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/vps/v1/public-keys/{publicKeyId}
curl /api/vps/v1/public-keys/6672861 \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "message": "Request accepted"
}

Get public keys

Retrieve public keys associated with your account.

Use this endpoint to view available SSH keys for VPS authentication.

Query Parameters
  • page
    Type: integer

    Page number

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/public-keys
curl /api/vps/v1/public-keys \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": 325,
      "name": "My public key",
      "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..."
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create public key

Add a new public key to your account.

Use this endpoint to register SSH keys for VPS authentication.

Body·
required
application/json
  • key
    Type: string
    required
  • name
    Type: string
    required
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/public-keys
curl /api/vps/v1/public-keys \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "My Public Key",
  "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..."
}'
{
  "id": 325,
  "name": "My public key",
  "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..."
}

Recovery

Initiate or stop recovery mode to perform system rescue operations. This category enables you to boot a virtual machine into a state suitable for repairing file systems or recovering data.

Start recovery mode

Initiate recovery mode for a specified virtual machine.

Recovery mode is a special state that allows users to perform system rescue operations, such as repairing file systems, recovering data, or troubleshooting issues that prevent the virtual machine from booting normally.

Virtual machine will boot recovery disk image and original disk image will be mounted in /mnt directory.

Use this endpoint to enable system rescue operations on VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Body·
required
application/json
  • root_password
    Type: string
    required

    Temporary root password for recovery mode

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/recovery
curl /api/vps/v1/virtual-machines/1268054/recovery \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "root_password": "oMeNRustosIO"
}'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Stop recovery mode

Stop recovery mode for a specified virtual machine.

If virtual machine is not in recovery mode, this operation will fail.

Use this endpoint to exit system rescue mode and return VPS to normal operation.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/vps/v1/virtual-machines/{virtualMachineId}/recovery
curl /api/vps/v1/virtual-machines/1268054/recovery \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Snapshots

Create, restore, or delete snapshots that capture the state of your virtual machines at a given point, allowing you to quickly recover or test changes without affecting current operations.

Get snapshot

Retrieve snapshot for a specified virtual machine.

Use this endpoint to view current VPS snapshot information.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines/{virtualMachineId}/snapshot
curl /api/vps/v1/virtual-machines/1268054/snapshot \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 325,
  "restore_time": 1800,
  "created_at": "2025-02-27T11:54:22Z",
  "expires_at": "2025-03-19T11:54:22Z"
}

Create snapshot

Create a snapshot of a specified virtual machine.

A snapshot captures the state and data of the virtual machine at a specific point in time, allowing users to restore the virtual machine to that state if needed. This operation is useful for backup purposes, system recovery, and testing changes without affecting the current state of the virtual machine.

Creating new snapshot will overwrite the existing snapshot!

Use this endpoint to capture VPS state for backup and recovery purposes.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/snapshot
curl /api/vps/v1/virtual-machines/1268054/snapshot \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Delete snapshot

Delete a snapshot of a specified virtual machine.

Use this endpoint to remove VPS snapshots.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/vps/v1/virtual-machines/{virtualMachineId}/snapshot
curl /api/vps/v1/virtual-machines/1268054/snapshot \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Restore snapshot

Restore a specified virtual machine to a previous state using a snapshot.

Restoring from a snapshot allows users to revert the virtual machine to that state, which is useful for system recovery, undoing changes, or testing.

Use this endpoint to revert VPS instances to previous saved states.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/snapshot/restore
curl /api/vps/v1/virtual-machines/1268054/snapshot/restore \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Virtual machine

Get attached public keys

Retrieve public keys attached to a specified virtual machine.

Use this endpoint to view SSH keys configured for specific VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Query Parameters
  • page
    Type: integer

    Page number

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines/{virtualMachineId}/public-keys
curl /api/vps/v1/virtual-machines/1268054/public-keys \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": 325,
      "name": "My public key",
      "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..."
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Set hostname

Set hostname for a specified virtual machine.

Changing hostname does not update PTR record automatically. If you want your virtual machine to be reachable by a hostname, you need to point your domain A/AAAA records to virtual machine IP as well.

Use this endpoint to configure custom hostnames for VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Body·
required
application/json
  • hostname
    Type: string
    required
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/vps/v1/virtual-machines/{virtualMachineId}/hostname
curl /api/vps/v1/virtual-machines/1268054/hostname \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "hostname": "my.server.tld"
}'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Reset hostname

Reset hostname and PTR record of a specified virtual machine to default value.

Use this endpoint to restore default hostname configuration for VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/vps/v1/virtual-machines/{virtualMachineId}/hostname
curl /api/vps/v1/virtual-machines/1268054/hostname \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Get virtual machine details

Retrieve detailed information about a specified virtual machine.

Use this endpoint to view comprehensive VPS configuration and status.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines/{virtualMachineId}
curl /api/vps/v1/virtual-machines/1268054 \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 17923,
  "firewall_group_id": null,
  "subscription_id": "Azz353Uhl1xC54pR0",
  "data_center_id": 521,
  "plan": "KVM 4",
  "hostname": "srv17923.hstgr.cloud",
  "state": "running",
  "actions_lock": "unlocked",
  "cpus": 4,
  "memory": 8192,
  "disk": 51200,
  "bandwidth": 1073741824,
  "ns1": "1.1.1.1",
  "ns2": "8.8.8.8",
  "ipv4": [
    {
      "id": 52347,
      "address": "213.331.273.15",
      "ptr": "something.domain.tld"
    }
  ],
  "ipv6": [
    {
      "id": 52347,
      "address": "213.331.273.15",
      "ptr": "something.domain.tld"
    }
  ],
  "template": {
    "id": 6523,
    "name": "Ubuntu 20.04 LTS",
    "description": "Ubuntu 20.04 LTS",
    "documentation": "https://docs.ubuntu.com"
  },
  "created_at": "2024-09-05T07:25:36.00000Z"
}

Get virtual machines

Retrieve all available virtual machines.

Use this endpoint to view available VPS instances.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines
curl /api/vps/v1/virtual-machines \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
[
  {
    "id": 17923,
    "firewall_group_id": null,
    "subscription_id": "Azz353Uhl1xC54pR0",
    "data_center_id": 521,
    "plan": "KVM 4",
    "hostname": "srv17923.hstgr.cloud",
    "state": "running",
    "actions_lock": "unlocked",
    "cpus": 4,
    "memory": 8192,
    "disk": 51200,
    "bandwidth": 1073741824,
    "ns1": "1.1.1.1",
    "ns2": "8.8.8.8",
    "ipv4": [
      {
        "id": 52347,
        "address": "213.331.273.15",
        "ptr": "something.domain.tld"
      }
    ],
    "ipv6": [
      {
        "id": 52347,
        "address": "213.331.273.15",
        "ptr": "something.domain.tld"
      }
    ],
    "template": {
      "id": 6523,
      "name": "Ubuntu 20.04 LTS",
      "description": "Ubuntu 20.04 LTS",
      "documentation": "https://docs.ubuntu.com"
    },
    "created_at": "2024-09-05T07:25:36.00000Z"
  }
]

Purchase new virtual machine

Purchase and setup a new virtual machine.

If virtual machine setup fails for any reason, login to hPanel and complete the setup manually.

If no payment method is provided, your default payment method will be used automatically.

Use this endpoint to create new VPS instances.

Body·
required
application/json
  • item_id
    Type: string
    required

    Catalog price item ID

  • setup
    Type: object ·
    required
  • coupons
    Type: array

    Discount coupon codes

  • payment_method_id
    Type: integer

    Payment method ID, default will be used if not provided

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines
curl /api/vps/v1/virtual-machines \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "item_id": "hostingercom-vps-kvm2-usd-1m",
  "payment_method_id": 1327362,
  "setup": {
    "template_id": 1130,
    "data_center_id": 19,
    "post_install_script_id": 6324,
    "password": "oMeNRustosIO",
    "hostname": "my.server.tld",
    "install_monarx": false,
    "enable_backups": true,
    "ns1": "4.3.2.1",
    "ns2": "1.2.3.4",
    "public_key": {
      "name": "my-key",
      "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC2X..."
    }
  },
  "coupons": []
}'
{
  "order": {
    "id": 2957086,
    "subscription_id": "Azz353Uhl1xC54pR0",
    "status": "completed",
    "currency": "USD",
    "subtotal": 899,
    "total": 1088,
    "billing_address": {
      "first_name": "John",
      "last_name": "Doe",
      "company": null,
      "address_1": null,
      "address_2": null,
      "city": null,
      "state": null,
      "zip": null,
      "country": "NL",
      "phone": null,
      "email": "john@doe.tld"
    },
    "created_at": "2025-02-27T11:54:22Z",
    "updated_at": "2025-03-27T11:54:22Z"
  },
  "virtual_machine": {
    "id": 17923,
    "firewall_group_id": null,
    "subscription_id": "Azz353Uhl1xC54pR0",
    "data_center_id": 521,
    "plan": "KVM 4",
    "hostname": "srv17923.hstgr.cloud",
    "state": "running",
    "actions_lock": "unlocked",
    "cpus": 4,
    "memory": 8192,
    "disk": 51200,
    "bandwidth": 1073741824,
    "ns1": "1.1.1.1",
    "ns2": "8.8.8.8",
    "ipv4": [
      {
        "id": 52347,
        "address": "213.331.273.15",
        "ptr": "something.domain.tld"
      }
    ],
    "ipv6": [
      {
        "id": 52347,
        "address": "213.331.273.15",
        "ptr": "something.domain.tld"
      }
    ],
    "template": {
      "id": 6523,
      "name": "Ubuntu 20.04 LTS",
      "description": "Ubuntu 20.04 LTS",
      "documentation": "https://docs.ubuntu.com"
    },
    "created_at": "2024-09-05T07:25:36.00000Z"
  }
}

Get metrics

Retrieve historical metrics for a specified virtual machine.

It includes the following metrics:

  • CPU usage
  • Memory usage
  • Disk usage
  • Network usage
  • Uptime

Use this endpoint to monitor VPS performance and resource utilization over time.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Query Parameters
  • date_from
    Type: string Format: date-time
    required

    the date-time notation as defined by RFC 3339, section 5.6, for example, 2017-07-21T17:32:28Z

  • date_to
    Type: string Format: date-time
    required

    the date-time notation as defined by RFC 3339, section 5.6, for example, 2017-07-21T17:32:28Z

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/api/vps/v1/virtual-machines/{virtualMachineId}/metrics
curl '/api/vps/v1/virtual-machines/1268054/metrics?date_from=null&date_to=null' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "cpu_usage": {
    "unit": "%",
    "usage": {
      "1742269632": 1.45
    }
  },
  "ram_usage": {
    "unit": "bytes",
    "usage": {
      "1742269632": 554176512
    }
  },
  "disk_space": {
    "unit": "bytes",
    "usage": {
      "1742269632": 2620018688
    }
  },
  "outgoing_traffic": {
    "unit": "bytes",
    "usage": {
      "1742269632": 784800
    }
  },
  "incoming_traffic": {
    "unit": "bytes",
    "usage": {
      "1742269632": 8978400
    }
  },
  "uptime": {
    "unit": "milliseconds",
    "usage": {
      "1742269632": 455248
    }
  }
}

Set nameservers

Set nameservers for a specified virtual machine.

Be aware, that improper nameserver configuration can lead to the virtual machine being unable to resolve domain names.

Use this endpoint to configure custom DNS resolvers for VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Body·
required
application/json
  • ns1
    Type: string
    required
  • ns2
    Type: string | null
  • ns3
    Type: string | null
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/vps/v1/virtual-machines/{virtualMachineId}/nameservers
curl /api/vps/v1/virtual-machines/1268054/nameservers \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "ns1": "4.3.2.1",
  "ns2": "1.2.3.4",
  "ns3": "5.2.3.4"
}'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Set panel password

Set panel password for a specified virtual machine.

If virtual machine does not use panel OS, the request will still be processed without any effect. Requirements for password are same as in the recreate virtual machine endpoint.

Use this endpoint to configure control panel access credentials for VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Body·
required
application/json
  • password
    Type: string
    min length:  
    8
    Format: password
    required

    Panel password for the virtual machine

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/vps/v1/virtual-machines/{virtualMachineId}/panel-password
curl /api/vps/v1/virtual-machines/1268054/panel-password \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "password": "oMeNRustosIO"
}'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Recreate virtual machine

Recreate a virtual machine from scratch.

The recreation process involves reinstalling the operating system and resetting the virtual machine to its initial state. Snapshots, if there are any, will be deleted.

Password Requirements

Password will be checked against leaked password databases. Requirements for the password are:

  • At least 12 characters long
  • At least one uppercase letter
  • At least one lowercase letter
  • At least one number
  • Is not leaked publicly

This operation is irreversible and will result in the loss of all data stored on the virtual machine!

Use this endpoint to completely rebuild VPS instances with fresh OS installation.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Body·
required
application/json
  • template_id
    Type: integer
    required

    Template ID

  • panel_password
    Type: string
    min length:  
    12
    Format: password

    Panel password for the panel-based OS template. If not provided, random password will be generated. If OS does not support panel_password this field will be ignored. Password will not be shown in the response.

  • password
    Type: string
    min length:  
    12
    Format: password

    Root password for the virtual machine. If not provided, random password will be generated. Password will not be shown in the response.

  • post_install_script_id
    Type: integer

    Post-install script to execute after virtual machine was recreated

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/recreate
curl /api/vps/v1/virtual-machines/1268054/recreate \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "template_id": 1130,
  "password": "oMeNRustosIO",
  "panel_password": "Mna58c17a4d",
  "post_install_script_id": 6324
}'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Restart virtual machine

Restart a specified virtual machine by fully stopping and starting it.

If the virtual machine was stopped, it will be started.

Use this endpoint to reboot VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/restart
curl /api/vps/v1/virtual-machines/1268054/restart \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Set root password

Set root password for a specified virtual machine.

Requirements for password are same as in the recreate virtual machine endpoint.

Use this endpoint to update administrator credentials for VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Body·
required
application/json
  • password
    Type: string
    min length:  
    12
    Format: password
    required

    Root password for the virtual machine

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for put/api/vps/v1/virtual-machines/{virtualMachineId}/root-password
curl /api/vps/v1/virtual-machines/1268054/root-password \
  --request PUT \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "password": "oMeNRustosIO"
}'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Setup purchased virtual machine

Setup newly purchased virtual machine with initial state.

Use this endpoint to configure and initialize purchased VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Body·
required
application/json
  • data_center_id
    Type: integer
    required

    Data center ID

  • template_id
    Type: integer
    required

    Template ID

  • enable_backups
    Type: boolean

    Enable weekly backup schedule

  • hostname
    Type: string

    Override default hostname of the virtual machine

  • install_monarx
    Type: boolean

    Install Monarx malware scanner (if supported)

  • ns1
    Type: string

    Name server 1

  • ns2
    Type: string

    Name server 2

  • password
    Type: string
    min length:  
    12
    Format: password

    Password for the virtual machine. If not provided, random password will be generated. Password will not be shown in the response.

  • post_install_script_id
    Type: integer

    Post-install script ID

  • public_key
    Type: object

    Use SSH key

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/setup
curl /api/vps/v1/virtual-machines/1268054/setup \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "template_id": 1130,
  "data_center_id": 19,
  "post_install_script_id": 6324,
  "password": "oMeNRustosIO",
  "hostname": "my.server.tld",
  "install_monarx": false,
  "enable_backups": true,
  "ns1": "4.3.2.1",
  "ns2": "1.2.3.4",
  "public_key": {
    "name": "my-key",
    "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC2X..."
  }
}'
{
  "id": 17923,
  "firewall_group_id": null,
  "subscription_id": "Azz353Uhl1xC54pR0",
  "data_center_id": 521,
  "plan": "KVM 4",
  "hostname": "srv17923.hstgr.cloud",
  "state": "running",
  "actions_lock": "unlocked",
  "cpus": 4,
  "memory": 8192,
  "disk": 51200,
  "bandwidth": 1073741824,
  "ns1": "1.1.1.1",
  "ns2": "8.8.8.8",
  "ipv4": [
    {
      "id": 52347,
      "address": "213.331.273.15",
      "ptr": "something.domain.tld"
    }
  ],
  "ipv6": [
    {
      "id": 52347,
      "address": "213.331.273.15",
      "ptr": "something.domain.tld"
    }
  ],
  "template": {
    "id": 6523,
    "name": "Ubuntu 20.04 LTS",
    "description": "Ubuntu 20.04 LTS",
    "documentation": "https://docs.ubuntu.com"
  },
  "created_at": "2024-09-05T07:25:36.00000Z"
}

Start virtual machine

Start a specified virtual machine.

If the virtual machine is already running, the request will still be processed without any effect.

Use this endpoint to power on stopped VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/start
curl /api/vps/v1/virtual-machines/1268054/start \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Stop virtual machine

Stop a specified virtual machine.

If the virtual machine is already stopped, the request will still be processed without any effect.

This is a compute-only power state change and does not affect billing. To stop future charges, disable auto-renewal on the owning subscription.

Use this endpoint to power off running VPS instances.

Path Parameters
  • virtualMachineId
    Type: integer
    required

    Virtual Machine ID

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/vps/v1/virtual-machines/{virtualMachineId}/stop
curl /api/vps/v1/virtual-machines/1268054/stop \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": 8123712,
  "name": "action_name",
  "state": "success",
  "created_at": "2025-02-27T11:54:00Z",
  "updated_at": "2025-02-27T11:58:00Z"
}

Stores

Manage your online stores. This category includes endpoints for listing and creating stores associated with your account, and deleting stores you no longer need.

Delete store

Soft-delete a store owned by your account.

The underlying store data is preserved; only the store is marked as deleted.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to delete.

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/ecommerce/v1/stores/{store_id}
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "id": "store_01J8Z5F8W9K8M4A7B3C2D1E0FG",
  "is_deleted": true
}

Get stores

Retrieve the stores associated with your account.

Query Parameters
  • page
    Type: integer

    Page number

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/ecommerce/v1/stores
curl /api/ecommerce/v1/stores \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "store_01J8Z5F8W9K8M4A7B3C2D1E0FG",
      "name": "My Store",
      "created_at": "2026-01-21T07:35:04.000000Z",
      "updated_at": "2026-01-21T07:35:04.000000Z",
      "version": "v2_standalone",
      "company_name": "My Company"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create store

Create a new store for your account.

A primary sales channel is created alongside the store.

Body·
required
application/json
  • company_email
    Type: string
  • company_name
    Type: string
  • country_code
    Type: string
    min length:  
    2
    max length:  
    2

    ISO 3166-1 alpha-2 country code.

  • language
    Type: string
    min length:  
    2
    max length:  
    2

    ISO 639-1 language code.

  • name
    Type: string
    max length:  
    255
  • sales_channel
    Type: object
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/ecommerce/v1/stores
curl /api/ecommerce/v1/stores \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "My Store",
  "country_code": "us",
  "company_email": "owner@example.com",
  "company_name": "My Company",
  "language": "en",
  "sales_channel": {
    "type": "custom",
    "external_id": null
  }
}'
{
  "store": {
    "id": "store_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "name": "My Store",
    "company_name": "My Company",
    "h_panel_id": "1234567",
    "created_at": "2026-01-21T07:35:04.000000Z",
    "default_currency_code": "usd"
  },
  "sales_channel": {
    "id": "scha_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "type": "custom",
    "external_id": null
  }
}

Get store metadata

Get a store's readiness metadata: whether payment methods and shipping are configured, plus its default currency. Useful to verify prerequisites before building a storefront.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to read metadata for.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/ecommerce/v1/stores/{store_id}/metadata
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/metadata \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "metadata": {
    "has_payment_methods": true,
    "has_shipping": true,
    "default_currency_code": "eur",
    "default_currency": {
      "code": "eur",
      "symbol": "€",
      "symbol_native": "€",
      "name": "Euro",
      "name_plural": "Euros",
      "decimal_digits": 2,
      "rounding": 0,
      "template": "€$1",
      "min_amount": 50
    }
  }
}

Sales channels

List sales channels

List a store's active sales channels with their full metadata.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to list sales channels for.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/ecommerce/v1/stores/{store_id}/sales-channels
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/sales-channels \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "sales_channels": [
    {
      "id": "scha_01J8Z5F8W9K8M4A7B3C2D1E0FG",
      "type": "custom",
      "is_primary": false,
      "is_active": true,
      "external_id": null,
      "name": "Vintagio Onepager",
      "domain": "https://www.bestshirt.vintagio.com"
    }
  ]
}

Create a sales channel

Create a sales channel for a store. A "custom" channel is headless: build your own frontend and keep your catalog, orders, shipping and payments in sync through the Ecommerce API. A "quick-link" channel is a hosted one-page store whose handle is auto-generated.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to create the sales channel for.

Body·
required
application/json
  • type
    Type: string enum
    required

    Sales channel type. "custom" is a headless channel: it requires a name and takes an optional public url. "quick-link" is a one-page store whose handle is auto-generated; it supports neither name nor url.

    values
    • custom
    • quick-link
  • name
    Type: string
    max length:  
    100

    Merchant-facing custom name. Required for custom channels; not supported for quick-link.

  • url
    Type: string | null
    max length:  
    2048

    Optional public url for the channel. Custom channels only; not supported for quick-link.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/ecommerce/v1/stores/{store_id}/sales-channels
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/sales-channels \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "type": "custom",
  "name": "Vintagio Onepager",
  "url": "https://www.bestshirt.vintagio.com"
}'
{
  "sales_channel": {
    "id": "scha_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "type": "custom",
    "is_primary": false,
    "is_active": true,
    "external_id": null,
    "name": "Vintagio Onepager",
    "domain": "https://www.bestshirt.vintagio.com"
  }
}

Update sales channel

Update a custom sales channel. The merchant-facing name and the public url (returned as the channel domain) can be changed. Pass null to clear a value.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store that owns the sales channel.

  • sales_channel_id
    Type: string
    required

    The ID of the sales channel to update.

Body·
required
application/json
  • name
    Type: string | null
    max length:  
    100

    Merchant-facing custom name shown in the sales channels list. Pass null to clear it.

  • url
    Type: string | null
    max length:  
    2048

    Public address where the custom sales channel lives. Pass null to clear it.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/ecommerce/v1/stores/{store_id}/sales-channels/{sales_channel_id}
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/sales-channels/scha_01J8Z5F8W9K8M4A7B3C2D1E0FG \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "Vintagio Onepager",
  "url": "https://www.bestshirt.vintagio.com"
}'
{
  "sales_channel": {
    "id": "scha_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "type": "custom",
    "is_primary": false,
    "is_active": true,
    "external_id": null,
    "name": "Vintagio Onepager",
    "domain": "https://www.bestshirt.vintagio.com"
  }
}

Products

Create a product image upload URL

Returns a signed URL to upload a product image to (multipart/form-data POST). Then call the attach-image endpoint with the returned object_name to scan and attach it to the product.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store the product belongs to.

  • product_id
    Type: string
    required

    The ID of the product the image will be attached to.

Responses
  • application/json
  • application/json
  • application/json
Request Example for post/api/ecommerce/v1/stores/{store_id}/products/{product_id}/images/upload-url
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/products/prod_01J8Z5F8W9K8M4A7B3C2D1E0FG/images/upload-url \
  --request POST \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "upload_url": "https://storage.googleapis.com/ecommerce-quarantine-euw3",
  "fields": {
    "additionalProperty": "string"
  },
  "object_name": "store_01J8Z5F8W9K8M4A7B3C2D1E0FG/01J8Z5F8W9K8M4A7B3C2D1E0FG",
  "max_bytes": 15728640
}

Delete a product

Delete a product and its variants from the store. A subscription product with active subscribers is archived instead of deleted so its data stays available.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store that owns the product.

  • product_id
    Type: string
    required

    The ID of the product to delete.

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/ecommerce/v1/stores/{store_id}/products/{product_id}
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/products/prod_01J8Z5F8W9K8M4A7B3C2D1E0FG \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": {
    "id": "prod_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "is_deleted": true,
    "is_archived": false
  }
}

Update a product

Update a product's name, description or status. Set status to published to make it buyable, draft to hide it, or archived to retire it. Variants, prices and inventory are managed through the variant endpoints, not here. Returns the updated product summary.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store that owns the product.

  • product_id
    Type: string
    required

    The ID of the product to update.

Body·
required
application/json
  • description
    Type: string
    max length:  
    5000

    The product description.

  • name
    Type: string
    max length:  
    255

    The product name.

  • status
    Type: string enum

    Set "published" to make the product buyable, "draft" to hide it, or "archived" to retire it.

    values
    • draft
    • published
    • archived
Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/ecommerce/v1/stores/{store_id}/products/{product_id}
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/products/prod_01J8Z5F8W9K8M4A7B3C2D1E0FG \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "Blue T-Shirt",
  "description": "Soft combed cotton, unisex fit.",
  "status": "published"
}'
{
  "data": {
    "id": "prod_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "title": "Blue T-Shirt",
    "status": "published",
    "thumbnail": "https://cdn.example.com/prod/thumb.jpg",
    "type": "physical",
    "variant_count": 3,
    "price_range": {
      "min": 1999,
      "max": 2499,
      "currency_code": "usd"
    },
    "variants": [
      {
        "id": "variant_01J8Z5F8W9K8M4A7B3C2D1E0FG",
        "title": "Medium",
        "sku": "TSHIRT-BLU-M",
        "options": [
          {
            "name": "Size",
            "value": "M"
          }
        ],
        "prices": [
          {
            "amount": 1999,
            "sale_amount": null,
            "currency_code": "usd"
          }
        ],
        "inventory_quantity": 42,
        "manage_inventory": true
      }
    ],
    "media": [
      {
        "url": "https://cdn.example.com/prod/1.jpg",
        "type": "image",
        "is_thumbnail": true
      }
    ]
  }
}

Create digital product

Create a published digital product with a single variant and an optional external download link.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to create the product in.

Body·
required
application/json
  • name
    Type: string
    max length:  
    255
    required

    The product name.

  • price
    Type: integer
    min:  
    1
    required

    Price in the smallest currency unit (e.g. cents). Must be positive.

  • currency
    Type: string | null
    min length:  
    3
    max length:  
    3

    ISO 4217 currency code. Defaults to the store's default currency when omitted.

  • description
    Type: string | null
    max length:  
    5000

    The product description.

  • download_url
    Type: string | null
    max length:  
    2048

    Optional external download link delivered to the customer after purchase.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/ecommerce/v1/stores/{store_id}/products/digital
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/products/digital \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "My eBook",
  "price": 999,
  "description": "A digital download.",
  "currency": "usd",
  "download_url": "https://example.com/downloads/ebook.pdf"
}'
{
  "product": {
    "id": "prod_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "title": "My Product",
    "type": "physical",
    "status": "published",
    "price": 1000,
    "currency_code": "usd"
  },
  "admin_url": "https://admin.example.com/store_01.../products/edit?product=prod_01..."
}

List products

List a store's products newest first as lean summaries (name, status, thumbnail, variant count and price range). Prices are integers in the smallest currency unit and live on variants. Filter by status, free text or a set of product ids. Use include=variants to embed each product's variants with prices and inventory, and include=media to embed its media.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to list products for.

Query Parameters
  • product_ids
    Type: array string[]

    Restrict to these product ids. Doubles as a single-product lookup. Up to 200 ids.

  • status
    Type: array string[] enum

    Product statuses to include.

    values
    • draft
    • proposed
    • published
    • rejected
    • archived
  • q
    Type: string

    Free-text search over product title and SKU.

  • include
    Type: array string[] enum

    Opt-in heavy data: "variants" embeds each product's variants; "media" embeds its media.

    values
    • variants
    • media
  • page
    Type: integer

    Page number

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/ecommerce/v1/stores/{store_id}/products
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/products \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "prod_01J8Z5F8W9K8M4A7B3C2D1E0FG",
      "title": "Blue T-Shirt",
      "status": "published",
      "thumbnail": "https://cdn.example.com/prod/thumb.jpg",
      "type": "physical",
      "variant_count": 3,
      "price_range": {
        "min": 1999,
        "max": 2499,
        "currency_code": "usd"
      },
      "variants": [
        {
          "id": "variant_01J8Z5F8W9K8M4A7B3C2D1E0FG",
          "title": "Medium",
          "sku": "TSHIRT-BLU-M",
          "options": [
            {
              "name": "Size",
              "value": "M"
            }
          ],
          "prices": [
            {
              "amount": 1999,
              "sale_amount": null,
              "currency_code": "usd"
            }
          ],
          "inventory_quantity": 42,
          "manage_inventory": true
        }
      ],
      "media": [
        {
          "url": "https://cdn.example.com/prod/1.jpg",
          "type": "image",
          "is_thumbnail": true
        }
      ]
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create physical product

Create a published physical product with a single variant priced in the store currency.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to create the product in.

Body·
required
application/json
  • name
    Type: string
    max length:  
    255
    required

    The product name.

  • price
    Type: integer
    min:  
    1
    required

    Price in the smallest currency unit (e.g. cents). Must be positive.

  • currency
    Type: string | null
    min length:  
    3
    max length:  
    3

    ISO 4217 currency code. Defaults to the store's default currency when omitted.

  • description
    Type: string | null
    max length:  
    5000

    The product description.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/ecommerce/v1/stores/{store_id}/products/physical
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/products/physical \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "name": "My Product",
  "price": 1000,
  "description": "A great product.",
  "currency": "usd"
}'
{
  "product": {
    "id": "prod_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "title": "My Product",
    "type": "physical",
    "status": "published",
    "price": 1000,
    "currency_code": "usd"
  },
  "admin_url": "https://admin.example.com/store_01.../products/edit?product=prod_01..."
}

Upload and attach a product image

Fetch a raster image (JPEG, PNG, GIF or WebP, max 15MB) from a URL and attach it to a product in a single call. The image is virus-scanned and validated by content, then stored on the CDN. Set is_thumbnail to make it the product's primary image.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store the product belongs to.

  • product_id
    Type: string
    required

    The ID of the product to attach the image to.

Body·
required
application/json
  • image_url
    Type: string
    max length:  
    2048

    Publicly reachable URL of the raster image (JPEG, PNG, GIF or WebP), maximum 15MB. The image is fetched, virus-scanned and validated by content, then stored on the CDN. SVG is not accepted. Provide either this or object_name.

  • is_thumbnail
    Type: boolean | null

    When true, the image becomes the product's thumbnail (primary image). When omitted, it becomes the thumbnail only if the product does not have one yet.

  • object_name
    Type: string
    max length:  
    1024

    Key returned by the upload-url endpoint. Provide this instead of image_url to attach an uploaded image.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/ecommerce/v1/stores/{store_id}/products/{product_id}/images
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/products/prod_01J8Z5F8W9K8M4A7B3C2D1E0FG/images \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "image_url": "https://images.example.com/product.png",
  "object_name": "store_01J8Z5F8W9K8M4A7B3C2D1E0FG/01J8Z5F8W9K8M4A7B3C2D1E0FG",
  "is_thumbnail": true
}'
{
  "url": "https://cdn.example.com/store_01.../assets/01J8Z5F8W9K8M4A7B3C2D1E0FG.png",
  "is_thumbnail": true
}

Product variants

Update product variants in batch

Update up to 100 existing variants in place by id — title, inventory, stock tracking and prices. Variants omitted from the request are left untouched. Prices replace the variant's existing prices in full. Returns the updated variants.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store that owns the product.

  • product_id
    Type: string
    required

    The ID of the product whose variants are being updated.

Body·
required
application/json
  • variants
    Type: array object[] 1…100
    required

    Variants to update in place by id, up to 100. Variants omitted from the list are left untouched.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for patch/api/ecommerce/v1/stores/{store_id}/products/{product_id}/variants/batch
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/products/prod_01J8Z5F8W9K8M4A7B3C2D1E0FG/variants/batch \
  --request PATCH \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "variants": [
    {
      "variant_id": "variant_01J8Z5F8W9K8M4A7B3C2D1E0FG",
      "title": "Red / L",
      "inventory_quantity": 42,
      "manage_inventory": true,
      "prices": [
        {
          "amount": 1999,
          "sale_amount": 1499,
          "currency": "usd"
        }
      ]
    }
  ]
}'
{
  "data": [
    {
      "id": "variant_01J8Z5F8W9K8M4A7B3C2D1E0FG",
      "title": "Red / M",
      "sku": "TSHIRT-RED-M",
      "options": [
        {
          "name": "Size",
          "value": "M"
        }
      ],
      "prices": [
        {
          "amount": 1999,
          "sale_amount": null,
          "currency_code": "usd"
        }
      ],
      "inventory_quantity": 42,
      "manage_inventory": true
    }
  ]
}

Delete a product variant

Delete a single variant from the product.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store that owns the product.

  • product_id
    Type: string
    required

    The ID of the product that owns the variant.

  • variant_id
    Type: string
    required

    The ID of the variant to delete.

Responses
  • application/json
  • application/json
  • application/json
Request Example for delete/api/ecommerce/v1/stores/{store_id}/products/{product_id}/variants/{variant_id}
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/products/prod_01J8Z5F8W9K8M4A7B3C2D1E0FG/variants/variant_01J8Z5F8W9K8M4A7B3C2D1E0FG \
  --request DELETE \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": {
    "id": "variant_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "is_deleted": true
  }
}

List product variants

List a product's variants, ordered by rank, with their options, prices and inventory. Prices are integers in the smallest currency unit and live on variants.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store that owns the product.

  • product_id
    Type: string
    required

    The ID of the product to list variants for.

Query Parameters
  • page
    Type: integer

    Page number

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/ecommerce/v1/stores/{store_id}/products/{product_id}/variants
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/products/prod_01J8Z5F8W9K8M4A7B3C2D1E0FG/variants \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "variant_01J8Z5F8W9K8M4A7B3C2D1E0FG",
      "title": "Red / M",
      "sku": "TSHIRT-RED-M",
      "options": [
        {
          "name": "Size",
          "value": "M"
        }
      ],
      "prices": [
        {
          "amount": 1999,
          "sale_amount": null,
          "currency_code": "usd"
        }
      ],
      "inventory_quantity": 42,
      "manage_inventory": true
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create a product variant

Add a variant to a product along one or more option dimensions (e.g. Size, Color). Options missing from the product are created automatically; provide a value for every option the product already has. Prices are integers in the smallest currency unit and default to the store currency. Returns the created variant.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store that owns the product.

  • product_id
    Type: string
    required

    The ID of the product to add the variant to.

Body·
required
application/json
  • options
    Type: array object[] 1…10
    required

    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.

  • inventory_quantity
    Type: integer
    min:  
    0

    Units in stock. Defaults to 0.

  • manage_inventory
    Type: boolean

    Whether stock is tracked for this variant. Defaults to false.

  • prices
    Type: array object[] 1…50

    Prices per currency. Amounts are integers in the smallest currency unit. A free item is amount: 0.

  • sku
    Type: string
    max length:  
    255

    The variant SKU.

  • title
    Type: string
    max length:  
    255

    The variant title. Defaults to the option values joined with ' / ' (e.g. 'Red / L').

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/ecommerce/v1/stores/{store_id}/products/{product_id}/variants
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/products/prod_01J8Z5F8W9K8M4A7B3C2D1E0FG/variants \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "title": "Red / M",
  "sku": "TSHIRT-RED-M",
  "options": [
    {
      "name": "Size",
      "value": "M"
    }
  ],
  "prices": [
    {
      "amount": 1999,
      "sale_amount": 1499,
      "currency": "usd"
    }
  ],
  "inventory_quantity": 42,
  "manage_inventory": true
}'
{
  "data": {
    "id": "variant_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "title": "Red / M",
    "sku": "TSHIRT-RED-M",
    "options": [
      {
        "name": "Size",
        "value": "M"
      }
    ],
    "prices": [
      {
        "amount": 1999,
        "sale_amount": null,
        "currency_code": "usd"
      }
    ],
    "inventory_quantity": 42,
    "manage_inventory": true
  }
}

Discounts

List discounts

List a store's discounts. Filter by free text over code and name, or by disabled state. Amounts for fixed discounts are integers in the smallest currency unit; percentage discounts carry a whole-number value between 1 and 100.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to list discounts for.

Query Parameters
  • q
    Type: string

    Free-text search over discount code and name.

  • is_disabled
    Type: string enum

    Filter by disabled state.

    values
    • true
    • false
  • page
    Type: integer

    Page number

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/ecommerce/v1/stores/{store_id}/discounts
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/discounts \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "disc_01J8Z5F8W9K8M4A7B3C2D1E0FG",
      "code": "BLACKFRIDAY",
      "name": "Black Friday",
      "type": "percentage",
      "value": 20,
      "allocation": "total",
      "is_disabled": false,
      "starts_at": "2026-01-21T07:35:04.000000Z",
      "ends_at": null,
      "usage_limit": null,
      "usage_count": 0
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Create a discount

Create a discount for a store. Fixed discounts take an amount in the smallest currency unit (e.g. $10 is 1000); percentage discounts take a whole-number value between 1 and 100. Free-shipping discounts ignore value. Returns the created discount.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to create the discount for.

Body·
required
application/json
  • code
    Type: string
    min length:  
    1
    max length:  
    255
    required

    The discount code customers enter at checkout.

  • type
    Type: string enum
    required

    The discount type.

    values
    • percentage
    • fixed
    • free_shipping
  • value
    Type: integer
    min:  
    0
    required

    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.

  • allocation
    Type: string enum

    Whether the discount applies to the cart total or to each eligible item.

    values
    • total
    • item
  • ends_at
    Type: string Format: date-time

    When the discount expires. A bare date runs to the end of that day in time_zone. Never expires when omitted.

  • min_cart_value
    Type: integer
    min:  
    1

    Minimum cart value in the smallest currency unit required for the discount to apply.

  • name
    Type: string
    min length:  
    1
    max length:  
    255

    A human-friendly discount name.

  • starts_at
    Type: string Format: date-time

    When the discount becomes active. A bare date (2026-11-27) anchors to time_zone. Defaults to now when omitted.

  • time_zone
    Type: string

    IANA time zone used to interpret starts_at and ends_at.

  • usage_limit
    Type: integer
    min:  
    1

    Maximum number of times the discount can be redeemed.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/ecommerce/v1/stores/{store_id}/discounts
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/discounts \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "code": "BLACKFRIDAY",
  "name": "Black Friday",
  "type": "percentage",
  "value": 20,
  "allocation": "total",
  "starts_at": "2026-01-21T07:35:04.000000Z",
  "ends_at": "2026-02-21T07:35:04.000000Z",
  "usage_limit": 100,
  "min_cart_value": 5000,
  "time_zone": "Europe/Vilnius"
}'
{
  "data": {
    "id": "disc_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "code": "BLACKFRIDAY",
    "name": "Black Friday",
    "type": "percentage",
    "value": 20,
    "allocation": "total",
    "is_disabled": false,
    "starts_at": "2026-01-21T07:35:04.000000Z",
    "ends_at": null,
    "usage_limit": null,
    "usage_count": 0
  }
}

Orders

Cancel an order

Cancel the order and optionally email the customer. Returns the updated order summary.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store that owns the order.

  • order_id
    Type: string
    required

    The ID of the order to cancel.

Body·
required
application/json
  • notify_customer
    Type: boolean

    Whether to email the customer about the cancellation. Defaults to true.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/ecommerce/v1/stores/{store_id}/orders/{order_id}/cancel
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/orders/order_01J8Z5F8W9K8M4A7B3C2D1E0FG/cancel \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "notify_customer": true
}'
{
  "data": {
    "id": "order_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "display_id": 1042,
    "status": "pending",
    "payment_status": "captured",
    "fulfillment_status": "not_fulfilled",
    "total": 4999,
    "currency_code": "usd",
    "customer_email": "buyer@example.com",
    "item_count": 3,
    "created_at": "2026-01-21T07:35:04.000000Z"
  }
}

Fulfil an order

Create a fulfilment for the order and attach tracking in one call. Omit items to fulfil every remaining unfulfilled item. Returns the updated order summary.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store that owns the order.

  • order_id
    Type: string
    required

    The ID of the order to fulfil.

Body·
required
application/json
  • items
    Type: array object[]

    Line items to fulfil. Omit to fulfil every remaining unfulfilled item.

  • notify_customer
    Type: boolean

    Whether to email the customer about the fulfilment. Defaults to true.

  • tracking_number
    Type: string
    max length:  
    255

    Carrier tracking number for the shipment.

  • tracking_url
    Type: string
    max length:  
    2048

    Public tracking URL for the shipment. Requires tracking_number.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/ecommerce/v1/stores/{store_id}/orders/{order_id}/fulfill
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/orders/order_01J8Z5F8W9K8M4A7B3C2D1E0FG/fulfill \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "items": [
    {
      "line_item_id": "item_01J8Z5F8W9K8M4A7B3C2D1E0FG",
      "quantity": 2
    }
  ],
  "tracking_number": "1Z999AA10123456784",
  "tracking_url": "https://track.example.com/1Z999AA10123456784",
  "notify_customer": true
}'
{
  "data": {
    "id": "order_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "display_id": 1042,
    "status": "pending",
    "payment_status": "captured",
    "fulfillment_status": "not_fulfilled",
    "total": 4999,
    "currency_code": "usd",
    "customer_email": "buyer@example.com",
    "item_count": 3,
    "created_at": "2026-01-21T07:35:04.000000Z"
  }
}

List store orders

List a store's orders newest first as summaries. Filter by status, payment or fulfilment status, customer email, order number or a free-text query. Amounts are in the smallest currency unit. Retrieve a single order for its line items, addresses and fulfilments.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to list orders for.

Query Parameters
  • status
    Type: array string[] enum

    Order statuses to include.

    values
    • pending
    • completed
    • archived
    • canceled
    • requires_action
  • payment_status
    Type: array string[] enum

    Payment statuses to include. A paid order is "captured".

    values
    • not_paid
    • awaiting
    • captured
    • partially_refunded
    • refunded
    • canceled
    • requires_action
    • not_required
  • fulfillment_status
    Type: array string[] enum

    Fulfilment statuses to include.

    values
    • not_fulfilled
    • partially_fulfilled
    • fulfilled
    • partially_shipped
    • shipped
    • partially_returned
    • returned
    • canceled
    • requires_action
  • email
    Type: string

    Customer email, matched exactly.

  • display_id
    Type: string

    The order number the merchant and customer see.

  • q
    Type: string

    Free-text search over customer name, email, order number and line items.

  • created_at_from
    Type: string

    Earliest creation time to include, inclusive. Accepts a date or ISO date-time (UTC).

  • created_at_to
    Type: string

    Latest creation time to include, inclusive. A bare date covers that whole day.

  • page
    Type: integer

    Page number

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/ecommerce/v1/stores/{store_id}/orders
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/orders \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": [
    {
      "id": "order_01J8Z5F8W9K8M4A7B3C2D1E0FG",
      "display_id": 1042,
      "status": "pending",
      "payment_status": "captured",
      "fulfillment_status": "not_fulfilled",
      "total": 4999,
      "currency_code": "usd",
      "customer_email": "buyer@example.com",
      "item_count": 3,
      "created_at": "2026-01-21T07:35:04.000000Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 15,
    "total": 100
  }
}

Retrieve an order

Retrieve one order in full: line items (each with the id the fulfil endpoint needs), addresses, the totals breakdown and fulfilments with tracking. Amounts are in the smallest currency unit.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store that owns the order.

  • order_id
    Type: string
    required

    The ID of the order to retrieve.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/ecommerce/v1/stores/{store_id}/orders/{order_id}
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/orders/order_01J8Z5F8W9K8M4A7B3C2D1E0FG \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": {
    "id": "order_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "display_id": 1042,
    "status": "pending",
    "payment_status": "captured",
    "fulfillment_status": "not_fulfilled",
    "total": 4999,
    "currency_code": "usd",
    "customer_email": "buyer@example.com",
    "item_count": 3,
    "created_at": "2026-01-21T07:35:04.000000Z",
    "merchant_note": "Ship in a gift box.",
    "subtotal": 4500,
    "discount_total": 0,
    "tax_total": 199,
    "shipping_total": 300,
    "paid_total": 4999,
    "refunded_total": 0,
    "shipping_address": {
      "name": "Jane Buyer",
      "company": null,
      "address_1": "123 Main St",
      "address_2": null,
      "city": "Springfield",
      "province_code": "IL",
      "postal_code": "62704",
      "country_code": "us",
      "phone": "+15551234567"
    },
    "billing_address": {
      "name": "Jane Buyer",
      "company": null,
      "address_1": "123 Main St",
      "address_2": null,
      "city": "Springfield",
      "province_code": "IL",
      "postal_code": "62704",
      "country_code": "us",
      "phone": "+15551234567"
    },
    "items": [
      {
        "id": "item_01J8Z5F8W9K8M4A7B3C2D1E0FG",
        "title": "Blue T-Shirt / M",
        "sku": "TSHIRT-BLU-M",
        "variant_id": "variant_01J8Z5F8W9K8M4A7B3C2D1E0FG",
        "quantity": 2,
        "fulfilled_quantity": 0,
        "returned_quantity": 0,
        "unit_price": 2250,
        "total": 4500
      }
    ],
    "fulfillments": [
      {
        "id": "ful_01J8Z5F8W9K8M4A7B3C2D1E0FG",
        "created_at": "2026-01-22T07:35:04.000000Z",
        "shipped_at": null,
        "canceled_at": null,
        "tracking": [
          {
            "tracking_number": "1Z999AA10123456784",
            "url": "https://track.example.com/1Z999AA10123456784"
          }
        ]
      }
    ]
  }
}

Shipping

Configure shipping options for your online store. This category includes endpoints for setting the flat-rate shipping price applied to customer orders.

Set store shipping

Set the flat-rate shipping price for a store, creating the shipping zone if it does not exist yet.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to configure shipping for.

Body·
required
application/json
  • price
    Type: integer
    min:  
    0
    required

    Flat shipping rate in the smallest currency unit (e.g. cents). Use 0 for free shipping.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/ecommerce/v1/stores/{store_id}/shipping
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/shipping \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "price": 500
}'
{
  "shipping_option": {
    "id": "so_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "amount": 500,
    "currency_code": "usd"
  },
  "admin_url": "https://admin.example.com/store_01.../store-settings/shipping"
}

Payments

Manage payment methods for your online store. This category includes endpoints for enabling payment options such as manual (cash on delivery) payment at checkout.

Enable manual payment method

Enable a manual payment method so the store can accept orders without an online payment provider.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to enable manual payment for.

Body·
required
application/json
  • title
    Type: string | null
    max length:  
    255

    Optional display name shown to customers at checkout.

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for post/api/ecommerce/v1/stores/{store_id}/payment-methods/manual
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/payment-methods/manual \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "title": "Cash on delivery"
}'
{
  "payment_method": {
    "id": "spp_01J8Z5F8W9K8M4A7B3C2D1E0FG",
    "provider_id": "manual",
    "is_enabled": true,
    "title": "Cash on delivery"
  },
  "admin_url": "https://admin.example.com/store_01.../store-settings/payment-management"
}

List store payment providers

List a store's payment providers, split into providers already connected to the store and gateways available to install. Never exposes gateway credentials, secrets, or configuration.

Path Parameters
  • store_id
    Type: string
    required

    The ID of the store to list payment providers for.

Query Parameters
  • include_currency_unsupported
    Type: boolean

    Include gateways that do not support the store currency in the available list.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/ecommerce/v1/stores/{store_id}/payment-providers
curl /api/ecommerce/v1/stores/store_01J8Z5F8W9K8M4A7B3C2D1E0FG/payment-providers \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "data": {
    "connected": [
      {
        "id": "storepp_01J8Z5F8W9K8M4A7B3C2D1E0FG",
        "provider_id": "stripe",
        "title": "Stripe",
        "is_enabled": true,
        "status": "connected",
        "shows_at_checkout": true
      }
    ],
    "available": [
      {
        "id": "stripe",
        "is_installed": false,
        "is_enabled": false,
        "is_currency_supported": true,
        "supported_currencies": [
          "usd"
        ]
      }
    ]
  }
}

Miscellaneous

Ecommerce: Miscellaneous

Get custom storefront setup instructions

Retrieve step-by-step setup instructions, formatted as Markdown, for connecting a custom sales channel to your store and keeping your catalog, orders, shipping and payments in sync through the Ecommerce API.

Responses
  • application/json
  • application/json
  • application/json
Request Example for get/api/ecommerce/v1/miscellaneous/custom-storefront-instructions
curl /api/ecommerce/v1/miscellaneous/custom-storefront-instructions \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN'
{
  "instructions": "# Connect your custom storefront\n\nUse the Ecommerce API to sync your store."
}

Models

Models

"},"title":{"description":"Name the template is listed under. Not shown to the recipients.","type":"string","maxLength":255,"example":"Summer Sale Draft","nullable":true}},"type":"object"},"VPS.V1.Firewall.Rules.ReplaceRequest":{"required":["rules"],"properties":{"rules":{"description":"The complete set of firewall rules that atomically replaces all existing rules in the group","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.Firewall.Rules.StoreRequest"}},"sync":{"description":"Synchronize the firewall group to all its virtual machines after replacing the rules","type":"boolean"}},"type":"object"},"VPS.V1.Firewall.Rules.StoreRequest":{"required":["protocol","port","source","source_detail"],"properties":{"protocol":{"type":"string","enum":["TCP","UDP","ICMP","GRE","any","ESP","AH","ICMPv6","SSH","HTTP","HTTPS","MySQL","PostgreSQL"],"example":"TCP"},"port":{"description":"Port or port range, ex: 1024:2048","type":"string","example":"443"},"source":{"type":"string","enum":["any","custom"],"example":"any"},"source_detail":{"description":"IP range, CIDR, single IP or `any`","type":"string","example":"351.15.24.0/24"}},"type":"object"},"VPS.V1.Firewall.StoreRequest":{"required":["name"],"properties":{"name":{"type":"string","example":"My Firewall Group"}},"type":"object"},"VPS.V1.PostInstallScript.StoreRequest":{"required":["name","content"],"properties":{"name":{"description":"Name of the script","type":"string","example":"My Script"},"content":{"description":"Content of the script","type":"string","example":"#!/bin/bash\n\necho 'Hello, World!'"}},"type":"object"},"VPS.V1.PublicKey.AttachRequest":{"required":["ids"],"properties":{"ids":{"description":"Public Key IDs to attach","type":"array","items":{"type":"integer"},"example":[18232,10230230]}},"type":"object"},"VPS.V1.PublicKey.StoreRequest":{"required":["name","key"],"properties":{"name":{"type":"string","example":"My Public Key"},"key":{"type":"string","example":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..."}},"type":"object"},"VPS.V1.VirtualMachine.DockerManager.UpRequest":{"required":["project_name","content"],"properties":{"project_name":{"description":"Docker Compose project name using alphanumeric characters, dashes, and underscores only","type":"string","maxLength":64,"minLength":3,"example":"my-project-1"},"content":{"description":"URL pointing to docker-compose.yaml file, Github repository or raw YAML content of the compose file","type":"string","maxLength":8192},"environment":{"description":"Project environment variables","type":"string","maxLength":8192,"nullable":true}},"type":"object"},"VPS.V1.VirtualMachine.HostnameUpdateRequest":{"required":["hostname"],"properties":{"hostname":{"type":"string","example":"my.server.tld"}},"type":"object"},"VPS.V1.VirtualMachine.MetricGetRequest":{"required":["date_from","date_to"],"properties":{"date_from":{"type":"string","format":"date-time","example":"2025-05-01T00:00:00Z"},"date_to":{"type":"string","format":"date-time","example":"2025-06-01T00:00:00Z"}},"type":"object"},"VPS.V1.VirtualMachine.NameserversUpdateRequest":{"required":["ns1"],"properties":{"ns1":{"type":"string","example":"4.3.2.1"},"ns2":{"type":"string","example":"1.2.3.4","nullable":true},"ns3":{"type":"string","example":"5.2.3.4","nullable":true}},"type":"object"},"VPS.V1.VirtualMachine.PTR.StoreRequest":{"required":["domain"],"properties":{"domain":{"description":"Pointer record domain","type":"string","example":"example.tld"}},"type":"object"},"VPS.V1.VirtualMachine.PanelPasswordUpdateRequest":{"required":["password"],"properties":{"password":{"description":"Panel password for the virtual machine","type":"string","format":"password","minLength":8,"example":"oMeNRustosIO"}},"type":"object"},"VPS.V1.VirtualMachine.PurchaseRequest":{"required":["item_id","setup"],"properties":{"item_id":{"description":"Catalog price item ID","type":"string","example":"hostingercom-vps-kvm2-usd-1m"},"payment_method_id":{"description":"Payment method ID, default will be used if not provided","type":"integer","example":1327362},"setup":{"$ref":"#/components/schemas/VPS.V1.VirtualMachine.SetupRequest"},"coupons":{"description":"Discount coupon codes","type":"array","items":{"example":["Coupon 3"]}}},"type":"object"},"VPS.V1.VirtualMachine.Recovery.StartRequest":{"required":["root_password"],"properties":{"root_password":{"description":"Temporary root password for recovery mode","type":"string","example":"oMeNRustosIO"}},"type":"object"},"VPS.V1.VirtualMachine.RecreateRequest":{"required":["template_id"],"properties":{"template_id":{"description":"Template ID","type":"integer","example":1130},"password":{"description":"Root password for the virtual machine. If not provided, random password will be generated.\nPassword will not be shown in the response.","type":"string","format":"password","minLength":12,"example":"oMeNRustosIO"},"panel_password":{"description":"Panel password for the panel-based OS template. If not provided, random password will be generated.\nIf OS does not support panel_password this field will be ignored.\nPassword will not be shown in the response.","type":"string","format":"password","minLength":12,"example":"Mna58c17a4d"},"post_install_script_id":{"description":"Post-install script to execute after virtual machine was recreated","type":"integer","example":6324}},"type":"object"},"VPS.V1.VirtualMachine.RootPasswordUpdateRequest":{"required":["password"],"properties":{"password":{"description":"Root password for the virtual machine","type":"string","format":"password","minLength":12,"example":"oMeNRustosIO"}},"type":"object"},"VPS.V1.VirtualMachine.SetupRequest":{"required":["data_center_id","template_id"],"properties":{"template_id":{"description":"Template ID","type":"integer","example":1130},"data_center_id":{"description":"Data center ID","type":"integer","example":19},"post_install_script_id":{"description":"Post-install script ID","type":"integer","example":6324},"password":{"description":"Password for the virtual machine. If not provided, random password will be generated.\nPassword will not be shown in the response.","type":"string","format":"password","minLength":12,"example":"oMeNRustosIO"},"hostname":{"description":"Override default hostname of the virtual machine","type":"string","example":"my.server.tld"},"install_monarx":{"description":"Install Monarx malware scanner (if supported)","type":"boolean","default":false,"example":false},"enable_backups":{"description":"Enable weekly backup schedule","type":"boolean","default":true,"example":true},"ns1":{"description":"Name server 1","type":"string","example":"4.3.2.1"},"ns2":{"description":"Name server 2","type":"string","example":"1.2.3.4"},"public_key":{"description":"Use SSH key","properties":{"name":{"description":"Name of the SSH key","type":"string","example":"my-key"},"key":{"description":"Contents of the SSH key","type":"string","example":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC2X..."}},"type":"object"}},"type":"object"},"WordPress.V1.HostingerPlugins.UpdateAiOptionStatusRequest":{"required":["option","enable"],"properties":{"option":{"description":"AI option name","type":"string","enum":["llmstxt","web2agent"],"example":"llmstxt"},"enable":{"description":"Enable (true) or disable (false) the AI option.","type":"boolean","example":true}},"type":"object"},"WordPress.V1.Installations.CheckIsValidRequest":{"required":["software_ids"],"properties":{"software_ids":{"description":"WordPress installation (software) identifiers to validate.","type":"array","items":{"description":"Software identifier","type":"string","example":"123"},"maxItems":100,"minItems":1,"example":["123","456"]},"force":{"description":"Force fresh validation without cache. Preferable for troubleshooting purposes.","type":"boolean","default":false,"example":false}},"type":"object"},"WordPress.V1.Installations.DeleteInstallationRequest":{"properties":{"delete_files":{"description":"Delete installation files from disk.","type":"boolean","default":false,"example":false},"delete_database":{"description":"Delete the installation database.","type":"boolean","default":false,"example":false}},"type":"object"},"WordPress.V1.Installations.ImportWordPressRequest":{"required":["archive_path","sql_path"],"properties":{"archive_path":{"description":"Path to the WordPress archive file (relative to website root)","type":"string","example":"backup.zip"},"sql_path":{"description":"Path to the database SQL file (relative to website root)","type":"string","example":"database.sql"}},"type":"object"},"WordPress.V1.Installations.InstallWordPressRequest":{"required":["domain","site_title","credentials"],"properties":{"domain":{"description":"Domain of the existing website where WordPress will be installed","type":"string","example":"example.com"},"site_title":{"description":"Title of the WordPress site","type":"string","example":"My site"},"language":{"description":"WordPress locale. Defaults to en_US when omitted.","type":"string","example":"en_US","nullable":true},"directory":{"description":"Relative directory to install WordPress into. Defaults to the website root when omitted.","type":"string","example":"public_html","nullable":true},"overwrite":{"description":"When false (default), does not replace an existing installation. If WordPress is already installed on the domain/path, the async install job fails unless true.","type":"boolean","example":false,"nullable":true},"auto_updates":{"description":"WordPress core auto-update policy","type":"string","enum":["all","none","minor"],"example":"minor","nullable":true},"version":{"description":"WordPress core version to install. If omitted, the latest core version compatible with the account vhost PHP version is selected.","type":"string","example":"6.5.2","nullable":true},"credentials":{"description":"WordPress admin credentials","required":["email","login","password"],"properties":{"email":{"type":"string","example":"owner@example.com"},"login":{"description":"WordPress admin username","type":"string","example":"admin"},"password":{"type":"string","format":"password","example":"********"}},"type":"object"},"database":{"description":"Optional. If the named database already exists, it will be used for this WordPress install. Otherwise a new database is created with a generated name and random credentials.","properties":{"name":{"description":"Database name (username prefix added if missing)","type":"string","example":"mydb"},"password":{"type":"string","format":"password","example":"********","nullable":true}},"type":"object","nullable":true}},"type":"object"},"WordPress.V1.Installations.UpdateInstallationRequest":{"properties":{"minor":{"description":"Update the minor version only.","type":"boolean","default":false,"example":false},"version":{"description":"Update to a specific WordPress core version.","type":"string","example":"6.5.0","nullable":true}},"type":"object"},"WordPress.V1.Maintenance.ToggleMaintenanceRequest":{"required":["enabled"],"properties":{"enabled":{"description":"Enable (true) or disable (false) maintenance mode for the WordPress installation.","type":"boolean","example":true}},"type":"object"},"WordPress.V1.Memcached.ToggleMemcachedRequest":{"required":["enabled"],"properties":{"enabled":{"description":"Activate (true) or deactivate (false) the Memcached object cache for the WordPress installation.","type":"boolean","example":true}},"type":"object"},"WordPress.V1.Plugins.ActivatePluginRequest":{"required":["plugin"],"properties":{"plugin":{"description":"Slug of the installed plugin to activate.","type":"string","maxLength":255,"minLength":1,"example":"akismet"}},"type":"object"},"WordPress.V1.Plugins.DeactivatePluginRequest":{"required":["plugin"],"properties":{"plugin":{"description":"Slug of the installed plugin to deactivate.","type":"string","maxLength":255,"minLength":1,"example":"akismet"}},"type":"object"},"WordPress.V1.Plugins.DeployPluginRequest":{"required":["slug","plugin_path"],"properties":{"slug":{"description":"Slug of the plugin","type":"string","example":"my-plugin"},"plugin_path":{"description":"Relative path to the plugin directory from wp-content/plugins","type":"string","example":"my-plugin-new"}},"type":"object"},"WordPress.V1.Plugins.InstallPluginsRequest":{"required":["plugins"],"properties":{"plugins":{"description":"Plugin slugs to install. Use GET /api/hosting/v1/wordpress/plugins to discover available slugs.","type":"array","items":{"description":"Plugin slug","type":"string","example":"akismet"},"maxItems":20,"minItems":1,"example":["akismet","hello-dolly"]}},"type":"object"},"WordPress.V1.Plugins.UninstallPluginsRequest":{"required":["plugins"],"properties":{"plugins":{"description":"Slugs of the installed plugins to uninstall.","type":"array","items":{"description":"Plugin slug","type":"string","example":"akismet"},"maxItems":20,"minItems":1,"example":["akismet","hello-dolly"]}},"type":"object"},"WordPress.V1.Plugins.UpdateHostingerPluginRequest":{"required":["slug"],"properties":{"slug":{"description":"Slug of the Hostinger plugin to update to its latest version.","type":"string","enum":["hostinger","hostinger-ai-assistant","hostinger-affiliate-plugin","hostinger-easy-onboarding","hostinger-reach"],"example":"hostinger-affiliate-plugin"}},"type":"object"},"WordPress.V1.Plugins.UpdatePluginsRequest":{"required":["plugins"],"properties":{"plugins":{"description":"Slugs of the installed plugins to update to their latest version.","type":"array","items":{"description":"Plugin slug","type":"string","example":"akismet"},"maxItems":20,"minItems":1,"example":["akismet","hello-dolly"]}},"type":"object"},"WordPress.V1.Themes.ActivateThemeRequest":{"required":["theme"],"properties":{"theme":{"description":"Slug of the installed theme to activate.","type":"string","maxLength":50,"minLength":1,"example":"twentytwentyone"}},"type":"object"},"WordPress.V1.Themes.DeployThemeRequest":{"required":["slug","theme_path"],"properties":{"slug":{"description":"Slug of the theme","type":"string","example":"twentytwentyone"},"theme_path":{"description":"Relative path to the theme directory from wp-content/themes","type":"string","example":"twentytwentyone-new"},"is_activated":{"description":"Whether to activate the theme after deployment","type":"boolean","default":false,"example":false,"nullable":true}},"type":"object"},"WordPress.V1.Themes.InstallThemeRequest":{"required":["theme"],"properties":{"theme":{"description":"Slug of the theme to install. Hostinger theme slugs (hostinger-blog, hostinger-affiliate-theme, hostinger-ai-theme) trigger the custom installer and forward the optional palette/layout/font fields; any other WordPress theme slug uses the standard installer and ignores those fields.","type":"string","maxLength":50,"minLength":1,"example":"hostinger-blog"},"palette":{"description":"Palette identifier. Only applied when the theme is a Hostinger theme; the default is used when omitted.","type":"string","default":"palette1","maxLength":50,"minLength":1,"example":"palette1","nullable":true},"layout":{"description":"Layout identifier. Only applied when the theme is a Hostinger theme; the default is used when omitted.","type":"string","default":"layout1","maxLength":50,"minLength":1,"example":"layout1","nullable":true},"font":{"description":"Font identifier. Only applied when the theme is a Hostinger theme; the default is used when omitted.","type":"string","default":"default","enum":["professional","modern","elegant","creative","dynamic","default"],"example":"default","nullable":true}},"type":"object"},"WordPress.V1.Themes.UninstallThemesRequest":{"required":["themes"],"properties":{"themes":{"description":"Slugs of the installed themes to uninstall.","type":"array","items":{"description":"Theme slug","type":"string","example":"twentytwentyone"},"maxItems":20,"minItems":1,"example":["twentytwenty","twentytwentyone"]}},"type":"object"},"WordPress.V1.Themes.UpdateThemesRequest":{"required":["themes"],"properties":{"themes":{"description":"Slugs of the installed themes to update to their latest version.","type":"array","items":{"description":"Theme slug","type":"string","example":"twentytwentyone"},"maxItems":20,"minItems":1,"example":["twentytwenty","twentytwentyone"]}},"type":"object"},"AgencyHosting.V1.Datacenters.CoordinatesResource":{"properties":{"latitude":{"description":"Latitude coordinate","type":"number","format":"float","example":51.5074},"longitude":{"description":"Longitude coordinate","type":"number","format":"float","example":0.1278}},"type":"object"},"AgencyHosting.V1.Datacenters.DatacenterCollection":{"description":"Array of [`AgencyHosting.V1.Datacenters.DatacenterResource`](#model/agencyhostingv1datacentersdatacenterresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Datacenters.DatacenterResource"}},"AgencyHosting.V1.Datacenters.DatacenterResource":{"required":["title","code","country","coordinates","pinger_url"],"properties":{"title":{"description":"Datacenter title","type":"string","example":"Europe (Netherlands)"},"code":{"description":"Datacenter code","type":"string","example":"ukfast"},"country":{"description":"Datacenter country code","type":"string","example":"uk"},"coordinates":{"$ref":"#/components/schemas/AgencyHosting.V1.Datacenters.CoordinatesResource"},"pinger_url":{"description":"URL you can ping to measure round-trip latency to this datacenter. Compare the measured latency across datacenters to identify the nearest one (lowest ping) for your website. Null when no online server is currently available to measure against.","type":"string","example":"https://my-website.com/ping.php","nullable":true}},"type":"object"},"AgencyHosting.V1.Domains.DomainCollection":{"description":"Array of [`AgencyHosting.V1.Domains.DomainResource`](#model/agencyhostingv1domainsdomainresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Domains.DomainResource"}},"AgencyHosting.V1.Domains.DomainResource":{"properties":{"fqdn":{"description":"Domain name","type":"string","example":"example.com"},"website_uid":{"description":"Owner website UID","type":"string","example":"zpwlGlp19"},"created_at":{"description":"Creation date","type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"}},"type":"object"},"AgencyHosting.V1.Files.UploadUrlResource":{"required":["url","auth_key","rest_auth_key"],"properties":{"url":{"description":"The TUS upload endpoint URL to send upload requests to","type":"string","example":"https://h5g12345-fm.hstgr.io/rest/1b2b4e5d5a5f795f/api/tus"},"auth_key":{"description":"Authentication token to pass as the `X-Auth` header in TUS upload requests","type":"string","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxfX0.O-x6KeHMkNqnbYvbRcdDEQXOSLcqyE7xNrnKvftbG3A"},"rest_auth_key":{"description":"Authentication token to pass as the `X-Auth-Rest` header in TUS upload requests","type":"string","example":"5c3b12fabf3d9652780a23ae705d2feb556c89907d0db50cddb8dffc27c1149d-1b2b4e5d5a5f795f"}},"type":"object"},"AgencyHosting.V1.Orders.DatacenterResource":{"properties":{"code":{"description":"Datacenter code","type":"string","example":"ukfast"},"country":{"description":"Datacenter country","type":"string","example":"uk"}},"type":"object"},"AgencyHosting.V1.Orders.DiskUsageMetrics.LimitsResource":{"properties":{"disk_bytes":{"description":"Disk usage quota in bytes","type":"integer","example":104857600},"inodes":{"description":"Inodes quota","type":"integer","example":400000}},"type":"object"},"AgencyHosting.V1.Orders.DiskUsageMetrics.MetricCollection":{"description":"Array of [`AgencyHosting.V1.Orders.DiskUsageMetrics.MetricResource`](#model/agencyhostingv1ordersdiskusagemetricsmetricresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Orders.DiskUsageMetrics.MetricResource"}},"AgencyHosting.V1.Orders.DiskUsageMetrics.MetricResource":{"properties":{"disk_bytes":{"description":"Disk usage in bytes at this sample","type":"integer","example":104857600},"inodes":{"description":"Number of inodes used at this sample","type":"integer","example":400000},"timestamp":{"description":"Unix timestamp of the sample","type":"integer","example":1736325738}},"type":"object"},"AgencyHosting.V1.Orders.DiskUsageMetrics.MetricsResource":{"properties":{"limits":{"$ref":"#/components/schemas/AgencyHosting.V1.Orders.DiskUsageMetrics.LimitsResource"},"metrics":{"$ref":"#/components/schemas/AgencyHosting.V1.Orders.DiskUsageMetrics.MetricCollection"}},"type":"object"},"AgencyHosting.V1.Orders.OrderCollection":{"description":"Array of [`AgencyHosting.V1.Orders.OrderResource`](#model/agencyhostingv1ordersorderresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Orders.OrderResource"}},"AgencyHosting.V1.Orders.OrderResource":{"properties":{"id":{"description":"Order ID","type":"integer","example":123456},"client_id":{"description":"Order client ID","type":"integer","example":123456},"status":{"description":"Order status","type":"string","example":"active","nullable":true},"plan":{"$ref":"#/components/schemas/AgencyHosting.V1.Orders.PlanResource"},"datacenter":{"oneOf":[{"$ref":"#/components/schemas/AgencyHosting.V1.Orders.DatacenterResource"}],"nullable":true,"description":"Order datacenter"},"created_at":{"description":"Order creation date","type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"}},"type":"object"},"AgencyHosting.V1.Orders.PlanResource":{"properties":{"name":{"description":"Plan display name","type":"string","example":"Shared Business hosting","nullable":true},"key":{"description":"Plan key","type":"string","example":"shared_business_hosting","nullable":true}},"type":"object"},"AgencyHosting.V1.Orders.ResourceUsageMetrics.LimitsResource":{"properties":{"memory_bytes":{"description":"Memory usage quota in bytes","type":"integer","example":104857600},"cpu_percent":{"description":"CPU usage quota in percent","type":"integer","example":400},"processes":{"description":"Process usage quota","type":"integer","example":100}},"type":"object"},"AgencyHosting.V1.Orders.ResourceUsageMetrics.MetricCollection":{"description":"Array of [`AgencyHosting.V1.Orders.ResourceUsageMetrics.MetricResource`](#model/agencyhostingv1ordersresourceusagemetricsmetricresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Orders.ResourceUsageMetrics.MetricResource"}},"AgencyHosting.V1.Orders.ResourceUsageMetrics.MetricResource":{"properties":{"cpu_percent":{"description":"CPU usage percentage at this sample","type":"number","format":"float","example":15.5},"memory_bytes":{"description":"Memory usage in bytes at this sample","type":"integer","example":125829120},"processes":{"description":"Number of processes at this sample","type":"integer","example":12},"timestamp":{"description":"Unix timestamp of the sample","type":"integer","example":1736325738}},"type":"object"},"AgencyHosting.V1.Orders.ResourceUsageMetrics.MetricsResource":{"properties":{"limits":{"$ref":"#/components/schemas/AgencyHosting.V1.Orders.ResourceUsageMetrics.LimitsResource"},"metrics":{"$ref":"#/components/schemas/AgencyHosting.V1.Orders.ResourceUsageMetrics.MetricCollection"},"websites":{"$ref":"#/components/schemas/AgencyHosting.V1.Orders.ResourceUsageMetrics.WebsiteCollection"}},"type":"object"},"AgencyHosting.V1.Orders.ResourceUsageMetrics.WebsiteCollection":{"description":"Array of [`AgencyHosting.V1.Orders.ResourceUsageMetrics.WebsiteResource`](#model/agencyhostingv1ordersresourceusagemetricswebsiteresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Orders.ResourceUsageMetrics.WebsiteResource"}},"AgencyHosting.V1.Orders.ResourceUsageMetrics.WebsiteResource":{"properties":{"uid":{"description":"Website UID","type":"string","example":"cvDuwAOvq"},"domains":{"description":"Domains associated with the website","type":"array","items":{"type":"string","example":"example.com"},"example":["example.com","www.example.com"]},"metrics":{"$ref":"#/components/schemas/AgencyHosting.V1.Orders.ResourceUsageMetrics.MetricCollection"}},"type":"object"},"AgencyHosting.V1.Php.ExtensionCollection":{"description":"Array of [`AgencyHosting.V1.Php.ExtensionResource`](#model/agencyhostingv1phpextensionresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Php.ExtensionResource"}},"AgencyHosting.V1.Php.ExtensionResource":{"properties":{"name":{"description":"PHP extension name.","type":"string","example":"zip"},"description":{"description":"What the extension provides.","type":"string","example":"Lets PHP read and write compressed ZIP archives."},"state":{"description":"Whether the extension is currently enabled. Extensions in the \"built-in\" state are compiled into PHP and cannot be turned off.","type":"string","enum":["enabled","disabled","built-in"],"example":"enabled"}},"type":"object"},"AgencyHosting.V1.Php.OptionCollection":{"description":"Array of [`AgencyHosting.V1.Php.OptionResource`](#model/agencyhostingv1phpoptionresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Php.OptionResource"}},"AgencyHosting.V1.Php.OptionResource":{"properties":{"name":{"description":"php.ini directive name.","type":"string","example":"upload_max_filesize"},"description":{"description":"What the directive controls.","type":"string","example":"The maximum size in bytes of an uploaded file."},"default_value":{"description":"Value applied when no custom value is set.","type":"string","example":"128M"},"allowed_values":{"description":"Values this option accepts. Null when the option accepts any value of its type.","type":"array","items":{"type":"string"},"example":["128M","256M","512M"],"nullable":true},"value":{"description":"Value currently in effect for the website.","type":"string","example":"256M"},"type":{"description":"Whether the option takes a single value or a list of values.","type":"string","enum":["value","list"],"example":"value"}},"type":"object"},"AgencyHosting.V1.Php.VersionCollection":{"description":"Array of [`AgencyHosting.V1.Php.VersionResource`](#model/agencyhostingv1phpversionresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Php.VersionResource"}},"AgencyHosting.V1.Php.VersionResource":{"properties":{"version":{"description":"PHP version available for the website.","type":"string","example":"8.2"}},"type":"object"},"AgencyHosting.V1.Setups.WebsiteSetupResource":{"properties":{"setup_uuid":{"description":"UUID tracking the asynchronous website setup process","type":"string","example":"0193b6d4-fabb-70e0-8ea4-cfe060a45898"}},"type":"object"},"AgencyHosting.V1.Setups.WebsiteSetupStatusResource":{"properties":{"website_uid":{"description":"UID of the website created by the setup, available once provisioning completes","type":"string","example":"zpwlGlp19","nullable":true},"status":{"description":"Website setup status","type":"string","enum":["running","completed"],"example":"running"}},"type":"object"},"AgencyHosting.V1.Websites.BuilderWebsiteDetailsResource":{"properties":{"id":{"description":"Builder ID","type":"string","example":"F1eWabGonyLa3162","nullable":true},"vhost":{"description":"Domain name","type":"string","example":"test.com"},"type":{"description":"Detected website type","type":"string","example":"builder"},"username":{"description":"Account username","type":"string","example":"u123456789"},"created_at":{"type":"string","format":"date-time","example":"2024-05-29T05:49:49.067239Z"}},"type":"object"},"AgencyHosting.V1.Websites.CronJobs.CronJobCollection":{"description":"Array of [`AgencyHosting.V1.Websites.CronJobs.CronJobResource`](#model/agencyhostingv1websitescronjobscronjobresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.CronJobs.CronJobResource"}},"AgencyHosting.V1.Websites.CronJobs.CronJobResource":{"properties":{"uuid":{"description":"Unique identifier of the cron job. Use it to delete the cron job.","type":"string","example":"01931d6f-68f5-7b72-8d9e-09c6e1e6aa0e"},"time":{"description":"Cron schedule expression.","type":"string","example":"*/30 * * * *"},"command":{"description":"Command executed on the configured schedule.","type":"string","example":"php artisan schedule:run"},"created_at":{"description":"Cron job creation timestamp.","type":"string","format":"date-time","example":"2024-10-28T12:00:00+00:00"}},"type":"object"},"AgencyHosting.V1.Websites.CustomSslCertResource":{"properties":{"is_expired":{"description":"Is the SSL certificate expired","type":"boolean","example":false},"expires_at":{"type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00","nullable":true},"created_at":{"type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"}},"type":"object"},"AgencyHosting.V1.Websites.Databases.DatabaseCollection":{"description":"Array of [`AgencyHosting.V1.Websites.Databases.DatabaseResource`](#model/agencyhostingv1websitesdatabasesdatabaseresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.Databases.DatabaseResource"}},"AgencyHosting.V1.Websites.Databases.DatabaseResource":{"properties":{"name":{"description":"Database name.","type":"string","example":"my_database"},"created_at":{"description":"Database creation date in ISO 8601 format.","type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"},"users":{"description":"Non-system users that can access the database.","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.Databases.DatabaseUserResource"}}},"type":"object"},"AgencyHosting.V1.Websites.Databases.DatabaseUserResource":{"properties":{"name":{"description":"Database username.","type":"string","example":"my_user"},"host":{"description":"Database host the user is allowed to connect from.","type":"string","example":"localhost"},"created_at":{"description":"Database user creation date in ISO 8601 format.","type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"}},"type":"object"},"AgencyHosting.V1.Websites.H5gWebsiteDetailsResource":{"properties":{"uid":{"description":"Website UID","type":"string","example":"zpwlGlp19"},"ipv4":{"description":"IPv4 address","type":"string","example":"192.161.10.1"},"flavor":{"description":"Setup flavor","type":"string","example":"wp-6.2.0"},"type":{"description":"Detected website type","type":"string","enum":["wordpress","builder","horizons","nodejs","u4s","other"],"example":"wordpress"},"username":{"description":"Username for this order","type":"string","example":"u123456789"},"description":{"description":"Description","type":"string","example":"Very awesome website","nullable":true},"state":{"description":"Website state","type":"string","enum":["active","suspended"],"example":"active"},"created_at":{"type":"string","format":"date-time","example":"2024-05-29T05:49:49.067239Z"},"settings":{"description":"Website settings, e.g. PHP configuration","type":"object"},"wordpress":{"description":"WordPress installation details","type":"object","nullable":true},"domains":{"description":"Website domains","type":"array","items":{"type":"object"}},"preview_domain":{"description":"Preview domain","type":"object","nullable":true},"processes":{"description":"Ongoing website processes","type":"array","items":{"type":"object"}},"horizons_uuid":{"description":"Horizons UUID (only for horizons websites)","type":"string","nullable":true}},"type":"object"},"AgencyHosting.V1.Websites.PlanResource":{"description":"Website plan details","properties":{"name":{"type":"string","example":"hostinger_premium"},"display_name":{"type":"string","example":"Premium Hosting"},"has_cdn":{"type":"boolean","example":true}},"type":"object"},"AgencyHosting.V1.Websites.SslCertResource":{"properties":{"names":{"description":"SSL cert names","type":"array","items":{"type":"string","example":"test.com"},"example":["test.com","www.test.com"]},"expires_at":{"type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"},"created_at":{"type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"}},"type":"object"},"AgencyHosting.V1.Websites.U4sWebsiteDetailsResource":{"properties":{"uuid":{"description":"Application UUID","type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"title":{"description":"Application title","type":"string","example":"My Node App"},"port":{"description":"Application port","type":"integer","example":3000},"type":{"description":"Detected website type","type":"string","enum":["u4s","horizons"],"example":"u4s"},"runtime":{"description":"Application runtime","type":"string","example":"u4s_node20"},"state":{"description":"Application state","type":"string","example":"active"},"domains":{"description":"Application domains","type":"array","items":{"type":"object"}},"horizons_uuid":{"description":"Horizons UUID","type":"string","nullable":true},"preview_domain":{"description":"Preview domain","type":"object","nullable":true}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteCollection":{"description":"Array of [`AgencyHosting.V1.Websites.WebsiteListItemResource`](#model/agencyhostingv1websiteswebsitelistitemresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteListItemResource"}},"AgencyHosting.V1.Websites.WebsiteDomainDetailsCollection":{"description":"Array of [`AgencyHosting.V1.Websites.WebsiteDomainDetailsResource`](#model/agencyhostingv1websiteswebsitedomaindetailsresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteDomainDetailsResource"}},"AgencyHosting.V1.Websites.WebsiteDomainDetailsResource":{"properties":{"fqdn":{"description":"Domain name","type":"string","example":"test.com"},"parent_fqdn":{"description":"Parent domain name if the domain is a subdomain","type":"string","example":"test.com","nullable":true},"ipv6":{"description":"IPv6 address","type":"string","example":"2001:db8::1","nullable":true},"created_at":{"type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"},"nameservers":{"type":"array","items":{"type":"string","example":"a.dns-parking.com"},"example":["a.dns-parking.com","b.dns-parking.com"]},"ssl_cert":{"oneOf":[{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.SslCertResource"}],"nullable":true},"custom_ssl_cert":{"oneOf":[{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.CustomSslCertResource"}],"nullable":true}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteListItemResource":{"description":"Website item. The `details` shape differs per platform — see the `platform` field.","required":["id","client_id","order_id","platform","state","created_at","plan","details","suspension_reason"],"properties":{"id":{"type":"string","example":"zpwlGlp19"},"client_id":{"type":"integer","example":123},"order_id":{"type":"integer","example":1234},"platform":{"description":"Website platform","type":"string","enum":["h5g","builder","u4s"],"example":"h5g"},"state":{"description":"Website state","type":"string","example":"active"},"created_at":{"type":"string","format":"date-time","example":"2024-05-29T05:49:49.067239Z"},"plan":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.PlanResource"},"details":{"description":"Platform-specific website details. Shape depends on `platform`.","oneOf":[{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.H5gWebsiteDetailsResource"},{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.BuilderWebsiteDetailsResource"},{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.U4sWebsiteDetailsResource"}]},"suspension_reason":{"description":"Reason for suspension, only populated for payment related suspensions","type":"string","example":"non_payment","nullable":true}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteOrderPlanResource":{"properties":{"name":{"description":"Plan name","type":"string","example":"Hosting Single","nullable":true},"parameters":{"description":"Plan parameters","properties":{"disk_quota_bytes":{"description":"Disk quota in bytes","type":"integer","example":21474836480},"inode_quota":{"description":"Inode quota","type":"integer","example":10000},"cpu_cores":{"description":"CPU cores","type":"integer","example":2},"memory_quota_bytes":{"description":"Memory quota in bytes","type":"integer","example":1073741824},"disk_iops_quota":{"description":"Disk IOPs quota","type":"integer","example":100000},"process_quota":{"description":"Process quota","type":"integer","example":10000},"website_quota":{"description":"Website quota","type":"integer","example":10},"max_databases_per_website":{"description":"Maximum number of databases per website","type":"integer","example":5},"is_cdn_available":{"description":"Is CDN available","type":"boolean","example":true}},"type":"object"}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteOrderResource":{"properties":{"id":{"description":"Order ID","type":"integer","example":123456},"status":{"description":"Order status","type":"string","example":"active","nullable":true},"created_at":{"type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"},"plan":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteOrderPlanResource"}},"type":"object"},"AgencyHosting.V1.Websites.WebsitePhpSettingsResource":{"properties":{"version":{"description":"PHP version","type":"string","example":"8.3"},"workers":{"description":"Number of PHP workers","type":"integer","example":4}},"type":"object"},"AgencyHosting.V1.Websites.WebsitePreviewDomainResource":{"properties":{"fqdn":{"description":"Preview domain name","type":"string","example":"plum-bee-184082.hostingersite.com"},"created_at":{"description":"Creation date","type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteProcessCollection":{"description":"Array of [`AgencyHosting.V1.Websites.WebsiteProcessResource`](#model/agencyhostingv1websiteswebsiteprocessresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteProcessResource"}},"AgencyHosting.V1.Websites.WebsiteProcessResource":{"properties":{"id":{"description":"Process ID","type":"string","example":"0193b6d4-fabb-70e0-8ea4-cfe060a45898"},"type":{"description":"Process type","type":"string","example":"backup_generation"},"status":{"description":"Process status","type":"string","enum":["running","completed","failed"],"example":"running"}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteRemoteAccessResource":{"properties":{"mode":{"description":"Remote access mode","type":"string","example":"ssh_and_sftp"},"ssh":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteSshDetailsResource"},"sftp":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteSftpDetailsResource"}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteResource":{"properties":{"uid":{"description":"Website UID","type":"string","example":"zpwlGlp19"},"ipv4":{"description":"IPv4 address","type":"string","example":"192.161.10.1"},"flavor":{"description":"Setup flavor","type":"string","example":"wp-6.2.0"},"type":{"description":"Website type","type":"string","example":"node-static","nullable":true},"description":{"description":"Description","type":"string","example":"Very awesome website","nullable":true},"state":{"description":"Website state","type":"string","enum":["active","suspended"],"example":"active"},"created_at":{"type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"},"domains":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteDomainDetailsCollection"},"preview_domain":{"oneOf":[{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsitePreviewDomainResource"}],"nullable":true},"settings":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteSettingsResource"},"wordpress":{"oneOf":[{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WordPressInstallResource"}],"nullable":true},"remote_access":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteRemoteAccessResource"},"server":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteServerResource"},"order":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteOrderResource"},"user":{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteUserResource"},"staging_root":{"oneOf":[{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsiteStagingRootResource"}],"nullable":true}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteServerResource":{"properties":{"hostname":{"description":"Server hostname","type":"string","example":"us-west-1.hstgr.io"},"country_code":{"description":"Country code","type":"string","example":"us"}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteSettingsResource":{"properties":{"php":{"oneOf":[{"$ref":"#/components/schemas/AgencyHosting.V1.Websites.WebsitePhpSettingsResource"}],"nullable":true,"description":"PHP settings"}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteSftpDetailsResource":{"properties":{"username":{"description":"SFTP username","type":"string","example":"u123456789_abcDeFg"},"host":{"description":"SFTP host","type":"string","example":"192.161.10.1"},"port":{"description":"SFTP port","type":"integer","example":65002},"is_enabled":{"description":"Is SFTP access enabled","type":"boolean","example":true}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteSshDetailsResource":{"properties":{"username":{"description":"SSH username","type":"string","example":"u123456789_abcDeFg"},"host":{"description":"SSH host","type":"string","example":"192.161.10.1"},"port":{"description":"SSH port","type":"integer","example":65002},"is_enabled":{"description":"Is SSH access enabled","type":"boolean","example":true},"is_password_enabled":{"description":"Is SSH password access enabled","type":"boolean","example":true}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteStagingRootResource":{"properties":{"uid":{"description":"UID of the website this is a staging environment of","type":"string","example":"zpwlGlp19"}},"type":"object"},"AgencyHosting.V1.Websites.WebsiteUserResource":{"properties":{"username":{"description":"System username","type":"string","example":"u123456789"},"state":{"description":"User state","type":"string","example":"active"}},"type":"object"},"AgencyHosting.V1.Websites.WordPressInstallResource":{"properties":{"domain":{"description":"WordPress domain","type":"string","example":"test.com"},"title":{"description":"WordPress title","type":"string","example":"My Blog"},"language":{"description":"WordPress language","type":"string","example":"en_US"},"is_config_locked":{"description":"WordPress configuration lock status","type":"boolean","example":true},"created_at":{"description":"Creation date","type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"}},"type":"object"},"AgencyHosting.V1.WordPress.SettingsResource":{"properties":{"core_version":{"description":"Currently installed WordPress core version, or null when it cannot be determined.","type":"string","example":"6.5.5","nullable":true},"is_lite_speed_cache_enabled":{"description":"Whether the LiteSpeed Cache plugin is active.","type":"boolean","example":true},"is_object_cache_enabled":{"description":"Whether LiteSpeed object cache is enabled.","type":"boolean","example":false},"is_maintenance_mode_enabled":{"description":"Whether WordPress maintenance mode is currently enabled.","type":"boolean","example":false}},"type":"object"},"AgencyHosting.V1.WordPress.VersionCollection":{"description":"Array of [`AgencyHosting.V1.WordPress.VersionResource`](#model/agencyhostingv1wordpressversionresource)","type":"array","items":{"$ref":"#/components/schemas/AgencyHosting.V1.WordPress.VersionResource"}},"AgencyHosting.V1.WordPress.VersionResource":{"properties":{"version":{"description":"WordPress core version.","type":"string","example":"6.5.5"}},"type":"object"},"Billing.V1.Catalog.CatalogItemCollection":{"description":"Array of [`Billing.V1.Catalog.CatalogItemResource`](#model/billingv1catalogcatalogitemresource)","type":"array","items":{"$ref":"#/components/schemas/Billing.V1.Catalog.CatalogItemResource"}},"Billing.V1.Catalog.CatalogItemPriceCollection":{"description":"Array of [`Billing.V1.Catalog.CatalogItemPriceResource`](#model/billingv1catalogcatalogitempriceresource)","type":"array","items":{"$ref":"#/components/schemas/Billing.V1.Catalog.CatalogItemPriceResource"}},"Billing.V1.Catalog.CatalogItemPriceResource":{"properties":{"id":{"description":"Price item ID","type":"string","example":"hostingercom-vps-kvm2-usd-1m"},"name":{"description":"Price item name","type":"string","example":"KVM 2 (billed every month)"},"currency":{"description":"Currency code","type":"string","example":"USD"},"price":{"description":"Price in cents","type":"integer","example":1799},"first_period_price":{"description":"First period price in cents","type":"integer","example":899},"period":{"description":"Period","type":"integer","example":1},"period_unit":{"description":"Period unit","type":"string","enum":["day","week","month","year","none"],"example":"day"}},"type":"object"},"Billing.V1.Catalog.CatalogItemResource":{"properties":{"id":{"description":"Catalog item ID","type":"string","example":"hostingercom-vps-kvm2"},"name":{"type":"string","example":"KVM 2"},"category":{"type":"string","example":"VPS"},"metadata":{"description":"\n Flexible key-value storage containing category-specific metadata for the catalog item.\n The structure and available fields vary depending on the item category.\n ","type":"object","example":{"field":"value"},"nullable":true},"prices":{"$ref":"#/components/schemas/Billing.V1.Catalog.CatalogItemPriceCollection"}},"type":"object"},"Billing.V1.Order.OrderBillingAddressResource":{"properties":{"first_name":{"type":"string","example":"John"},"last_name":{"type":"string","example":"Doe"},"company":{"type":"string","example":null,"nullable":true},"address_1":{"type":"string","example":null,"nullable":true},"address_2":{"type":"string","example":null,"nullable":true},"city":{"type":"string","example":null,"nullable":true},"state":{"type":"string","example":null,"nullable":true},"zip":{"type":"string","example":null,"nullable":true},"country":{"type":"string","example":"NL","nullable":true},"phone":{"type":"string","example":null,"nullable":true},"email":{"type":"string","example":"john@doe.tld"}},"type":"object"},"Billing.V1.Order.OrderResource":{"properties":{"id":{"description":"Order ID","type":"integer","example":2957086},"subscription_id":{"description":"Subscription ID","type":"string","example":"Azz353Uhl1xC54pR0"},"status":{"type":"string","enum":["completed","pending","processing","failed","refunded","cancelled","awaiting_payment","payment_initiated","fraud_refund"],"example":"completed"},"currency":{"description":"Currency code","type":"string","example":"USD"},"subtotal":{"description":"Subtotal price (exc. VAT) in cents","type":"integer","example":899},"total":{"description":"Total price (inc. VAT) in cents","type":"integer","example":1088},"billing_address":{"$ref":"#/components/schemas/Billing.V1.Order.OrderBillingAddressResource"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-03-27T11:54:22Z"}},"type":"object"},"Billing.V1.Order.VirtualMachineOrderResource":{"properties":{"order":{"$ref":"#/components/schemas/Billing.V1.Order.OrderResource"},"virtual_machine":{"$ref":"#/components/schemas/VPS.V1.VirtualMachine.VirtualMachineResource"}},"type":"object"},"Billing.V1.PaymentMethod.PaymentMethodCollection":{"description":"Array of [`Billing.V1.PaymentMethod.PaymentMethodResource`](#model/billingv1paymentmethodpaymentmethodresource)","type":"array","items":{"$ref":"#/components/schemas/Billing.V1.PaymentMethod.PaymentMethodResource"}},"Billing.V1.PaymentMethod.PaymentMethodResource":{"properties":{"id":{"description":"Payment method ID","type":"integer","example":6523},"name":{"type":"string","example":"Credit Card"},"identifier":{"type":"string","example":"1234*****6464"},"payment_method":{"type":"string","example":"card"},"is_default":{"type":"boolean","example":true},"is_expired":{"type":"boolean","example":false},"is_suspended":{"type":"boolean","example":false},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"expires_at":{"type":"string","format":"date-time","example":"2025-03-27T11:54:22Z"},"suspended_at":{"type":"string","format":"date-time","example":"2025-03-28T11:54:22Z","nullable":true}},"type":"object"},"Billing.V1.Subscription.SubscriptionCollection":{"description":"Array of [`Billing.V1.Subscription.SubscriptionResource`](#model/billingv1subscriptionsubscriptionresource)","type":"array","items":{"$ref":"#/components/schemas/Billing.V1.Subscription.SubscriptionResource"}},"Billing.V1.Subscription.SubscriptionResource":{"properties":{"id":{"description":"Subscription ID","type":"string","example":"Azz36nUfKX1S1MSF"},"name":{"type":"string","example":"KVM 1"},"status":{"type":"string","enum":["active","paused","cancelled","not_renewing","transferred","in_trial","future"],"example":"active"},"billing_period":{"type":"integer","example":1},"billing_period_unit":{"type":"string","example":"day"},"currency_code":{"type":"string","example":"USD"},"total_price":{"description":"Total price in cents","type":"integer","example":1799},"renewal_price":{"description":"Renewal price in cents","type":"integer","example":1799},"is_auto_renewed":{"type":"boolean","example":true},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"expires_at":{"type":"string","format":"date-time","example":"2025-03-27T11:54:22Z","nullable":true},"next_billing_at":{"type":"string","format":"date-time","example":"2025-02-28T11:54:22Z","nullable":true}},"type":"object"},"Common.SuccessEmptyResource":{"properties":{"message":{"type":"string","example":"Request accepted"}},"type":"object","x-scalar-ignore":true},"DNS.V1.Snapshot.SnapshotCollection":{"description":"Array of [`DNS.V1.Snapshot.SnapshotResource`](#model/dnsv1snapshotsnapshotresource)","type":"array","items":{"$ref":"#/components/schemas/DNS.V1.Snapshot.SnapshotResource"}},"DNS.V1.Snapshot.SnapshotResource":{"properties":{"id":{"description":"Snapshot ID","type":"integer","example":5341},"reason":{"description":"Reason of the update","type":"string","example":"Zone records update request"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"}},"type":"object"},"DNS.V1.Snapshot.SnapshotWithContentResource":{"properties":{"id":{"description":"Snapshot ID","type":"integer","example":5341},"reason":{"description":"Reason of the update","type":"string","example":"Zone records update request"},"snapshot":{"$ref":"#/components/schemas/DNS.V1.Zone.RecordCollection"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"}},"type":"object"},"DNS.V1.Zone.NameRecordCollection":{"description":"Array of [`DNS.V1.Zone.NameRecordResource`](#model/dnsv1zonenamerecordresource)","type":"array","items":{"$ref":"#/components/schemas/DNS.V1.Zone.NameRecordResource"}},"DNS.V1.Zone.NameRecordResource":{"properties":{"content":{"description":"Content of the name record","type":"string","example":"mydomain.tld."},"is_disabled":{"description":"Flag to mark name record as disabled","type":"boolean","example":false}},"type":"object"},"DNS.V1.Zone.RecordCollection":{"description":"Array of [`DNS.V1.Zone.RecordResource`](#model/dnsv1zonerecordresource)","type":"array","items":{"$ref":"#/components/schemas/DNS.V1.Zone.RecordResource"}},"DNS.V1.Zone.RecordResource":{"properties":{"name":{"description":"Name of the record (use `@` for wildcard name)","type":"string","example":"www"},"records":{"$ref":"#/components/schemas/DNS.V1.Zone.NameRecordCollection"},"ttl":{"description":"TTL (Time-To-Live) of the record","type":"integer","example":14400},"type":{"description":"Type of the record","type":"string","enum":["A","AAAA","CNAME","ALIAS","MX","TXT","NS","SOA","SRV","CAA"],"example":"A"}},"type":"object"},"DomainAccessVerifier.V2.Verifications.ActiveVerificationsCollection":{"description":"Returns active verifications (PENDING and VERIFIED) grouped by status and domain. Includes last and next verification attempt dates and expiration for PENDING verifications.","properties":{"data":{"description":"List of active verifications by status. If no verifications are found, this will return an empty array.","properties":{"PENDING":{"description":"Pending verifications grouped by domain. Keys are domain names (e.g., \"pixel.tld\"). This property will not be returned if no pending verifications are found.","properties":{"DOMAIN.TLD":{"description":"Domain name (example). Contains verification types as properties.","properties":{"VERIFICATION_TYPE":{"description":"Verification type (\"NAMESERVERS\" or \"TXT\"). Only verification types that exist for this domain will be present.","properties":{"records":{"description":"Verification records","type":"array","items":{"type":"string"}},"last_verification_attempt":{"description":"Datetime when last verification attempt occurred","type":"string","example":"2025-08-05 13:15:00"},"next_verification_attempt":{"description":"Datetime when next verification attempt will occur","type":"string","example":"2025-08-05 14:30:00"},"verification_expiration":{"description":"Datetime when verification expires","type":"string","example":"2025-08-12 13:15:00"}},"type":"object"}},"type":"object"}},"type":"object"},"VERIFIED":{"description":"Verified verifications grouped by domain. Keys are domain names (e.g., \"byte.tld\"). This property will not be returned if no verified verifications are found.","properties":{"DOMAIN.TLD":{"description":"Domain name (example). Contains verification types as properties.","properties":{"VERIFICATION_TYPE":{"description":"Verification type (e.g., \"NAMESERVERS\", \"TXT\"). Only verification types that exist for this domain will be present.","properties":{"records":{"description":"Verification records","type":"array","items":{"type":"string"}}},"type":"object"}},"type":"object"}},"type":"object"}},"type":"object"}},"type":"object","example":{"data":{"PENDING":{"pixel.tld":{"NAMESERVERS":{"records":["ns1.nameserver.com","ns2.nameserver.com"],"last_verification_attempt":"2025-08-05 13:15:00","next_verification_attempt":"2025-08-05 14:30:00","verification_expiration":"2025-08-12 13:15:00"},"TXT":{"records":["txt-verification-hash"],"last_verification_attempt":"2025-08-05 14:45:00","next_verification_attempt":"2025-08-05 15:00:00","verification_expiration":"2025-08-12 14:45:00"}}},"VERIFIED":{"byte.tld":{"TXT":{"records":["other-txt-verification-hash"]}}}}}},"Domains.V1.Availability.AlternativeCollection":{"description":"Suggested domain names","type":"array","items":{"type":"string","example":"mydomain.tld"}},"Domains.V1.Availability.AvailabilityCollection":{"description":"Array of [`Domains.V1.Availability.AvailabilityResource`](#model/domainsv1availabilityavailabilityresource)","type":"array","items":{"$ref":"#/components/schemas/Domains.V1.Availability.AvailabilityResource"}},"Domains.V1.Availability.AvailabilityResource":{"properties":{"domain":{"description":"Domain name, `null` when not claimed free domain","type":"string","example":"mydomain.tld","nullable":true},"is_available":{"description":"`true` if domain is available for registration","type":"boolean","example":true},"is_alternative":{"description":"`true` if domain is provided as an alternative","type":"boolean","example":false},"restriction":{"description":"Special rules and/or restrictions applied for registering TLD","type":"string","nullable":true}},"type":"object"},"Domains.V1.Domain.DomainCollection":{"description":"Array of [`Domains.V1.Domain.DomainResource`](#model/domainsv1domaindomainresource)","type":"array","items":{"$ref":"#/components/schemas/Domains.V1.Domain.DomainResource"}},"Domains.V1.Domain.DomainExtendedResource":{"properties":{"domain":{"description":"Domain name","type":"string","example":"mydomain.tld"},"status":{"description":"Status of the domain","type":"string","enum":["active","pending_setup","expired","requested","pending_verification","deleted","suspended","failed"],"example":"active"},"message":{"type":"string","nullable":true},"is_privacy_protection_allowed":{"description":"Is privacy protection allowed for the domain","type":"boolean","example":true},"is_privacy_protected":{"description":"Is privacy protection enabled for the domain","type":"boolean","example":false},"is_lockable":{"description":"Is domain allowed to be locked","type":"boolean","example":true},"is_locked":{"description":"Is domain locked","type":"boolean","example":true},"name_servers":{"description":"Name servers","properties":{"ns1":{"description":"Name server 1","type":"string","example":"ns1.example.tld"},"ns2":{"description":"Name server 2","type":"string","example":"ns2.example.tld"}},"type":"object","example":{"ns1":"ns1.example.tld","ns2":"ns2.example.tld"}},"child_name_servers":{"description":"Child name servers","type":"array","items":{"type":"array","items":{"type":"string"}},"example":{"ns1.example.tld":["258.231.55.321","258.231.55.322"]}},"domain_contacts":{"description":"WHOIS profiles","properties":{"admin_id":{"description":"Admin WHOIS profile ID","type":"integer","example":114698},"owner_id":{"description":"Owner WHOIS profile ID","type":"integer","example":614698},"billing_id":{"description":"Billing WHOIS profile ID","type":"integer","example":154698},"tech_id":{"description":"Technician WHOIS profile ID","type":"integer","example":524248}},"type":"object"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"60_days_lock_expires_at":{"type":"string","format":"date-time","example":"2025-04-27T11:54:22Z","nullable":true},"registered_at":{"type":"string","format":"date-time","example":"2025-02-27T12:54:22Z","nullable":true},"expires_at":{"type":"string","format":"date-time","example":"2025-03-27T11:54:22Z","nullable":true}},"type":"object"},"Domains.V1.Domain.DomainResource":{"properties":{"id":{"description":"Domain ID","type":"integer","example":13632},"domain":{"description":"Domain name, `null` when not claimed free domain","type":"string","example":"mydomain.tld","nullable":true},"type":{"type":"string","enum":["domain","free_domain","domain_transfer","free_domain_transfer"],"example":"domain"},"status":{"type":"string","enum":["active","pending_setup","expired","requested","pending_verification","deleted","suspended","failed"],"example":"active"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"expires_at":{"type":"string","format":"date-time","example":"2025-03-27T11:54:22Z","nullable":true}},"type":"object"},"Domains.V1.Forwarding.ForwardingResource":{"properties":{"domain":{"description":"Domain name","type":"string","example":"mydomain.tld","nullable":true},"redirect_type":{"description":"Redirect type","type":"string","enum":["301","302"],"example":"301","x-enum-descriptions":{"301":"Permanent","302":"Temporary"}},"redirect_url":{"description":"URL domain is forwarded to","type":"string","example":"https://forward.to.my.url"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-03-27T11:54:22Z","nullable":true}},"type":"object"},"Domains.V1.IRTP.VerificationResource":{"properties":{"domain":{"description":"Domain name","type":"string","example":"mydomain.tld"},"status":{"description":"IRTP verification status","type":"string","enum":["pending","completed","canceled"],"example":"pending"},"old_confirmed_at":{"description":"When the old registrant confirmed the change","type":"string","format":"date-time","example":"2026-03-19T08:07:49Z","nullable":true},"new_confirmed_at":{"description":"When the new registrant confirmed the change","type":"string","format":"date-time","example":"2026-03-19T08:07:49Z","nullable":true},"old_whois_profile_email":{"description":"Email the old registrant confirmation was sent to","type":"string","example":"old-registrant@example.com"},"new_whois_profile_email":{"description":"Email the new registrant confirmation was sent to","type":"string","example":"new-registrant@example.com"},"expires_at":{"description":"When the verification auto-cancels if unconfirmed","type":"string","format":"date-time","example":"2026-03-24T08:07:49Z"}},"type":"object"},"Domains.V1.Move.MoveCollection":{"description":"Array of [`Domains.V1.Move.MoveResource`](#model/domainsv1movemoveresource)","type":"array","items":{"$ref":"#/components/schemas/Domains.V1.Move.MoveResource"}},"Domains.V1.Move.MoveResource":{"properties":{"domain":{"description":"Domain name","type":"string","example":"mydomain.tld"},"status":{"description":"Status of the move","type":"string","enum":["initiated","activating","completed"],"example":"initiated"},"created_at":{"type":"string","format":"date-time","example":"2026-08-04T10:00:00Z"},"updated_at":{"type":"string","format":"date-time","example":"2026-08-04T10:00:00Z"}},"type":"object"},"Domains.V1.Portfolio.AuthCode.AuthCodeResource":{"properties":{"auth_code":{"description":"Domain authorization code used to transfer the domain to another registrar.","type":"string","example":"RN0000","nullable":true}},"type":"object"},"Domains.V1.Portfolio.ClaimResource":{"properties":{"domain":{"description":"Domain name","type":"string","example":"mydomain.tld","nullable":true},"status":{"description":"Domain status","type":"string","enum":["active","pending_setup","expired","requested","pending_verification","deleted","suspended","failed"],"example":"active","nullable":true},"created_at":{"type":"string","format":"date-time","example":"2026-08-05T10:14:22Z","nullable":true}},"type":"object"},"Domains.V1.Portfolio.Renewal.RenewalInformationResource":{"properties":{"domain":{"description":"Domain name","type":"string","example":"mydomain.tld"},"status":{"description":"Domain status","type":"string","example":"Active"},"expires_at":{"description":"Domain expiration date","type":"string","format":"date-time","example":"2027-05-25 13:53:04"}},"type":"object"},"Domains.V1.Transfer.TransferCollection":{"description":"Array of [`Domains.V1.Transfer.TransferResource`](#model/domainsv1transfertransferresource)","type":"array","items":{"$ref":"#/components/schemas/Domains.V1.Transfer.TransferResource"}},"Domains.V1.Transfer.TransferResource":{"properties":{"domain":{"description":"Domain name","type":"string","example":"mydomain.tld"},"status":{"description":"Transfer status","type":"string","example":"Completed"},"initiated_at":{"description":"When the transfer was initiated","type":"string","format":"date-time","example":"2026-03-19T08:07:49Z","nullable":true},"completed_at":{"description":"When the transfer completed","type":"string","format":"date-time","example":"2026-03-24T08:15:01Z","nullable":true}},"type":"object"},"Domains.V1.WHOIS.ProfileCollection":{"description":"Array of [`Domains.V1.WHOIS.ProfileResource`](#model/domainsv1whoisprofileresource)","type":"array","items":{"$ref":"#/components/schemas/Domains.V1.WHOIS.ProfileResource"}},"Domains.V1.WHOIS.ProfileResource":{"properties":{"id":{"description":"WHOIS Profile ID","type":"integer","example":746263},"tld":{"description":"TLD to which contact profile can be applied to","type":"string","example":"com"},"country":{"description":"ISO 3166 2-letter country code","type":"string","example":"NL"},"entity_type":{"description":"WHOIS profile entity type","type":"string","enum":["individual","organization"],"example":"individual"},"whois_details":{"description":"WHOIS profile details","type":"object","example":{"first_name":"John","last_name":"Doe","email":"john@doe.tld"}},"tld_details":{"description":"TLD details","type":"object"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-03-19T11:54:22Z"}},"type":"object"},"Domains.V1.WHOIS.ProfileUsageResource":{"description":"Array of domains","type":"array","items":{"type":"string"},"example":["mydomain1.tld","mydomain2.tld"]},"Ecommerce.V1.Discount.DiscountCollection":{"description":"Array of [`Ecommerce.V1.Discount.DiscountResource`](#model/ecommercev1discountdiscountresource)","type":"array","items":{"$ref":"#/components/schemas/Ecommerce.V1.Discount.DiscountResource"}},"Ecommerce.V1.Discount.DiscountResource":{"properties":{"id":{"description":"The discount ID, required by every other discount endpoint.","type":"string","example":"disc_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"code":{"description":"The discount code customers enter at checkout.","type":"string","example":"BLACKFRIDAY"},"name":{"description":"The discount name, or null.","type":"string","example":"Black Friday","nullable":true},"type":{"description":"The discount type, or null.","type":"string","enum":["percentage","fixed","free_shipping"],"example":"percentage","nullable":true},"value":{"description":"The discount value, or null. Percentage is 1-100; fixed is in the smallest currency unit.","type":"integer","example":20,"nullable":true},"allocation":{"description":"Whether the discount applies to the cart total or to each item, or null.","type":"string","enum":["total","item"],"example":"total","nullable":true},"is_disabled":{"description":"Whether the discount is disabled.","type":"boolean","example":false},"starts_at":{"description":"When the discount becomes active.","type":"string","format":"date-time","example":"2026-01-21T07:35:04.000000Z"},"ends_at":{"description":"When the discount expires, or null.","type":"string","format":"date-time","example":null,"nullable":true},"usage_limit":{"description":"Maximum number of redemptions, or null for unlimited.","type":"integer","example":null,"nullable":true},"usage_count":{"description":"Number of times the discount has been redeemed.","type":"integer","example":0}},"type":"object"},"Ecommerce.V1.Discount.DiscountResponseResource":{"properties":{"data":{"$ref":"#/components/schemas/Ecommerce.V1.Discount.DiscountResource"}},"type":"object"},"Ecommerce.V1.Miscellaneous.CustomStorefrontInstructionsResource":{"properties":{"instructions":{"description":"Markdown setup instructions for connecting a custom sales channel to your store.","type":"string","example":"# Connect your custom storefront\n\nUse the Ecommerce API to sync your store."}},"type":"object"},"Ecommerce.V1.Order.OrderCollection":{"description":"Array of [`Ecommerce.V1.Order.OrderResource`](#model/ecommercev1orderorderresource)","type":"array","items":{"$ref":"#/components/schemas/Ecommerce.V1.Order.OrderResource"}},"Ecommerce.V1.Order.OrderDetailResource":{"properties":{"id":{"description":"The order ID.","type":"string","example":"order_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"display_id":{"description":"The order number.","type":"integer","example":1042},"status":{"description":"The order status.","type":"string","example":"pending"},"payment_status":{"description":"The payment status.","type":"string","example":"captured"},"fulfillment_status":{"description":"The fulfilment status.","type":"string","example":"not_fulfilled"},"total":{"description":"Order total in the smallest currency unit.","type":"integer","example":4999},"currency_code":{"description":"The order currency code.","type":"string","example":"usd"},"customer_email":{"description":"The customer email.","type":"string","example":"buyer@example.com","nullable":true},"item_count":{"description":"Number of distinct line items.","type":"integer","example":3},"created_at":{"description":"ISO timestamp of when the order was created.","type":"string","format":"date-time","example":"2026-01-21T07:35:04.000000Z"},"merchant_note":{"description":"Internal note visible only to the merchant.","type":"string","example":"Ship in a gift box.","nullable":true},"subtotal":{"description":"Subtotal in the smallest currency unit.","type":"integer","example":4500},"discount_total":{"description":"Discount total in the smallest currency unit.","type":"integer","example":0},"tax_total":{"description":"Tax total in the smallest currency unit.","type":"integer","example":199},"shipping_total":{"description":"Shipping total in the smallest currency unit.","type":"integer","example":300},"paid_total":{"description":"Amount paid in the smallest currency unit.","type":"integer","example":4999},"refunded_total":{"description":"Amount refunded in the smallest currency unit.","type":"integer","example":0},"shipping_address":{"description":"The shipping address, or null.","properties":{"name":{"type":"string","example":"Jane Buyer","nullable":true},"company":{"type":"string","example":null,"nullable":true},"address_1":{"type":"string","example":"123 Main St","nullable":true},"address_2":{"type":"string","example":null,"nullable":true},"city":{"type":"string","example":"Springfield","nullable":true},"province_code":{"type":"string","example":"IL","nullable":true},"postal_code":{"type":"string","example":"62704","nullable":true},"country_code":{"type":"string","example":"us","nullable":true},"phone":{"type":"string","example":"+15551234567","nullable":true}},"type":"object","nullable":true},"billing_address":{"description":"The billing address, or null.","properties":{"name":{"type":"string","example":"Jane Buyer","nullable":true},"company":{"type":"string","example":null,"nullable":true},"address_1":{"type":"string","example":"123 Main St","nullable":true},"address_2":{"type":"string","example":null,"nullable":true},"city":{"type":"string","example":"Springfield","nullable":true},"province_code":{"type":"string","example":"IL","nullable":true},"postal_code":{"type":"string","example":"62704","nullable":true},"country_code":{"type":"string","example":"us","nullable":true},"phone":{"type":"string","example":"+15551234567","nullable":true}},"type":"object","nullable":true},"items":{"description":"The order line items.","type":"array","items":{"properties":{"id":{"description":"The line item ID, required by the fulfil endpoint.","type":"string","example":"item_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"title":{"description":"The line item title.","type":"string","example":"Blue T-Shirt / M"},"sku":{"description":"The variant SKU.","type":"string","example":"TSHIRT-BLU-M","nullable":true},"variant_id":{"description":"The variant ID.","type":"string","example":"variant_01J8Z5F8W9K8M4A7B3C2D1E0FG","nullable":true},"quantity":{"description":"Quantity ordered.","type":"integer","example":2},"fulfilled_quantity":{"description":"Quantity already fulfilled.","type":"integer","example":0},"returned_quantity":{"description":"Quantity returned.","type":"integer","example":0},"unit_price":{"description":"Unit price in the smallest currency unit.","type":"integer","example":2250},"total":{"description":"Line total in the smallest currency unit.","type":"integer","example":4500}},"type":"object"}},"fulfillments":{"description":"The order fulfilments with tracking.","type":"array","items":{"properties":{"id":{"description":"The fulfilment ID.","type":"string","example":"ful_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"created_at":{"description":"ISO timestamp of when the fulfilment was created.","type":"string","format":"date-time","example":"2026-01-22T07:35:04.000000Z"},"shipped_at":{"description":"ISO timestamp of when the fulfilment shipped, if known.","type":"string","format":"date-time","example":null,"nullable":true},"canceled_at":{"description":"ISO timestamp of when the fulfilment was canceled, if any.","type":"string","format":"date-time","example":null,"nullable":true},"tracking":{"description":"Tracking numbers attached to the fulfilment.","type":"array","items":{"properties":{"tracking_number":{"description":"Carrier tracking number.","type":"string","example":"1Z999AA10123456784"},"url":{"description":"Public tracking URL, when available.","type":"string","example":"https://track.example.com/1Z999AA10123456784","nullable":true}},"type":"object"}}},"type":"object"}}},"type":"object"},"Ecommerce.V1.Order.OrderDetailResponseResource":{"properties":{"data":{"$ref":"#/components/schemas/Ecommerce.V1.Order.OrderDetailResource"}},"type":"object"},"Ecommerce.V1.Order.OrderResource":{"properties":{"id":{"description":"The order ID, required by every other order endpoint.","type":"string","example":"order_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"display_id":{"description":"The order number the merchant and customer see.","type":"integer","example":1042},"status":{"description":"The order status.","type":"string","example":"pending"},"payment_status":{"description":"The payment status. A paid order is \"captured\".","type":"string","example":"captured"},"fulfillment_status":{"description":"The fulfilment status.","type":"string","example":"not_fulfilled"},"total":{"description":"Order total in the smallest currency unit.","type":"integer","example":4999},"currency_code":{"description":"The order currency code.","type":"string","example":"usd"},"customer_email":{"description":"The customer email.","type":"string","example":"buyer@example.com","nullable":true},"item_count":{"description":"Number of distinct line items. Retrieve the order for the items themselves.","type":"integer","example":3},"created_at":{"description":"ISO timestamp of when the order was created.","type":"string","format":"date-time","example":"2026-01-21T07:35:04.000000Z"}},"type":"object"},"Ecommerce.V1.Order.OrderResponseResource":{"properties":{"data":{"$ref":"#/components/schemas/Ecommerce.V1.Order.OrderResource"}},"type":"object"},"Ecommerce.V1.Payment.ManualPaymentResource":{"properties":{"payment_method":{"properties":{"id":{"description":"Store payment provider ID.","type":"string","example":"spp_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"provider_id":{"description":"The payment provider identifier.","type":"string","example":"manual"},"is_enabled":{"description":"Whether the payment method is shown at checkout.","type":"boolean","example":true},"title":{"description":"Display name shown to customers at checkout.","type":"string","example":"Cash on delivery"}},"type":"object"},"admin_url":{"description":"Admin UI deep-link to manage payment settings.","type":"string","example":"https://admin.example.com/store_01.../store-settings/payment-management"}},"type":"object"},"Ecommerce.V1.PaymentProvider.PaymentProviderConnectLinkResource":{"properties":{"data":{"properties":{"url":{"description":"The gateway onboarding URL for the merchant to open.","type":"string","example":"https://connect.stripe.com/setup/s/example"},"admin_url":{"description":"A deep-link into the store admin for the provider.","type":"string","example":"https://admin.example.com/payments/stripe"}},"type":"object"}},"type":"object"},"Ecommerce.V1.PaymentProvider.PaymentProviderListResource":{"properties":{"data":{"properties":{"connected":{"description":"Payment providers already connected to the store.","type":"array","items":{"properties":{"id":{"description":"The store payment provider row ID.","type":"string","example":"storepp_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"provider_id":{"description":"The payment gateway ID, e.g. stripe.","type":"string","example":"stripe"},"title":{"description":"The provider title, or null.","type":"string","example":"Stripe","nullable":true},"is_enabled":{"description":"Whether the provider is enabled for the store.","type":"boolean","example":true},"status":{"description":"The connection status.","type":"string","enum":["connected","pending","new","invalid"],"example":"connected","nullable":true},"shows_at_checkout":{"description":"Whether the provider shows at checkout.","type":"boolean","example":true}},"type":"object"}},"available":{"description":"Payment gateways available to install for the store.","type":"array","items":{"properties":{"id":{"description":"The payment gateway ID, e.g. stripe.","type":"string","example":"stripe"},"is_installed":{"description":"Whether the gateway is installed on the store.","type":"boolean","example":false},"is_enabled":{"description":"Whether the gateway is enabled on the store.","type":"boolean","example":false},"is_currency_supported":{"description":"Whether the gateway supports the store currency.","type":"boolean","example":true},"supported_currencies":{"description":"Currencies the gateway supports; present only when the store currency is unsupported.","type":"array","items":{"type":"string","example":"usd"}}},"type":"object"}}},"type":"object"}},"type":"object"},"Ecommerce.V1.Product.ProductCollection":{"description":"Array of [`Ecommerce.V1.Product.ProductResource`](#model/ecommercev1productproductresource)","type":"array","items":{"$ref":"#/components/schemas/Ecommerce.V1.Product.ProductResource"}},"Ecommerce.V1.Product.ProductCreationResource":{"properties":{"product":{"properties":{"id":{"description":"Product ID.","type":"string","example":"prod_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"title":{"description":"Product name.","type":"string","example":"My Product"},"type":{"description":"Product type.","type":"string","enum":["physical","digital"],"example":"physical"},"status":{"description":"Product status.","type":"string","example":"published"},"price":{"description":"Price in the smallest currency unit (e.g. cents).","type":"integer","example":1000},"currency_code":{"description":"Currency the product is priced in (ISO 4217, lowercase).","type":"string","example":"usd"}},"type":"object"},"admin_url":{"description":"Admin UI deep-link to manage the product.","type":"string","example":"https://admin.example.com/store_01.../products/edit?product=prod_01..."}},"type":"object"},"Ecommerce.V1.Product.ProductDeletedResource":{"properties":{"data":{"properties":{"id":{"description":"The ID of the product.","type":"string","example":"prod_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"is_deleted":{"description":"True when the product was deleted.","type":"boolean","example":true},"is_archived":{"description":"True when the product was archived instead of deleted (a subscription product with active subscribers).","type":"boolean","example":false}},"type":"object"}},"type":"object"},"Ecommerce.V1.Product.ProductImageUploadResource":{"properties":{"url":{"description":"CDN URL of the uploaded image.","type":"string","example":"https://cdn.example.com/store_01.../assets/01J8Z5F8W9K8M4A7B3C2D1E0FG.png"},"is_thumbnail":{"description":"Whether the image was set as the product's thumbnail (primary image).","type":"boolean","example":true}},"type":"object"},"Ecommerce.V1.Product.ProductImageUploadUrlResource":{"properties":{"upload_url":{"description":"Signed URL to upload the image to with a multipart/form-data POST.","type":"string","example":"https://storage.googleapis.com/ecommerce-quarantine-euw3"},"fields":{"description":"Form fields to send alongside the file in the multipart POST.","type":"object","additionalProperties":{"type":"string"}},"object_name":{"description":"Key of the uploaded object — send it to the attach-image endpoint.","type":"string","example":"store_01J8Z5F8W9K8M4A7B3C2D1E0FG/01J8Z5F8W9K8M4A7B3C2D1E0FG"},"max_bytes":{"description":"Maximum accepted upload size in bytes.","type":"integer","example":15728640}},"type":"object"},"Ecommerce.V1.Product.ProductResource":{"properties":{"id":{"description":"The product ID, required by every other product endpoint.","type":"string","example":"prod_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"title":{"description":"The product name.","type":"string","example":"Blue T-Shirt"},"status":{"description":"The product status.","type":"string","enum":["draft","proposed","published","rejected","archived"],"example":"published"},"thumbnail":{"description":"The product's primary image URL, or null.","type":"string","example":"https://cdn.example.com/prod/thumb.jpg","nullable":true},"type":{"description":"The product type.","type":"string","example":"physical"},"variant_count":{"description":"Number of variants. Use include=variants to retrieve them.","type":"integer","example":3},"price_range":{"description":"Effective price bounds across the product's variants.","properties":{"min":{"description":"Lowest effective variant price in the smallest currency unit, or null if unpriced.","type":"integer","example":1999,"nullable":true},"max":{"description":"Highest effective variant price in the smallest currency unit, or null if unpriced.","type":"integer","example":2499,"nullable":true},"currency_code":{"description":"The store currency the range is expressed in.","type":"string","example":"usd"}},"type":"object"},"variants":{"description":"Present (non-null) only when include=variants is set; null otherwise.","type":"array","items":{"properties":{"id":{"description":"The variant ID.","type":"string","example":"variant_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"title":{"description":"The variant title.","type":"string","example":"Medium","nullable":true},"sku":{"description":"The variant SKU.","type":"string","example":"TSHIRT-BLU-M","nullable":true},"options":{"description":"The variant's option values.","type":"array","items":{"properties":{"name":{"description":"Option name, e.g. Size.","type":"string","example":"Size","nullable":true},"value":{"description":"Option value, e.g. L.","type":"string","example":"M"}},"type":"object"}},"prices":{"description":"Prices per currency, in the smallest currency unit.","type":"array","items":{"properties":{"amount":{"description":"Price in the smallest currency unit.","type":"integer","example":1999},"sale_amount":{"description":"Sale price in the smallest currency unit, or null.","type":"integer","example":null,"nullable":true},"currency_code":{"description":"The price currency code.","type":"string","example":"usd"}},"type":"object"}},"inventory_quantity":{"description":"Units in stock.","type":"integer","example":42},"manage_inventory":{"description":"Whether stock is tracked for this variant.","type":"boolean","example":true}},"type":"object"},"nullable":true},"media":{"description":"Present (non-null) only when include=media is set; null otherwise.","type":"array","items":{"properties":{"url":{"description":"The media URL.","type":"string","example":"https://cdn.example.com/prod/1.jpg"},"type":{"description":"The media type, e.g. image or video.","type":"string","example":"image"},"is_thumbnail":{"description":"Whether this media is the product's thumbnail.","type":"boolean","example":true}},"type":"object"},"nullable":true}},"type":"object"},"Ecommerce.V1.Product.ProductResponseResource":{"properties":{"data":{"$ref":"#/components/schemas/Ecommerce.V1.Product.ProductResource"}},"type":"object"},"Ecommerce.V1.SalesChannel.SalesChannelCreationResource":{"properties":{"sales_channel":{"properties":{"id":{"description":"Sales channel ID","type":"string","example":"scha_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"type":{"description":"Sales channel type","type":"string","enum":["builder","horizons","tiktok","custom","quick-link","wordpress"],"example":"custom"},"is_primary":{"description":"Whether this is the primary sales channel.","type":"boolean","example":false},"is_active":{"description":"Whether the sales channel is active.","type":"boolean","example":true},"external_id":{"description":"External identifier for the sales channel.","type":"string","example":null,"nullable":true},"name":{"description":"Merchant-facing custom name.","type":"string","example":"Vintagio Onepager","nullable":true},"domain":{"description":"Public address where the custom sales channel lives.","type":"string","example":"https://www.bestshirt.vintagio.com","nullable":true}},"type":"object"}},"type":"object"},"Ecommerce.V1.SalesChannel.SalesChannelListResource":{"properties":{"sales_channels":{"description":"The store's active sales channels.","type":"array","items":{"properties":{"id":{"description":"Sales channel ID","type":"string","example":"scha_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"type":{"description":"Sales channel type","type":"string","enum":["builder","horizons","tiktok","custom","quick-link","wordpress"],"example":"custom"},"is_primary":{"description":"Whether this is the primary sales channel.","type":"boolean","example":false},"is_active":{"description":"Whether the sales channel is active.","type":"boolean","example":true},"external_id":{"description":"External identifier for the sales channel.","type":"string","example":null,"nullable":true},"name":{"description":"Merchant-facing custom name.","type":"string","example":"Vintagio Onepager","nullable":true},"domain":{"description":"Public address where the sales channel lives.","type":"string","example":"https://www.bestshirt.vintagio.com","nullable":true}},"type":"object"}}},"type":"object"},"Ecommerce.V1.SalesChannel.SalesChannelUpdateResource":{"properties":{"sales_channel":{"properties":{"id":{"description":"Sales channel ID","type":"string","example":"scha_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"type":{"description":"Sales channel type","type":"string","enum":["builder","horizons","tiktok","custom","quick-link","wordpress"],"example":"custom"},"is_primary":{"description":"Whether this is the primary sales channel.","type":"boolean","example":false},"is_active":{"description":"Whether the sales channel is active.","type":"boolean","example":true},"external_id":{"description":"External identifier for the sales channel.","type":"string","example":null,"nullable":true},"name":{"description":"Merchant-facing custom name.","type":"string","example":"Vintagio Onepager","nullable":true},"domain":{"description":"Public address where the custom sales channel lives.","type":"string","example":"https://www.bestshirt.vintagio.com","nullable":true}},"type":"object"}},"type":"object"},"Ecommerce.V1.Shipping.ShippingResource":{"properties":{"shipping_option":{"properties":{"id":{"description":"Shipping option ID.","type":"string","example":"so_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"amount":{"description":"Flat shipping rate in the smallest currency unit (e.g. cents).","type":"integer","example":500},"currency_code":{"description":"Currency code the rate is charged in (ISO 4217, lowercase).","type":"string","example":"usd"}},"type":"object"},"admin_url":{"description":"Admin UI deep-link to manage shipping settings.","type":"string","example":"https://admin.example.com/store_01.../store-settings/shipping"}},"type":"object"},"Ecommerce.V1.Store.StoreCollection":{"description":"Array of [`Ecommerce.V1.Store.StoreResource`](#model/ecommercev1storestoreresource)","type":"array","items":{"$ref":"#/components/schemas/Ecommerce.V1.Store.StoreResource"}},"Ecommerce.V1.Store.StoreCreationResource":{"properties":{"store":{"properties":{"id":{"description":"Store ID","type":"string","example":"store_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"name":{"description":"Store name","type":"string","example":"My Store","nullable":true},"company_name":{"description":"Company name","type":"string","example":"My Company","nullable":true},"h_panel_id":{"description":"Identifier of the hPanel account that owns the store.","type":"string","example":"1234567"},"created_at":{"description":"Creation date","type":"string","format":"date-time","example":"2026-01-21T07:35:04.000000Z"},"default_currency_code":{"description":"Default currency code (ISO 4217), in lowercase.","type":"string","example":"usd"}},"type":"object"},"sales_channel":{"properties":{"id":{"description":"Sales channel ID","type":"string","example":"scha_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"type":{"description":"Sales channel type","type":"string","enum":["builder","horizons","tiktok","custom","quick-link","wordpress"],"example":"custom"},"external_id":{"description":"External identifier for the sales channel","type":"string","example":null,"nullable":true}},"type":"object"}},"type":"object"},"Ecommerce.V1.Store.StoreDeleteResource":{"properties":{"id":{"description":"The ID of the deleted store.","type":"string","example":"store_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"is_deleted":{"description":"Always true when the store was soft-deleted.","type":"boolean","example":true}},"type":"object"},"Ecommerce.V1.Store.StoreMetadataResource":{"properties":{"metadata":{"properties":{"has_payment_methods":{"description":"Whether the store has at least one payment method connected.","type":"boolean","example":true},"has_shipping":{"description":"Whether the store has at least one shipping option configured.","type":"boolean","example":true},"default_currency_code":{"description":"The default currency code of the store.","type":"string","example":"eur"},"default_currency":{"description":"The store's default currency, or null when unset.","properties":{"code":{"type":"string","example":"eur"},"symbol":{"type":"string","example":"€"},"symbol_native":{"type":"string","example":"€"},"name":{"type":"string","example":"Euro"},"name_plural":{"type":"string","example":"Euros"},"decimal_digits":{"type":"integer","example":2},"rounding":{"type":"number","example":0},"template":{"type":"string","example":"€$1","nullable":true},"min_amount":{"type":"number","example":50,"nullable":true}},"type":"object","nullable":true}},"type":"object"}},"type":"object"},"Ecommerce.V1.Store.StoreResource":{"properties":{"id":{"description":"Store ID","type":"string","example":"store_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"name":{"description":"Store name","type":"string","example":"My Store","nullable":true},"created_at":{"description":"Creation date","type":"string","format":"date-time","example":"2026-01-21T07:35:04.000000Z"},"updated_at":{"description":"Last update date","type":"string","format":"date-time","example":"2026-01-21T07:35:04.000000Z"},"version":{"description":"Store platform version identifier (e.g. \"v2_standalone\").","type":"string","example":"v2_standalone"},"company_name":{"description":"Company name","type":"string","example":"My Company","nullable":true}},"type":"object"},"Ecommerce.V1.Variant.VariantCollection":{"description":"Array of [`Ecommerce.V1.Variant.VariantResource`](#model/ecommercev1variantvariantresource)","type":"array","items":{"$ref":"#/components/schemas/Ecommerce.V1.Variant.VariantResource"}},"Ecommerce.V1.Variant.VariantDeletedResource":{"properties":{"data":{"properties":{"id":{"description":"The ID of the variant.","type":"string","example":"variant_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"is_deleted":{"description":"True when the variant was deleted.","type":"boolean","example":true}},"type":"object"}},"type":"object"},"Ecommerce.V1.Variant.VariantListResponseResource":{"properties":{"data":{"description":"The variants.","type":"array","items":{"$ref":"#/components/schemas/Ecommerce.V1.Variant.VariantResource"}}},"type":"object"},"Ecommerce.V1.Variant.VariantResource":{"properties":{"id":{"description":"The variant ID, required by every other variant endpoint.","type":"string","example":"variant_01J8Z5F8W9K8M4A7B3C2D1E0FG"},"title":{"description":"The variant title, or null.","type":"string","example":"Red / M","nullable":true},"sku":{"description":"The variant SKU, or null.","type":"string","example":"TSHIRT-RED-M","nullable":true},"options":{"description":"The variant's option values.","type":"array","items":{"properties":{"name":{"description":"Option name, e.g. Size.","type":"string","example":"Size","nullable":true},"value":{"description":"Option value, e.g. M.","type":"string","example":"M"}},"type":"object"}},"prices":{"description":"Prices per currency, in the smallest currency unit.","type":"array","items":{"properties":{"amount":{"description":"Price in the smallest currency unit.","type":"integer","example":1999},"sale_amount":{"description":"Sale price in the smallest currency unit, or null.","type":"integer","example":null,"nullable":true},"currency_code":{"description":"The price currency code.","type":"string","example":"usd"}},"type":"object"}},"inventory_quantity":{"description":"Units in stock.","type":"integer","example":42},"manage_inventory":{"description":"Whether stock is tracked for this variant.","type":"boolean","example":true}},"type":"object"},"Ecommerce.V1.Variant.VariantResponseResource":{"properties":{"data":{"$ref":"#/components/schemas/Ecommerce.V1.Variant.VariantResource"}},"type":"object"},"Horizons.V1.Websites.CreatedWebsiteResource":{"required":["website_url","website_id"],"properties":{"website_url":{"description":"The website URL for the user to access their website in Hostinger Horizons interface","type":"string","example":"https://horizons.hostinger.com/123e4567-e89b-12d3-a456-426614174000?location=chatgpt"},"website_id":{"description":"The website ID","type":"string","example":"123e4567-e89b-12d3-a456-426614174000"}},"type":"object"},"Horizons.V1.Websites.WebsiteUrlResource":{"required":["website_url"],"properties":{"website_url":{"description":"The website URL for the user to access their website in Hostinger Horizons interface","type":"string","example":"https://horizons.hostinger.com/123e4567-e89b-12d3-a456-426614174000?location=chatgpt"}},"type":"object"},"Hosting.V1.CronJobs.CronJobCollection":{"description":"Array of [`Hosting.V1.CronJobs.CronJobResource`](#model/hostingv1cronjobscronjobresource)","type":"array","items":{"$ref":"#/components/schemas/Hosting.V1.CronJobs.CronJobResource"}},"Hosting.V1.CronJobs.CronJobOutputResource":{"required":["output"],"properties":{"output":{"description":"Output captured from the last cron job execution. Empty when the cron job has not run yet.","type":"string","example":""}},"type":"object"},"Hosting.V1.CronJobs.CronJobResource":{"properties":{"uid":{"description":"Unique identifier of the cron job. Use it to delete the cron job or fetch its output.","type":"string","example":"cron_abc123"},"username":{"description":"Username of the account that owns the cron job.","type":"string","example":"u123456789"},"time":{"description":"Cron schedule expression.","type":"string","example":"0 2 * * *"},"command":{"description":"Command executed on the schedule.","type":"string","example":"php /home/u123456789/cleanup.php"}},"type":"object"},"Hosting.V1.Databases.DatabaseCollection":{"description":"Array of [`Hosting.V1.Databases.DatabaseResource`](#model/hostingv1databasesdatabaseresource)","type":"array","items":{"$ref":"#/components/schemas/Hosting.V1.Databases.DatabaseResource"}},"Hosting.V1.Databases.DatabaseResource":{"properties":{"name":{"description":"Database name.","type":"string","example":"u123456789_test_db"},"user":{"description":"Database user.","type":"string","example":"u123456789_admin"},"domain":{"description":"Domain assigned to the database, or null when the database is unassigned.","type":"string","example":"example.com","nullable":true},"permissions":{"description":"Database user permissions keyed by permission name.","type":"object","example":{"Alter":1,"Drop":0}},"created_at":{"description":"Database creation date in ISO 8601 format.","type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"},"updated_at":{"description":"Database last update date in ISO 8601 format.","type":"string","format":"date-time","example":"2024-05-29T05:49:49+00:00"},"disk_usage_mb":{"description":"Current database disk usage in megabytes.","type":"integer","example":32,"nullable":true},"max_size_mb":{"description":"Maximum allowed database size in megabytes.","type":"integer","example":3072},"host":{"description":"MySQL hostname for remote connections. Same value as hPanel Remote MySQL.\nIdentical for every database on this account. Not the database user grant host.","type":"string","example":"srv1517.hstgr.io"},"port":{"description":"MySQL port for remote connections. Always 3306.","type":"integer","example":3306}},"type":"object"},"Hosting.V1.Databases.PhpMyAdminLinkResource":{"required":["link"],"properties":{"link":{"description":"Direct sign-on URL to phpMyAdmin for the specified database.","type":"string","example":"https://auth-db123.hostinger.com/signon.php?sid=abc123"}},"type":"object"},"Hosting.V1.Databases.RemoteConnections.RemoteConnectionCollection":{"description":"Array of [`Hosting.V1.Databases.RemoteConnections.RemoteConnectionResource`](#model/hostingv1databasesremoteconnectionsremoteconnectionresource)","type":"array","items":{"$ref":"#/components/schemas/Hosting.V1.Databases.RemoteConnections.RemoteConnectionResource"}},"Hosting.V1.Databases.RemoteConnections.RemoteConnectionResource":{"properties":{"database_name":{"description":"Full name of the database the rule applies to.","type":"string","example":"u123456789_shop"},"database_user":{"description":"Database user the rule applies to.","type":"string","example":"u123456789_admin"},"ip":{"description":"Allowed remote host: an IPv4/IPv6 address, or \"%\" for any host.","type":"string","example":"192.0.2.10"}},"type":"object"},"Hosting.V1.Datacenter.CoordinatesResource":{"properties":{"latitude":{"description":"Latitude coordinate","type":"number","format":"float","example":51.5074},"longitude":{"description":"Longitude coordinate","type":"number","format":"float","example":0.1278}},"type":"object"},"Hosting.V1.Datacenter.DatacenterCollection":{"description":"Array of [`Hosting.V1.Datacenter.DatacenterResource`](#model/hostingv1datacenterdatacenterresource)","type":"array","items":{"$ref":"#/components/schemas/Hosting.V1.Datacenter.DatacenterResource"}},"Hosting.V1.Datacenter.DatacenterResource":{"properties":{"title":{"description":"Data center title","type":"string","example":"Europe (UK)"},"code":{"description":"Data center code","type":"string","example":"uk-fast"},"coordinates":{"$ref":"#/components/schemas/Hosting.V1.Datacenter.CoordinatesResource"}},"type":"object"},"Hosting.V1.Domains.DomainAccessResource":{"properties":{"domain":{"description":"Domain name","type":"string","example":"example.com"},"is_accessible":{"description":"Whether domain is accessible","type":"boolean","example":false},"txt_to_verify":{"description":"TXT record for verification","type":"string","example":"example.com=example-verification-code"}},"type":"object"},"Hosting.V1.Domains.FreeSubdomainResource":{"properties":{"domain":{"description":"Generated free subdomain","type":"string","example":"palegreen-fox-548498.hostingersite.com"}},"type":"object"},"Hosting.V1.Domains.ParkedDomainCollection":{"description":"Array of [`Hosting.V1.Domains.ParkedDomainResource`](#model/hostingv1domainsparkeddomainresource)","type":"array","items":{"$ref":"#/components/schemas/Hosting.V1.Domains.ParkedDomainResource"}},"Hosting.V1.Domains.ParkedDomainResource":{"properties":{"username":{"description":"Website username","type":"string","example":"u123456789"},"domain":{"description":"Parked domain name or IP address","type":"string","example":"parked-domain.com"},"parent_domain":{"description":"Parent website domain","type":"string","example":"example.com"},"root_directory":{"description":"Parked domain root directory","type":"string","example":"/home/u123456789/domains/example.com/public_html"},"type":{"description":"Whether the parked value is a domain name or an IP address (IPv4 or IPv6)","type":"string","enum":["domain","ip"],"example":"domain"}},"type":"object"},"Hosting.V1.Domains.SubdomainCollection":{"description":"Array of [`Hosting.V1.Domains.SubdomainResource`](#model/hostingv1domainssubdomainresource)","type":"array","items":{"$ref":"#/components/schemas/Hosting.V1.Domains.SubdomainResource"}},"Hosting.V1.Domains.SubdomainResource":{"properties":{"username":{"description":"Website username","type":"string","example":"u123456789"},"domain":{"description":"Full subdomain","type":"string","example":"blog.example.com"},"parent_domain":{"description":"Parent website domain","type":"string","example":"example.com"},"root_directory":{"description":"Subdomain root directory","type":"string","example":"/home/u123456789/domains/blog.example.com/public_html"},"subdomain":{"description":"Subdomain prefix","type":"string","example":"blog"}},"type":"object"},"Hosting.V1.Files.FileContentResource":{"required":["path","content","from_line","total_lines","size_bytes"],"properties":{"path":{"description":"File path, relative to the document root.","type":"string","example":"index.php"},"content":{"description":"File content for the requested line range.","type":"string","example":"..."}},"type":"object"},"Hosting.V1.Php.PhpOptionResource":{"properties":{"type":{"description":"Declared option type (e.g. bool, string)","type":"string","example":"bool"},"value":{"description":"Current value for this website","type":"string","example":"On"},"comment":{"description":"Human-readable description","type":"string","example":"Allows PHP file functions to retrieve data from remote locations"},"default":{"description":"Default value","type":"string","example":"On"},"range":{"description":"Allowed value range or limits, when applicable","type":"string","example":"8M-512M","nullable":true},"max":{"description":"Maximum value allowed by the account hosting plan, when applicable","type":"string","example":"512M","nullable":true}},"type":"object"},"Hosting.V1.Php.PhpVersionsResource":{"properties":{"supported":{"description":"Key-value pairs of supported versions","type":"object","example":{"8.1":"PHP 8.1"}},"unsupported":{"description":"Key-value pairs of unsupported versions","type":"object","example":{"5.2":"PHP 5.2"}}},"type":"object"},"Hosting.V1.Redirects.RedirectCollection":{"description":"Array of [`Hosting.V1.Redirects.RedirectResource`](#model/hostingv1redirectsredirectresource)","type":"array","items":{"$ref":"#/components/schemas/Hosting.V1.Redirects.RedirectResource"}},"Hosting.V1.Redirects.RedirectResource":{"properties":{"from":{"description":"Source URL","type":"string","example":"https://example.com/old-page"},"to":{"description":"Destination URL","type":"string","example":"https://example.com/new-page"}},"type":"object"},"Hosting.V1.Websites.WebsiteCollection":{"description":"Array of [`Hosting.V1.Websites.WebsiteResource`](#model/hostingv1websiteswebsiteresource)","type":"array","items":{"$ref":"#/components/schemas/Hosting.V1.Websites.WebsiteResource"}},"Hosting.V1.Websites.WebsiteResource":{"properties":{"domain":{"description":"Website domain. Null for U4S websites with no domain attached.","type":"string","example":"example.com","nullable":true},"vhost_type":{"description":"Virtual host type. Only present for CloudLinux websites.","type":"string","enum":["main","addon","parked","subdomain"],"example":"main","nullable":true},"is_enabled":{"description":"Whether website is enabled","type":"boolean","example":true},"username":{"description":"Username. Not applicable for U4S websites.","type":"string","example":"cl_user123","nullable":true},"client_id":{"description":"Client ID","type":"integer","example":67890},"order_id":{"description":"Order ID","type":"integer","example":12345},"created_at":{"description":"Creation date","type":"string","format":"date-time","example":"2024-01-15T10:30:00+00:00"},"root_directory":{"description":"Root directory path. Only present for CloudLinux websites.","type":"string","example":"/home/u123456798/domains/example.com/public_html","nullable":true},"parent_domain":{"description":"Parent domain","type":"string","example":"parent.com","nullable":true},"website_type":{"description":"Type of website detected on the underlying platform.","type":"string","enum":["wordpress","builder","horizons","nodejs","other"],"example":"wordpress"},"horizons_uuid":{"description":"Horizons UUID. Only present for horizons websites.","type":"string","example":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","nullable":true}},"type":"object"},"Mail.V1.Aliases.AliasCollection":{"description":"Array of [`Mail.V1.Aliases.AliasResource`](#model/mailv1aliasesaliasresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Aliases.AliasResource"}},"Mail.V1.Aliases.AliasMailboxResource":{"properties":{"id":{"description":"Mailbox resource ID","type":"string","example":"AC1a2b3c4d5e6f7g"},"address":{"type":"string","example":"john@example.com"}},"type":"object"},"Mail.V1.Aliases.AliasResource":{"properties":{"id":{"description":"Unique alias identifier","type":"string","example":"AA1a2b3c4d5e6f7g"},"address":{"description":"Email address of the alias","type":"string","example":"info@example.com"},"mailbox":{"$ref":"#/components/schemas/Mail.V1.Aliases.AliasMailboxResource"},"is_active":{"description":"Whether the alias is active and not suspended","type":"boolean","example":true},"created_at":{"type":"string","format":"date-time","example":"2026-07-27T12:00:00Z","nullable":true},"updated_at":{"type":"string","format":"date-time","example":"2026-07-27T12:00:00Z"}},"type":"object"},"Mail.V1.ApiTokens.ApiTokenCollection":{"description":"Array of [`Mail.V1.ApiTokens.ApiTokenResource`](#model/mailv1apitokensapitokenresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.ApiTokens.ApiTokenResource"}},"Mail.V1.ApiTokens.ApiTokenCreatedResource":{"properties":{"id":{"description":"Unique API token identifier","type":"string","example":"019683f8-1234-7abc-8def-0123456789ab"},"token":{"description":"Plaintext API token, returned only in this response. Grants access to the [Hostinger Email API](https://api.mail.hostinger.com/) for mailbox provisioning and management.","type":"string","example":"4a6f8b2d1e9c3f7a0b5d8e2c4f1a7b3d9e6c2f8a1b4d7e0c3f6a9b2d5e8c1f4a"},"name":{"description":"Human-readable label for this token","type":"string","example":"CRM integration","nullable":true},"scope":{"$ref":"#/components/schemas/Mail.V1.ApiTokens.ApiTokenScopeResource"},"created_at":{"type":"string","format":"date-time","example":"2026-05-05T12:00:00Z"},"type":{"type":"string","enum":["api_token","oauth"],"example":"api_token"}},"type":"object"},"Mail.V1.ApiTokens.ApiTokenMailboxResource":{"properties":{"id":{"description":"Mailbox resource ID","type":"string","example":"AC1a2b3c4d5e6f7g"},"address":{"type":"string","example":"user@example.com"}},"type":"object"},"Mail.V1.ApiTokens.ApiTokenResource":{"properties":{"id":{"description":"Unique API token identifier","type":"string","example":"019683f8-1234-7abc-8def-0123456789ab"},"order_id":{"description":"Resource ID of the owning mail order","type":"string","example":"OR1a2b3c4d5e6f7g","nullable":true},"name":{"description":"Human-readable label for this token","type":"string","example":"CRM integration","nullable":true},"scope":{"$ref":"#/components/schemas/Mail.V1.ApiTokens.ApiTokenScopeResource"},"created_at":{"type":"string","format":"date-time","example":"2026-05-05T12:00:00Z"},"last_used_at":{"description":"Last successful authentication using this token","type":"string","format":"date-time","example":"2026-05-15T08:30:00Z","nullable":true},"type":{"type":"string","enum":["api_token","oauth"],"example":"api_token"}},"type":"object"},"Mail.V1.ApiTokens.ApiTokenScopeResource":{"properties":{"has_all_mailboxes":{"description":"Whether the token covers all current and future mailboxes of the order","type":"boolean","example":false},"mailboxes":{"description":"Mailboxes this token grants access to. Empty when `has_all_mailboxes` is true.","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.ApiTokens.ApiTokenMailboxResource"}}},"type":"object"},"Mail.V1.Autoreplies.AutoreplyCollection":{"description":"Array of [`Mail.V1.Autoreplies.AutoreplyResource`](#model/mailv1autorepliesautoreplyresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Autoreplies.AutoreplyResource"}},"Mail.V1.Autoreplies.AutoreplyMailboxResource":{"properties":{"id":{"description":"Mailbox resource ID","type":"string","example":"AC1a2b3c4d5e6f7g"},"address":{"type":"string","example":"user@example.com"}},"type":"object"},"Mail.V1.Autoreplies.AutoreplyResource":{"properties":{"id":{"description":"Unique autoreply identifier","type":"string","example":"AR1a2b3c4d5e6f7g"},"mailbox":{"$ref":"#/components/schemas/Mail.V1.Autoreplies.AutoreplyMailboxResource"},"subject":{"description":"Subject of the automatic reply","type":"string","example":"Out of office"},"body":{"description":"Body of the automatic reply","type":"string","example":"I am on vacation until August 1st."},"display_name":{"description":"Sender display name used for the reply","type":"string","example":"John Doe","nullable":true},"starts_at":{"description":"When the autoreply becomes active","type":"string","format":"date-time","example":"2026-08-01T00:00:00Z"},"ends_at":{"description":"When the autoreply stops","type":"string","format":"date-time","example":"2026-09-01T00:00:00Z","nullable":true},"created_at":{"type":"string","format":"date-time","example":"2026-07-24T12:00:00Z"},"updated_at":{"type":"string","format":"date-time","example":"2026-07-24T12:00:00Z"}},"type":"object"},"Mail.V1.Catchalls.CatchallCollection":{"description":"Array of [`Mail.V1.Catchalls.CatchallResource`](#model/mailv1catchallscatchallresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Catchalls.CatchallResource"}},"Mail.V1.Catchalls.CatchallMailboxResource":{"properties":{"id":{"description":"Mailbox resource ID","type":"string","example":"AC1a2b3c4d5e6f7g"},"address":{"type":"string","example":"user@example.com"}},"type":"object"},"Mail.V1.Catchalls.CatchallResource":{"properties":{"id":{"description":"Unique catch-all identifier","type":"string","example":"CA1a2b3c4d5e6f7g"},"mailbox":{"$ref":"#/components/schemas/Mail.V1.Catchalls.CatchallMailboxResource"},"domain":{"description":"Domain whose unrouted messages are caught","type":"string","example":"example.com"},"is_active":{"description":"Whether the catch-all is active","type":"boolean","example":true},"is_confirmed":{"description":"Whether the mailbox address has confirmed the catch-all","type":"boolean","example":true},"created_at":{"type":"string","format":"date-time","example":"2026-07-27T12:00:00Z"},"updated_at":{"type":"string","format":"date-time","example":"2026-07-27T12:00:00Z"}},"type":"object"},"Mail.V1.Forwarders.ForwarderCollection":{"description":"Array of [`Mail.V1.Forwarders.ForwarderResource`](#model/mailv1forwardersforwarderresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Forwarders.ForwarderResource"}},"Mail.V1.Forwarders.ForwarderMailboxResource":{"properties":{"id":{"description":"Mailbox resource ID","type":"string","example":"AC1a2b3c4d5e6f7g"},"address":{"type":"string","example":"user@example.com"}},"type":"object"},"Mail.V1.Forwarders.ForwarderResource":{"properties":{"id":{"description":"Unique forwarder identifier","type":"string","example":"FW1a2b3c4d5e6f7g"},"mailbox":{"$ref":"#/components/schemas/Mail.V1.Forwarders.ForwarderMailboxResource"},"destination":{"description":"Email address the messages are forwarded to","type":"string","example":"jane@example.org"},"is_keep_copy_enabled":{"description":"Whether a copy of forwarded messages is kept in the mailbox","type":"boolean","example":true},"is_active":{"description":"Whether the forwarder is active","type":"boolean","example":true},"is_confirmed":{"description":"Whether the destination address has confirmed the forwarding","type":"boolean","example":true},"created_at":{"type":"string","format":"date-time","example":"2026-07-24T12:00:00Z"},"updated_at":{"type":"string","format":"date-time","example":"2026-07-24T12:00:00Z"}},"type":"object"},"Mail.V1.Logs.Access.AccessLogCollection":{"description":"Array of [`Mail.V1.Logs.Access.AccessLogResource`](#model/mailv1logsaccessaccesslogresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Logs.Access.AccessLogResource"}},"Mail.V1.Logs.Access.AccessLogResource":{"properties":{"account":{"type":"string","example":"user@example.com"},"domain":{"type":"string","example":"example.com"},"session":{"type":"string","example":"nVpwr1XahpcqAkeAAAQAAJjSnW8aYxyM"},"protocol":{"type":"string","example":"imap"},"remote_ip":{"type":"string","example":"192.168.0.1"},"login_time":{"type":"string","format":"date-time","example":"2026-03-16T13:13:54Z"},"in":{"description":"Bytes received","type":"integer","example":421},"out":{"description":"Bytes sent","type":"integer","example":9381},"deleted":{"type":"integer","example":0},"expunged":{"type":"integer","example":0},"trashed":{"type":"integer","example":0},"logout_time":{"type":"string","format":"date-time","example":"2026-03-16T13:13:55Z"},"timestamp":{"type":"string","format":"date-time","example":"2026-03-16T13:13:55Z"},"app_name":{"type":"string","example":"com.google.android.gm"},"has_deletions":{"type":"boolean","example":false},"result":{"type":"string","example":"ok"},"status":{"type":"string","example":"Access"},"is_important":{"description":"True when the session deleted, expunged or trashed messages","type":"boolean","example":false}},"type":"object"},"Mail.V1.Logs.Action.ActionLogCollection":{"description":"Array of [`Mail.V1.Logs.Action.ActionLogResource`](#model/mailv1logsactionactionlogresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Logs.Action.ActionLogResource"}},"Mail.V1.Logs.Action.ActionLogResource":{"properties":{"action":{"type":"string","example":"Account created"},"extra":{"description":"Arbitrary contextual payload","type":"object","example":null,"nullable":true},"created_at":{"type":"string","format":"date-time","example":"2026-03-16T12:11:34Z"},"ip_address":{"description":"Only populated for user-role logs","type":"string","example":"127.0.0.1"},"role":{"type":"string","example":"user"},"action_context":{"type":"string","example":"example.com"},"response_status":{"type":"string","enum":["OK","Fail"],"example":"OK"}},"type":"object"},"Mail.V1.Logs.Common.DeliveryLogCollection":{"description":"Array of [`Mail.V1.Logs.Common.DeliveryLogResource`](#model/mailv1logscommondeliverylogresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Logs.Common.DeliveryLogResource"}},"Mail.V1.Logs.Common.DeliveryLogRelayEventResource":{"properties":{"address_to":{"type":"string","example":"user@example.com"},"relay":{"type":"string","example":"server.example.com[192.168.0.1]:587"},"delay":{"type":"string","example":"3.1"},"dsn":{"type":"string","example":"2.0.0"},"status":{"type":"string","example":"Sent"},"response":{"type":"string","example":"250 2.0.0 Ok: queued as 6153112091D"},"time":{"type":"string","format":"date-time","example":"2026-03-16T13:13:55Z"}},"type":"object"},"Mail.V1.Logs.Common.DeliveryLogResource":{"properties":{"account":{"type":"string","example":"user@example.com"},"rcpt":{"type":"string","example":"recipient@example.com"},"rcpts":{"type":"string","example":"recipient@example.com"},"client_ip":{"type":"string","example":"192.168.0.1"},"from":{"type":"string","example":"user@example.com"},"nrcpt":{"type":"string","example":"1"},"timestamp":{"type":"string","format":"date-time","example":"2026-03-16T13:13:55Z"},"relay_events":{"type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Logs.Common.DeliveryLogRelayEventResource"}},"status":{"type":"string","example":"Delivered"},"is_spam":{"type":"boolean","example":false}},"type":"object"},"Mail.V1.Logs.MailboxActions.MailboxActionLogCollection":{"description":"Array of [`Mail.V1.Logs.MailboxActions.MailboxActionLogResource`](#model/mailv1logsmailboxactionsmailboxactionlogresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Logs.MailboxActions.MailboxActionLogResource"}},"Mail.V1.Logs.MailboxActions.MailboxActionLogResource":{"properties":{"folder":{"type":"string","example":"INBOX.Sent"},"time":{"description":"Unix timestamp of the event","type":"integer","example":1773906125},"event":{"type":"string","enum":["MessageNew","MessageRead","MessageAppend","MessageExpunge","MailboxCreate","MailboxDelete","MailboxRename"],"example":"MessageNew"},"mailbox":{"description":"Mailbox email address","type":"string","example":"user@example.com"},"hostname":{"type":"string","example":"de-fra-mailstorage71.hostinger.io"},"timestamp":{"type":"string","format":"date-time","example":"2026-03-16T13:13:55Z"}},"type":"object"},"Mail.V1.Mailboxes.MailboxCollection":{"description":"Array of [`Mail.V1.Mailboxes.MailboxResource`](#model/mailv1mailboxesmailboxresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Mailboxes.MailboxResource"}},"Mail.V1.Mailboxes.MailboxCountsResource":{"properties":{"forwarders":{"description":"Number of attached forwarders","type":"integer","example":2},"aliases":{"description":"Number of attached aliases","type":"integer","example":1},"autoreplies":{"description":"Number of attached auto-replies","type":"integer","example":0}},"type":"object"},"Mail.V1.Mailboxes.MailboxProtocolsResource":{"properties":{"is_imap_enabled":{"type":"boolean","example":true},"is_pop3_enabled":{"type":"boolean","example":true},"is_smtp_in_enabled":{"type":"boolean","example":true},"is_smtp_out_enabled":{"type":"boolean","example":true}},"type":"object"},"Mail.V1.Mailboxes.MailboxResource":{"properties":{"id":{"description":"Mailbox resource ID","type":"string","example":"AC1a2b3c4d5e6f7g"},"address":{"description":"Email address of the mailbox","type":"string","example":"info@example.com"},"status":{"description":"Mailbox status","type":"string","enum":["active","suspended"],"example":"active"},"status_reason":{"description":"Reason the mailbox was suspended","type":"string","example":"abuse","nullable":true},"protocols":{"$ref":"#/components/schemas/Mail.V1.Mailboxes.MailboxProtocolsResource"},"counts":{"$ref":"#/components/schemas/Mail.V1.Mailboxes.MailboxCountsResource"},"is_catchall":{"description":"Whether the mailbox is the catch-all destination for its domain","type":"boolean","example":false},"usage":{"$ref":"#/components/schemas/Mail.V1.Mailboxes.MailboxUsageResource"},"created_at":{"type":"string","format":"date-time","example":"2025-03-01T10:00:00Z"},"updated_at":{"type":"string","format":"date-time","example":"2026-07-20T14:30:00Z"}},"type":"object"},"Mail.V1.Mailboxes.MailboxUsageResource":{"description":"Periodically synced usage numbers (may lag behind live values)","properties":{"storage_used":{"description":"Storage used in kilobytes","type":"integer","example":512000},"storage_quota":{"description":"Storage quota in kilobytes","type":"integer","example":10485760},"messages_used":{"type":"integer","example":1240},"messages_quota":{"type":"integer","example":50000},"synced_at":{"description":"When the usage numbers were last synced; null if never synced","type":"string","format":"date-time","example":"2026-07-22T08:12:00Z","nullable":true}},"type":"object"},"Mail.V1.Orders.OrderCollection":{"description":"Array of [`Mail.V1.Orders.OrderResource`](#model/mailv1ordersorderresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Orders.OrderResource"}},"Mail.V1.Orders.OrderDomainResource":{"properties":{"id":{"description":"Domain resource ID","type":"string","example":"DO1a2b3c4d5e6f7g"},"name":{"description":"Domain name","type":"string","example":"example.com"}},"type":"object"},"Mail.V1.Orders.OrderPlanResource":{"properties":{"name":{"description":"Plan name","type":"string","example":"hostinger_free"},"title":{"description":"Plan title","type":"string","example":"Free Email"}},"type":"object"},"Mail.V1.Orders.OrderResource":{"properties":{"id":{"description":"Order resource ID","type":"string","example":"OR1a2b3c4d5e6f7g"},"status":{"description":"Order status","type":"string","enum":["pending_setup","active","suspended"],"example":"active"},"is_trial":{"description":"Whether the order is currently in a trial period","type":"boolean","example":false},"seats":{"description":"Number of mailbox seats purchased with the order","type":"integer","example":5},"domain":{"oneOf":[{"$ref":"#/components/schemas/Mail.V1.Orders.OrderDomainResource"}],"nullable":true,"description":"Domain the order is attached to"},"plan":{"oneOf":[{"$ref":"#/components/schemas/Mail.V1.Orders.OrderPlanResource"}],"nullable":true,"description":"Plan the order was purchased with"},"has_pending_upgrade":{"description":"Whether an upgrade is currently pending for the order","type":"boolean","example":false},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"expires_at":{"type":"string","format":"date-time","example":"2026-02-27T11:54:22Z","nullable":true}},"type":"object"},"Mail.V1.Orders.PlanDomainResource":{"properties":{"mailbox_quota":{"description":"Maximum number of mailboxes per domain","type":"integer","example":1},"forwarder_quota":{"description":"Maximum number of forwarders per domain","type":"integer","example":10},"alias_quota":{"description":"Maximum number of aliases per domain","type":"integer","example":5},"is_catchall_enabled":{"description":"Whether catch-all mailboxes are available","type":"boolean","example":true},"is_imap_enabled":{"description":"Whether IMAP access is available","type":"boolean","example":true},"is_pop3_enabled":{"description":"Whether POP3 access is available","type":"boolean","example":true}},"type":"object"},"Mail.V1.Orders.PlanMailboxResource":{"properties":{"storage_quota":{"description":"Storage quota per mailbox in megabytes","type":"integer","example":10240},"messages_quota":{"description":"Maximum number of stored messages per mailbox","type":"integer","example":10000},"forwarder_quota":{"description":"Maximum number of forwarders per mailbox","type":"integer","example":10},"alias_quota":{"description":"Maximum number of aliases per mailbox","type":"integer","example":5},"max_outbound_message_size":{"description":"Maximum outbound message size in bytes","type":"integer","example":25000000},"max_outbound_attachment_size":{"description":"Maximum outbound attachment size in bytes","type":"integer","example":20000000},"max_outbound_recipient_limit":{"description":"Maximum number of recipients per outbound message","type":"integer","example":50},"rate_limit_inbound":{"description":"Inbound message rate limit as `messages/seconds`","type":"string","example":"100/86400"},"rate_limit_outbound":{"description":"Outbound message rate limit as `messages/seconds`","type":"string","example":"100/86400"}},"type":"object"},"Mail.V1.Orders.PlanResource":{"properties":{"name":{"description":"Machine name of the plan","type":"string","example":"hostinger_free"},"title":{"description":"Human-readable plan title","type":"string","example":"Free Email"},"domain":{"$ref":"#/components/schemas/Mail.V1.Orders.PlanDomainResource"},"mailbox":{"$ref":"#/components/schemas/Mail.V1.Orders.PlanMailboxResource"}},"type":"object"},"Mail.V1.Webhooks.WebhookCollection":{"description":"Array of [`Mail.V1.Webhooks.WebhookResource`](#model/mailv1webhookswebhookresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Webhooks.WebhookResource"}},"Mail.V1.Webhooks.WebhookCreatedResource":{"properties":{"id":{"description":"Unique webhook identifier","type":"string","example":"019683f8-1234-7abc-8def-0123456789ab"},"mailbox":{"$ref":"#/components/schemas/Mail.V1.Webhooks.WebhookMailboxResource"},"name":{"description":"Human-readable name for this webhook","type":"string","example":"New message notifier"},"description":{"description":"Optional description of the webhook's purpose","type":"string","example":"Notifies our CRM when a new email arrives","nullable":true},"events":{"description":"Events that trigger this webhook","type":"array","items":{"type":"string","enum":["message.received"],"example":"message.received"}},"status":{"description":"Current status of the webhook","type":"string","enum":["active","disabled","paused"],"example":"active"},"url":{"description":"URL that receives webhook POST requests","type":"string","example":"https://example.com/webhooks/incoming"},"secret":{"description":"One-time webhook secret, returned only on creation. Sent as `Authorization: Bearer ` with every delivery.","type":"string","example":"4a6f8b2d1e9c3f7a0b5d8e2c4f1a7b3d9e6c2f8a1b4d7e0c3f6a9b2d5e8c1f4"},"created_at":{"type":"string","format":"date-time","example":"2026-07-23T12:00:00Z"},"updated_at":{"type":"string","format":"date-time","example":"2026-07-23T12:00:00Z"}},"type":"object"},"Mail.V1.Webhooks.WebhookDeliveryLogCollection":{"description":"Array of [`Mail.V1.Webhooks.WebhookDeliveryLogResource`](#model/mailv1webhookswebhookdeliverylogresource)","type":"array","items":{"$ref":"#/components/schemas/Mail.V1.Webhooks.WebhookDeliveryLogResource"}},"Mail.V1.Webhooks.WebhookDeliveryLogResource":{"properties":{"created_at":{"type":"string","format":"date-time","example":"2026-07-23T12:00:00Z"},"mailbox_address":{"description":"Email address of the mailbox this delivery is attached to","type":"string","example":"user@example.com"},"webhook_url":{"description":"URL that received the webhook POST request","type":"string","example":"https://example.com/webhooks/incoming"},"is_successful":{"description":"Whether the delivery was successful","type":"boolean","example":true},"duration":{"description":"Webhook request duration in milliseconds","type":"integer","example":42},"retry_count":{"description":"Number of delivery attempts made","type":"integer","example":1},"max_retry_count":{"description":"Maximum number of delivery attempts allowed","type":"integer","example":5}},"type":"object"},"Mail.V1.Webhooks.WebhookMailboxResource":{"properties":{"id":{"type":"string","example":"AC1a2b3c4d5e6f7g"},"address":{"type":"string","example":"user@example.com"}},"type":"object"},"Mail.V1.Webhooks.WebhookResource":{"properties":{"id":{"description":"Unique webhook identifier","type":"string","example":"019683f8-1234-7abc-8def-0123456789ab"},"mailbox":{"$ref":"#/components/schemas/Mail.V1.Webhooks.WebhookMailboxResource"},"name":{"description":"Human-readable name for this webhook","type":"string","example":"New message notifier"},"description":{"description":"Optional description of the webhook's purpose","type":"string","example":"Notifies our CRM when a new email arrives","nullable":true},"events":{"description":"Events that trigger this webhook","type":"array","items":{"type":"string","enum":["message.received"],"example":"message.received"}},"status":{"description":"Current status of the webhook","type":"string","enum":["active","disabled","paused"],"example":"active"},"url":{"description":"URL that receives webhook POST requests","type":"string","example":"https://example.com/webhooks/incoming"},"created_at":{"type":"string","format":"date-time","example":"2026-07-23T12:00:00Z"},"updated_at":{"type":"string","format":"date-time","example":"2026-07-23T12:00:00Z"}},"type":"object"},"Mail.V1.Webhooks.WebhookSecretResource":{"properties":{"id":{"description":"Unique webhook identifier","type":"string","example":"019683f8-1234-7abc-8def-0123456789ab"},"mailbox":{"$ref":"#/components/schemas/Mail.V1.Webhooks.WebhookMailboxResource"},"name":{"description":"Human-readable name for this webhook","type":"string","example":"New message notifier"},"description":{"description":"Optional description of the webhook's purpose","type":"string","example":"Notifies our CRM when a new email arrives","nullable":true},"events":{"description":"Events that trigger this webhook","type":"array","items":{"type":"string","enum":["message.received"],"example":"message.received"}},"status":{"description":"Current status of the webhook","type":"string","enum":["active","disabled","paused"],"example":"active"},"url":{"description":"URL that receives webhook POST requests","type":"string","example":"https://example.com/webhooks/incoming"},"secret":{"description":"New webhook secret, sent as `Authorization: Bearer ` with every delivery. The previous secret is immediately invalidated and the new one is not returned again.","type":"string","example":"4a6f8b2d1e9c3f7a0b5d8e2c4f1a7b3d9e6c2f8a1b4d7e0c3f6a9b2d5e8c1f4"},"created_at":{"type":"string","format":"date-time","example":"2026-07-23T12:00:00Z"},"updated_at":{"type":"string","format":"date-time","example":"2026-07-23T12:00:00Z"}},"type":"object"},"Mail.V1.Webhooks.WebhookTestResultResource":{"properties":{"http_status":{"description":"HTTP status code returned by the webhook endpoint","type":"integer","example":200},"is_successful":{"description":"Whether the test delivery was successful","type":"boolean","example":true},"error":{"description":"Error message returned by the webhook endpoint in case of failure","type":"string","example":"Something bad happened","nullable":true}},"type":"object"},"Reach.V1.Automations.AutomationCollection":{"description":"Array of [`Reach.V1.Automations.AutomationResource`](#model/reachv1automationsautomationresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Automations.AutomationResource"}},"Reach.V1.Automations.AutomationEventsResource":{"description":"Counts of contacts moving through the automation.\n\nThese are not email engagement metrics. Automations expose no sent, open or click counters -\nuse the campaign statistics endpoint for those.","properties":{"started":{"description":"Contacts that ever entered the automation, including those that already left it.","type":"integer","example":10},"in_progress":{"description":"Contacts currently moving through the automation, including those waiting on a delay step.","type":"integer","example":5},"completed":{"description":"Contacts that reached the end of the workflow.","type":"integer","example":4},"failed":{"description":"Contacts whose journey through the automation errored and stopped.","type":"integer","example":1}},"type":"object"},"Reach.V1.Automations.AutomationResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","example":"Welcome series"},"status":{"description":"There is no `completed` status. Use `events.completed` to see how many contacts finished.","type":"string","enum":["active","paused","draft"],"example":"active"},"type":{"description":"What kind of workflow this is. `custom` automations are the ones built from scratch.","type":"string","enum":["welcome","welcome_series","promotional_series","trust_building_series","ecommerce_abandoned_cart","ecommerce_recommend_after_purchase","ecommerce_post_purchase","ecommerce_discount_after_purchase","re_engagement_non_openers","re_engagement_non_clickers","form_submitted","custom"],"example":"welcome_series"},"config":{"description":"Trigger configuration of the automation. The shape depends on the type.","type":"object","nullable":true},"events":{"$ref":"#/components/schemas/Reach.V1.Automations.AutomationEventsResource"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z","nullable":true},"updated_at":{"type":"string","format":"date-time","example":"2025-03-04T09:12:07Z","nullable":true}},"type":"object"},"Reach.V1.Automations.Steps.AutomationStepCollection":{"description":"Array of [`Reach.V1.Automations.Steps.AutomationStepResource`](#model/reachv1automationsstepsautomationstepresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Automations.Steps.AutomationStepResource"}},"Reach.V1.Automations.Steps.AutomationStepResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"parent_uuid":{"description":"The step this one branches from. Null for the entry point of the workflow.","type":"string","example":"2080cc86-e026-4f7b-9598-d4132f8c7c2f","nullable":true},"step_order":{"description":"Position of this step among the steps sharing its parent.","type":"integer","example":1},"type":{"description":"Role of the step in the workflow. A `conditional` step branches into several children.","type":"string","enum":["trigger","action","conditional"],"example":"action"},"value":{"description":"The concrete trigger, action, decision or delay this step performs.","type":"string","enum":["new_contact","new_segment_contact","form_submitted","webhook","send_welcome_email","send_email","send_campaign","decision","delay"],"example":"send_email"},"config":{"description":"Step configuration. The shape depends on the value, and is empty for steps that take none.","type":"object","nullable":true}},"type":"object"},"Reach.V1.Campaigns.CampaignCollection":{"description":"Array of [`Reach.V1.Campaigns.CampaignResource`](#model/reachv1campaignscampaignresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Campaigns.CampaignResource"}},"Reach.V1.Campaigns.CampaignDeliveryResource":{"description":"Delivery progress. While the campaign is `sending`, `total_sent` climbs towards the estimate.","properties":{"total_sent":{"description":"Emails sent so far.","type":"integer","example":100},"estimated_total_recipients":{"description":"Recipients this campaign was estimated to reach when sending started. Null for\ncampaigns that have not started sending.","type":"integer","example":900,"nullable":true},"subscribers_count":{"description":"Contacts currently targeted by this campaign.","type":"integer","example":900}},"type":"object"},"Reach.V1.Campaigns.CampaignDetailsResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"title":{"type":"string","example":"Black Friday Campaign"},"subject":{"type":"string","example":"Don't miss our Black Friday deals!"},"sender_name":{"type":"string","example":"Marketing Team"},"sender_email":{"type":"string","example":"marketing@example.com"},"template_uuid":{"description":"The email template this campaign uses. The template title is not exposed.","type":"string","example":"2080cc86-e026-4f7b-9598-d4132f8c7c2f","nullable":true},"status":{"description":"A fully sent campaign is `publish`. There is no `sent`, `paused` or `archived` status.","type":"string","enum":["draft","scheduled","sending","publish","failed"],"example":"publish"},"type":{"type":"string","enum":["campaign","automation","double_opt_in"],"example":"campaign"},"failure_reason":{"description":"Set only while the status is `failed`.","type":"string","example":"sending_limit_reached","nullable":true},"is_smart_send":{"description":"Whether delivery time is picked per contact rather than sent to everyone at once.","type":"boolean","example":false},"is_all_contacts":{"description":"Whether the campaign targets every contact instead of the listed segments.","type":"boolean","example":false},"delivery":{"$ref":"#/components/schemas/Reach.V1.Campaigns.CampaignDeliveryResource"},"segment_uuids":{"description":"Segments this campaign targets. Empty when it targets all contacts.","type":"array","items":{"type":"string","example":"2080cc86-e026-4f7b-9598-d4132f8c7c2f"}},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-03-04T09:12:07Z","nullable":true},"sent_at":{"type":"string","format":"date-time","example":"2025-03-04T09:12:07Z","nullable":true},"scheduled_at":{"type":"string","format":"date-time","example":"2025-03-04T08:00:00Z","nullable":true}},"type":"object"},"Reach.V1.Campaigns.CampaignResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"title":{"type":"string","example":"Black Friday Campaign"},"subject":{"type":"string","example":"Don't miss our Black Friday deals!"},"sender_name":{"type":"string","example":"Marketing Team"},"sender_email":{"type":"string","example":"marketing@example.com"},"template_uuid":{"description":"The email template this campaign uses. The template title is not exposed.","type":"string","example":"2080cc86-e026-4f7b-9598-d4132f8c7c2f","nullable":true},"status":{"description":"A fully sent campaign is `publish`. There is no `sent`, `paused` or `archived` status.","type":"string","enum":["draft","scheduled","sending","publish","failed"],"example":"publish"},"type":{"type":"string","enum":["campaign","automation","double_opt_in"],"example":"campaign"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-03-04T09:12:07Z","nullable":true},"sent_at":{"type":"string","format":"date-time","example":"2025-03-04T09:12:07Z","nullable":true},"scheduled_at":{"type":"string","format":"date-time","example":"2025-03-04T08:00:00Z","nullable":true},"statistics":{"$ref":"#/components/schemas/Reach.V1.Campaigns.CampaignSummaryStatisticsResource"}},"type":"object"},"Reach.V1.Campaigns.CampaignStatisticsResource":{"description":"Campaign performance. Every count is unique contacts rather than raw events, so a contact\nwho opens the same email five times is counted once.","properties":{"total_sent":{"description":"Emails sent for this campaign, and the denominator of every rate below.","type":"integer","example":100},"estimated_total_recipients":{"description":"Recipients this campaign was estimated to reach when sending started. Null for\ncampaigns that have not started sending.","type":"integer","example":900,"nullable":true},"processed_count":{"type":"integer","example":100},"delivered_count":{"type":"integer","example":90},"dropped_count":{"type":"integer","example":2},"bounced_count":{"type":"integer","example":8},"soft_bounced_count":{"type":"integer","example":3},"opened_count":{"description":"Contacts who opened this campaign.","type":"integer","example":80},"clicked_count":{"description":"Contacts who clicked a link. Only clicks from contacts who also registered an open count.","type":"integer","example":10},"unsubscribed_count":{"description":"Contacts who unsubscribed through this campaign.","type":"integer","example":5},"open_rate":{"description":"Percentage of sent emails that were opened.","type":"number","format":"float","example":42.5},"click_rate":{"description":"Percentage of sent emails that got a click.","type":"number","format":"float","example":10},"click_to_open_rate":{"description":"Percentage of the contacts who opened that went on to click.","type":"number","format":"float","example":23.5},"unsubscribe_rate":{"description":"Percentage of sent emails that led to an unsubscribe.","type":"number","format":"float","example":1.5},"has_bounced_contacts":{"type":"boolean","example":false}},"type":"object"},"Reach.V1.Campaigns.CampaignSummaryStatisticsResource":{"description":"Headline engagement rates. The statistics endpoint carries the full breakdown.","properties":{"total_sent":{"description":"Emails sent for this campaign, and the denominator of the rates below.","type":"integer","example":100},"open_rate":{"description":"Percentage of sent emails that were opened.","type":"number","format":"float","example":42.5},"click_rate":{"description":"Percentage of sent emails that got a click.","type":"number","format":"float","example":10},"click_to_open_rate":{"description":"Percentage of the contacts who opened that went on to click.","type":"number","format":"float","example":23.5}},"type":"object"},"Reach.V1.Campaigns.CreatedCampaignResource":{"description":"The campaign as it was stored, without targeting or delivery progress","properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"title":{"type":"string","example":"Black Friday Campaign"},"subject":{"type":"string","example":"Don't miss our Black Friday deals!"},"sender_name":{"type":"string","example":"Marketing Team"},"sender_email":{"type":"string","example":"marketing@example.com"},"template_uuid":{"type":"string","example":"2080cc86-e026-4f7b-9598-d4132f8c7c2f","nullable":true},"status":{"description":"Always `draft` for a campaign that was just created.","type":"string","enum":["draft","scheduled","sending","publish","failed"],"example":"draft"},"type":{"type":"string","enum":["campaign","automation","double_opt_in"],"example":"campaign"},"is_all_contacts":{"description":"Whether the campaign targets every contact instead of selected segments.","type":"boolean","example":false},"metadata":{"description":"The stored extra fields, including the ones Reach sets itself.","type":"object","example":{"preheader":"Our biggest deals of the year"},"additionalProperties":{"type":"string"}},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z","nullable":true},"updated_at":{"type":"string","format":"date-time","example":"2025-03-04T09:12:07Z","nullable":true}},"type":"object"},"Reach.V1.Contacts.ContactCollection":{"description":"Array of [`Reach.V1.Contacts.ContactResource`](#model/reachv1contactscontactresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Contacts.ContactResource"}},"Reach.V1.Contacts.ContactDetailsResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"email":{"type":"string","example":"john.doe@example.com"},"name":{"type":"string","example":"John","nullable":true},"surname":{"type":"string","example":"Doe","nullable":true},"phone":{"type":"string","example":"+14155552671","nullable":true},"subscription_status":{"type":"string","enum":["subscribed","unsubscribed","confirmed","pending"],"example":"subscribed"},"subscribed_at":{"type":"string","format":"date-time","example":"2023-01-01T00:00:00Z","nullable":true},"unsubscribed_at":{"type":"string","format":"date-time","example":"2023-06-15T00:00:00Z","nullable":true},"created_at":{"type":"string","format":"date-time","example":"2022-12-01T00:00:00Z","nullable":true},"domain":{"type":"string","example":"example.com","nullable":true},"source":{"type":"string","enum":["sync","import","manual","api","form","checkout","horizons"],"example":"api","nullable":true},"note":{"type":"string","maxLength":75,"example":"VIP customer","nullable":true},"tags":{"type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Contacts.Tags.TagResource"}},"fields":{"description":"Custom field values held by this contact","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Contacts.Fields.ContactFieldValueResource"}}},"type":"object"},"Reach.V1.Contacts.ContactResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","example":"John","nullable":true},"surname":{"type":"string","example":"Doe","nullable":true},"email":{"type":"string","example":"john.doe@example.com"},"subscription_status":{"type":"string","enum":["subscribed","unsubscribed","confirmed","pending"],"example":"subscribed"},"subscribed_at":{"type":"string","format":"date-time","example":"2023-01-01T00:00:00Z"},"source":{"type":"string","enum":["sync","import","manual","api","form","checkout","horizons"],"example":"sync","nullable":true},"note":{"type":"string","maxLength":75,"example":"VIP customer","nullable":true}},"type":"object"},"Reach.V1.Contacts.Fields.ContactFieldCollection":{"description":"Array of [`Reach.V1.Contacts.Fields.ContactFieldResource`](#model/reachv1contactsfieldscontactfieldresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Contacts.Fields.ContactFieldResource"}},"Reach.V1.Contacts.Fields.ContactFieldOptionResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"label":{"type":"string","example":"Gold"},"sort_order":{"type":"integer","example":0}},"type":"object"},"Reach.V1.Contacts.Fields.ContactFieldResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"type":{"type":"string","enum":["text","number","date","single_choice","multi_choice"],"example":"text"},"label":{"type":"string","example":"Job title"},"slug":{"description":"Derived from the label on creation and immutable afterwards","type":"string","example":"job_title"},"options":{"description":"Available choices. Always empty for the scalar field types.","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Contacts.Fields.ContactFieldOptionResource"}},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"}},"type":"object"},"Reach.V1.Contacts.Fields.ContactFieldValueResource":{"description":"A custom contact field together with the value held by one contact","properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"type":{"type":"string","enum":["text","number","date","single_choice","multi_choice"],"example":"text"},"label":{"type":"string","example":"Job title"},"slug":{"type":"string","example":"job_title"},"value":{"description":"Set for the scalar field types, null for the choice types","type":"string","example":"Developer","nullable":true},"selected_option_uuids":{"description":"Chosen options for the choice field types, empty for the scalar types","type":"array","items":{"type":"string"}},"options":{"description":"Every option the field offers, not only the selected ones","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Contacts.Fields.ContactFieldOptionResource"}}},"type":"object"},"Reach.V1.Contacts.Groups.ContactGroupCollection":{"description":"Array of [`Reach.V1.Contacts.Groups.ContactGroupResource`](#model/reachv1contactsgroupscontactgroupresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Contacts.Groups.ContactGroupResource"}},"Reach.V1.Contacts.Groups.ContactGroupResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"title":{"type":"string","example":"Newsletter Subscribers"}},"type":"object"},"Reach.V1.Contacts.ProfileContactCollection":{"description":"Array of [`Reach.V1.Contacts.ProfileContactResource`](#model/reachv1contactsprofilecontactresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Contacts.ProfileContactResource"}},"Reach.V1.Contacts.ProfileContactResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","example":"John","nullable":true},"surname":{"type":"string","example":"Doe","nullable":true},"email":{"type":"string","example":"john.doe@example.com"},"phone":{"type":"string","example":"+14155552671","nullable":true},"subscription_status":{"type":"string","enum":["subscribed","unsubscribed","confirmed","pending"],"example":"subscribed"},"subscribed_at":{"type":"string","format":"date-time","example":"2023-01-01T00:00:00Z","nullable":true},"unsubscribed_at":{"type":"string","format":"date-time","example":"2023-06-15T00:00:00Z","nullable":true},"source":{"type":"string","enum":["sync","import","manual","api","form","checkout","horizons"],"example":"api","nullable":true},"note":{"type":"string","maxLength":75,"example":"VIP customer","nullable":true}},"type":"object"},"Reach.V1.Contacts.ProfileContactUpdateResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","example":"John","nullable":true},"surname":{"type":"string","example":"Doe","nullable":true},"email":{"type":"string","example":"john.doe@example.com"},"phone":{"type":"string","example":"+14155552671","nullable":true},"subscription_status":{"type":"string","enum":["subscribed","unsubscribed","confirmed","pending"],"example":"subscribed"},"subscribed_at":{"type":"string","format":"date-time","example":"2023-01-01T00:00:00Z","nullable":true},"unsubscribed_at":{"type":"string","format":"date-time","example":"2023-06-15T00:00:00Z","nullable":true}},"type":"object"},"Reach.V1.Contacts.Segments.ContactSegmentCollection":{"description":"Array of [`Reach.V1.Contacts.Segments.ContactSegmentResource`](#model/reachv1contactssegmentscontactsegmentresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Contacts.Segments.ContactSegmentResource"}},"Reach.V1.Contacts.Segments.ContactSegmentResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","example":"Newsletter Subscribers"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"}},"type":"object"},"Reach.V1.Contacts.Segments.SegmentContactsCountResource":{"properties":{"count":{"description":"Contacts currently matching the segment conditions","type":"integer","example":150}},"type":"object"},"Reach.V1.Contacts.Segments.SegmentFilterAttributeResource":{"description":"One attribute a segment condition can filter on.","properties":{"name":{"description":"Value to send as the condition `attribute`.","type":"string","example":"email"},"type":{"description":"Where the attribute is sourced from.","type":"string","enum":["contacts","contact_metadata","campaign_events","contact_tags","campaigns","opt_in_method","contact_field_values","contact_field_selections"],"example":"contacts"},"description":{"type":"string","example":"Contact email address"},"operators":{"description":"Operators this attribute accepts, keyed by operator name.","type":"object","additionalProperties":{"$ref":"#/components/schemas/Reach.V1.Contacts.Segments.SegmentFilterOperatorResource"}}},"type":"object"},"Reach.V1.Contacts.Segments.SegmentFilterAttributesResource":{"description":"The vocabulary a segment condition can be built from, for one profile.","properties":{"attributes":{"description":"Every attribute a condition can filter on, keyed by the value to send as\n`attribute`. Custom contact fields are keyed `cf:{fieldUuid}`, tags and campaigns by\ntheir uuid, so the keys are not a fixed list and should be read from this response\nrather than hardcoded.","type":"object","additionalProperties":{"$ref":"#/components/schemas/Reach.V1.Contacts.Segments.SegmentFilterAttributeResource"}},"logic_operators":{"description":"The values accepted by `logic` when a segment combines several conditions.","type":"object","example":{"AND":"AND","OR":"OR"},"additionalProperties":{"type":"string"}}},"type":"object"},"Reach.V1.Contacts.Segments.SegmentFilterOperatorResource":{"description":"One operator an attribute accepts, and the value format it expects.","properties":{"operator":{"description":"Value to send as the condition `operator`.","type":"string","enum":["equals","not_equals","contains","not_contains","gte","lte","exists","within_last_days","not_within_last_days","older_than_days","processed","not_processed","delivered","not_delivered","dropped","not_dropped","bounced","not_bounced","soft_bounced","not_soft_bounced","opened","not_opened","clicked","not_clicked","unsubscribed","not_unsubscribed"],"example":"equals"},"description":{"type":"string","example":"Exact match"},"input_type":{"description":"Shape of the value this operator expects, useful for rendering an input.","type":"string","enum":["text","number","date","select"],"example":"text"},"example":{"description":"An example value in the format this operator expects.","type":"string","example":"john.doe@example.com"},"enum_values":{"description":"The values this operator accepts, keyed by the value to send. Only present when the\noperator is constrained to a fixed set, such as a tag or campaign picker.","type":"object","example":{"yes":"yes","no":"no"},"additionalProperties":{"type":"string"}}},"type":"object"},"Reach.V1.Contacts.Segments.SegmentListItemCollection":{"description":"Array of [`Reach.V1.Contacts.Segments.SegmentListItemResource`](#model/reachv1contactssegmentssegmentlistitemresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Contacts.Segments.SegmentListItemResource"}},"Reach.V1.Contacts.Segments.SegmentListItemResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","example":"VIP Customers"},"contacts_count":{"description":"Contacts currently matching the segment conditions","type":"integer","example":150},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"}},"type":"object"},"Reach.V1.Contacts.Segments.SegmentResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","example":"Segment name"},"query":{"type":"array","items":{},"example":{"conditions":[{"attribute":"email","operator":"contains","value":"example.com"}],"logic":"and"}},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"}},"type":"object"},"Reach.V1.Contacts.Segments.SegmentationContactCollection":{"description":"Array of [`Reach.V1.Contacts.Segments.SegmentationContactResource`](#model/reachv1contactssegmentssegmentationcontactresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Contacts.Segments.SegmentationContactResource"}},"Reach.V1.Contacts.Segments.SegmentationContactResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","example":"John","nullable":true},"surname":{"type":"string","example":"Doe","nullable":true},"email":{"type":"string","example":"john.doe@example.com"},"subscription_status":{"type":"string","enum":["subscribed","unsubscribed","confirmed","pending"],"example":"subscribed"},"subscribed_at":{"type":"string","format":"date-time","example":"2023-01-01T00:00:00Z"},"source":{"type":"string","enum":["sync","import","manual","api","form","checkout","horizons"],"example":"sync","nullable":true},"note":{"type":"string","maxLength":75,"example":"VIP customer","nullable":true}},"type":"object"},"Reach.V1.Contacts.Tags.TagCollection":{"description":"Array of [`Reach.V1.Contacts.Tags.TagResource`](#model/reachv1contactstagstagresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Contacts.Tags.TagResource"}},"Reach.V1.Contacts.Tags.TagResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"type":{"description":"How the tag came about. `custom` covers the tags you create yourself, `form` covers the ones Reach creates for its forms.","type":"string","enum":["form","custom"],"example":"custom"},"value":{"type":"string","example":"Newsletter"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"}},"type":"object"},"Reach.V1.Forms.FormCollection":{"description":"Array of [`Reach.V1.Forms.FormResource`](#model/reachv1formsformresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Forms.FormResource"}},"Reach.V1.Forms.FormDetailsResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","example":"Newsletter signup"},"status":{"description":"A `paused` form keeps its template online but stops accepting submissions.","type":"string","enum":["active","paused","draft"],"example":"active"},"type":{"type":"string","enum":["form"],"example":"form"},"template":{"$ref":"#/components/schemas/Reach.V1.Forms.FormTemplateDetailsResource"},"tags":{"description":"Tags applied to every contact this form captures.","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Forms.FormTagResource"}},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-03-04T09:12:07Z","nullable":true}},"type":"object"},"Reach.V1.Forms.FormResource":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"name":{"type":"string","example":"Newsletter signup"},"status":{"description":"A `paused` form keeps its template online but stops accepting submissions.","type":"string","enum":["active","paused","draft"],"example":"active"},"type":{"type":"string","enum":["form"],"example":"form"},"template":{"$ref":"#/components/schemas/Reach.V1.Forms.FormTemplateResource"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-03-04T09:12:07Z","nullable":true}},"type":"object"},"Reach.V1.Forms.FormTagResource":{"description":"A tag applied to every contact this form captures.","properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"value":{"type":"string","example":"Newsletter"},"type":{"description":"How the tag came about. `custom` covers the tags you create yourself, `import` the ones added\nby contact imports, and `form` and `system` the ones Reach creates on its own. Every form gets\na `form:{name}` tag when it is created.","type":"string","enum":["form","custom","import","system"],"example":"system"}},"type":"object"},"Reach.V1.Forms.FormTemplateDetailsResource":{"description":"The rendered form template. There is no ready-made embed snippet - either serve the HTML behind\n`url` or build your own embed around the form uuid. All fields stay null until the template has\nbeen generated.","properties":{"uuid":{"type":"string","example":"2080cc86-e026-4f7b-9598-d4132f8c7c2f","nullable":true},"path":{"description":"Storage path of the template HTML, relative to the storage directory of this profile. `url`\nalready includes that prefix, so prefer it unless you resolve storage paths yourself.","type":"string","example":"forms/8f2c1b9e-1f4a-4a1e-9a2b-2f3c4d5e6f70/9a1b2c3d.html","nullable":true},"url":{"description":"Publicly reachable URL of the template HTML.","type":"string","example":"https://cdn-reach.hostinger.com/storage/client123/profile-uuid/form.html","nullable":true}},"type":"object"},"Reach.V1.Forms.FormTemplateResource":{"description":"The rendered form template. Both fields stay null until the template has been generated.","properties":{"uuid":{"type":"string","example":"2080cc86-e026-4f7b-9598-d4132f8c7c2f","nullable":true},"path":{"description":"Storage path of the template HTML, relative to the storage directory of this profile. Get the\nform details to receive a directly usable URL instead.","type":"string","example":"forms/8f2c1b9e-1f4a-4a1e-9a2b-2f3c4d5e6f70/9a1b2c3d.html","nullable":true}},"type":"object"},"Reach.V1.Profiles.Domains.DnsRecordStatus":{"properties":{"actual":{"type":"array","items":{"properties":{"type":{"type":"string","example":"MX"},"value":{"type":"string","example":"mx1.example.com"}},"type":"object"}},"suggested":{"type":"array","items":{"properties":{"name":{"type":"string","example":"@"},"type":{"type":"string","example":"MX"},"value":{"type":"string","example":"mx1.example.com"}},"type":"object"}},"is_valid":{"type":"boolean","example":true}},"type":"object"},"Reach.V1.Profiles.Domains.DnsStatusResource":{"properties":{"domain":{"type":"string","example":"example.com"},"mx":{"$ref":"#/components/schemas/Reach.V1.Profiles.Domains.DnsRecordStatus"},"spf":{"$ref":"#/components/schemas/Reach.V1.Profiles.Domains.DnsRecordStatus"},"dkim":{"$ref":"#/components/schemas/Reach.V1.Profiles.Domains.DnsRecordStatus"},"dmarc":{"$ref":"#/components/schemas/Reach.V1.Profiles.Domains.DnsRecordStatus"}},"type":"object"},"Reach.V1.Profiles.Domains.SendingDomainResource":{"description":"The sending domain connected to the profile.\n\nWhen no domain is connected every field is `null` and `suspended_sender_emails` is empty,\nso the shape stays the same whether or not the profile is set up for sending.","properties":{"domain":{"description":"Domain campaigns are sent from. It may be a subdomain of the domain that was\nconnected, so it will not always match the website domain.","type":"string","example":"mail.example.com","nullable":true},"status":{"description":"Campaigns can only be sent while the domain is `active`.","type":"string","enum":["active","inactive","pending","blocked"],"example":"active","nullable":true},"created_at":{"description":"When the domain was connected to the profile.","type":"string","format":"date-time","example":"2025-01-01T00:00:00Z","nullable":true},"updated_at":{"description":"When the domain or its verification state last changed.","type":"string","format":"date-time","example":"2025-01-15T10:30:00Z","nullable":true},"suspended_sender_emails":{"description":"Sender addresses on this domain that have been suspended. A campaign using one of\nthem will not go out even while the domain itself is active.","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Profiles.Domains.SuspendedSenderEmailResource"}}},"type":"object"},"Reach.V1.Profiles.Domains.SuspendedSenderEmailResource":{"description":"A sender address on the connected domain that is no longer allowed to send.","properties":{"email":{"type":"string","example":"newsletter@example.com"},"email_local_part":{"description":"The part of the address before the @.","type":"string","example":"newsletter"},"suspended_at":{"type":"string","format":"date-time","example":"2025-01-15T10:30:00Z"}},"type":"object"},"Reach.V1.Profiles.Features.PlanFeatureCollection":{"description":"Array of [`Reach.V1.Profiles.Features.PlanFeatureResource`](#model/reachv1profilesfeaturesplanfeatureresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Profiles.Features.PlanFeatureResource"}},"Reach.V1.Profiles.Features.PlanFeatureResource":{"description":"Whether a single plan feature can be used on the profile.","properties":{"feature":{"type":"string","enum":["AutomationActivation","SmartSending","AiGenerateSubjectLines","TemplateCheckerAnalysis","RemoveSignature","Collaborators","HtmlCodeEditor"],"example":"AutomationActivation"},"is_available":{"description":"Whether the feature can be used right now.","type":"boolean","example":true},"is_locked":{"description":"Whether the feature sits outside the base plan and needs an upgrade.","type":"boolean","example":false}},"type":"object"},"Reach.V1.Profiles.PlanLimitUsageResource":{"description":"Allowance, consumption and headroom of a single plan limit for the current period.","properties":{"limit":{"description":"The allowance for the current period.","type":"integer","example":10000},"used":{"description":"How much of the allowance has been consumed so far.","type":"integer","example":2500},"remaining":{"description":"Headroom left. Floors at 0, so it never reports a negative overage.","type":"integer","example":7500}},"type":"object"},"Reach.V1.Profiles.PlanLimitsResource":{"description":"What the plan allows and what is left of it for the current period.\n\n`emails` counts every email sent. `recipients` counts the distinct contacts emailed - it is not the\nsize of the contact list, a contact emailed three times counts once and a contact never emailed does\nnot count at all. `ai_credits` counts the AI generations used, and its limit includes any extra\ncredits bought on top of the plan.","properties":{"emails":{"$ref":"#/components/schemas/Reach.V1.Profiles.PlanLimitUsageResource"},"recipients":{"$ref":"#/components/schemas/Reach.V1.Profiles.PlanLimitUsageResource"},"ai_credits":{"$ref":"#/components/schemas/Reach.V1.Profiles.PlanLimitUsageResource"},"period_start":{"description":"Start of the current period. Periods are calendar months rather than billing anniversaries,\nso the counters reset at midnight UTC on the 1st no matter when the subscription started.","type":"string","format":"date-time","example":"2025-03-01T00:00:00Z"},"period_end":{"description":"End of the current period, that is the last moment of the calendar month.","type":"string","format":"date-time","example":"2025-03-31T23:59:59Z"}},"type":"object"},"Reach.V1.Profiles.ProfileCollection":{"description":"Array of [`Reach.V1.Profiles.ProfileResource`](#model/reachv1profilesprofileresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Profiles.ProfileResource"}},"Reach.V1.Profiles.ProfileResource":{"properties":{"limits":{"properties":{"ai_messages_limit":{"type":"integer","example":10},"subscribers_limit":{"type":"integer","example":500},"emails_monthly_limit":{"type":"integer","example":3500},"ai_messages_additional":{"type":"integer","example":1096}},"type":"object"},"is_trial":{"type":"boolean","example":false},"expires_at":{"type":"string","format":"date-time","example":"2027-10-21T05:38:23.000000Z"},"resource_id":{"type":"integer","example":44340307},"status":{"type":"string","example":"active"},"profiles":{"type":"array","items":{"properties":{"uuid":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"domain":{"type":"string","example":"example.com"},"created_at":{"type":"string","format":"date-time","example":"2026-01-21T07:35:04.000000Z"},"updated_at":{"type":"string","format":"date-time","example":"2026-01-21T07:35:04.000000Z"}},"type":"object"}}},"type":"object"},"Reach.V1.Templates.TemplateCollection":{"description":"Array of [`Reach.V1.Templates.TemplateResource`](#model/reachv1templatestemplateresource)","type":"array","items":{"$ref":"#/components/schemas/Reach.V1.Templates.TemplateResource"}},"Reach.V1.Templates.TemplateResource":{"properties":{"uuid":{"description":"Pass this as the `template_uuid` of a campaign.","type":"string","example":"550e8400-e29b-41d4-a716-446655440000","nullable":true},"title":{"description":"Null for templates that were never named.","type":"string","example":"Newsletter Template","nullable":true},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z","nullable":true},"updated_at":{"type":"string","format":"date-time","example":"2025-03-04T09:12:07Z","nullable":true}},"type":"object"},"VPS.V1.Action.ActionCollection":{"description":"Array of [`VPS.V1.Action.ActionResource`](#model/vpsv1actionactionresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.Action.ActionResource"}},"VPS.V1.Action.ActionResource":{"properties":{"id":{"description":"Action ID","type":"integer","example":8123712},"name":{"description":"Action name","type":"string","example":"action_name"},"state":{"description":"Action state","type":"string","enum":["success","error","delayed","sent","created"],"example":"success","x-enum-descriptions":{"success":"Action was successful","error":"Action failed","delayed":"Action is delayed","sent":"Action was sent","created":"Action was created"}},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:00Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-02-27T11:58:00Z"}},"type":"object"},"VPS.V1.Backup.BackupCollection":{"description":"Array of [`VPS.V1.Backup.BackupResource`](#model/vpsv1backupbackupresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.Backup.BackupResource"}},"VPS.V1.Backup.BackupResource":{"properties":{"id":{"description":"Backup ID","type":"integer","example":325},"size":{"description":"Backup size in kilobytes","type":"integer","example":15240192},"restore_time":{"description":"Estimated backup restore time in seconds","type":"integer","example":3600},"location":{"description":"Location of the backup","type":"string","example":"nl-srv-nodebackups"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"}},"type":"object"},"VPS.V1.DataCenter.DataCenterCollection":{"description":"Array of [`VPS.V1.DataCenter.DataCenterResource`](#model/vpsv1datacenterdatacenterresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.DataCenter.DataCenterResource"}},"VPS.V1.DataCenter.DataCenterResource":{"properties":{"id":{"description":"Data center ID","type":"integer","example":29},"name":{"description":"Data center name","type":"string","example":"phx","nullable":true},"location":{"description":"Data center location country (two letter code)","type":"string","example":"us","nullable":true},"city":{"description":"Data center location city","type":"string","example":"Phoenix","nullable":true},"continent":{"description":"Data center location continent","type":"string","example":"North America","nullable":true}},"type":"object"},"VPS.V1.DockerManager.ContainerCollection":{"description":"Array of [`VPS.V1.DockerManager.ContainerResource`](#model/vpsv1dockermanagercontainerresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.DockerManager.ContainerResource"}},"VPS.V1.DockerManager.ContainerPortCollection":{"description":"Array of [`VPS.V1.DockerManager.ContainerPortResource`](#model/vpsv1dockermanagercontainerportresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.DockerManager.ContainerPortResource"}},"VPS.V1.DockerManager.ContainerPortResource":{"properties":{"type":{"description":"Port mapping type - published (accessible from host), exposed (only internal), or range variants","type":"string","enum":["published","published_range","exposed","exposed_range"],"example":"published","x-enum-descriptions":{"published":"\n A single port mapped from the host to the container (e.g., host:8080 -> container:80)\n ","published_range":"\n A range of ports mapped from the host to the container\n (e.g., host:8000-8010 -> container:3000-3010)\n ","exposed":"\n A single port made available for inter-container communication within Docker networks\n ","exposed_range":"\n A range of ports made available for inter-container communication within Docker networks\n "}},"protocol":{"description":"Network protocol used for communication","type":"string","enum":["tcp","udp"],"example":"tcp"},"host_ip":{"description":"IP address on host where port is bound (null for exposed-only ports)","type":"string","example":"0.0.0.0","nullable":true},"host_port":{"description":"Port number on host machine (null for exposed-only or range ports)","type":"integer","example":8080,"nullable":true},"container_port":{"description":"Port number inside container (null for range ports)","type":"integer","example":80,"nullable":true},"host_port_start":{"description":"Starting port number in host port range (null for single ports)","type":"integer","nullable":true},"host_port_end":{"description":"Ending port number in host port range (null for single ports)","type":"integer","nullable":true},"container_port_start":{"description":"Starting port number in container port range (null for single ports)","type":"integer","nullable":true},"container_port_end":{"description":"Ending port number in container port range (null for single ports)","type":"integer","nullable":true}},"type":"object"},"VPS.V1.DockerManager.ContainerResource":{"properties":{"id":{"description":"Unique container identifier (short form of Docker container ID)","type":"string","example":"bbd4c89e850d"},"name":{"description":"Container name as defined in docker-compose or assigned by Docker","type":"string","example":"nginx"},"image":{"description":"Docker image name and tag used to create this container","type":"string","example":"nginx:latest"},"command":{"description":"Command being executed inside the container (may be truncated with ...)","type":"string","example":"/docker-entrypoint.sh nginx -g daemon off;"},"status":{"description":"Human-readable container status including uptime, exit codes, or error information","type":"string","example":"Up 4 hours"},"state":{"description":"Programmatic container lifecycle state for automated processing","type":"string","enum":["created","running","restarting","exited","paused","dead","stopping"],"example":"running","x-enum-descriptions":{"created":"Container has been created but never started","running":"Container is actively running and performing its tasks","restarting":"Container is in the process of being restarted","exited":"Container ran and completed/stopped","paused":"\n Container's processes have been paused, but container is still allocated\n ","dead":"\n Container that the daemon tried and failed to stop\n (usually due to the busy device or resource used by the container)\n ","stopping":"Container is in the process of being stopped"}},"health":{"description":"Container health status","type":"string","enum":["starting","healthy","unhealthy",""],"example":"healthy","x-enum-descriptions":{"":"\n No health check is configured for the container\n (this is the default when no HEALTHCHECK is defined)\n ","healthy":"\n The container has passed its health checks and is operating normally\n ","unhealthy":"\n The container has failed its health checks (exceeded the failure threshold)\n ","starting":"\n The container is still within its startup period (health checks are running but\n haven't passed the required number of consecutive checks yet)\n "}},"ports":{"$ref":"#/components/schemas/VPS.V1.DockerManager.ContainerPortCollection"},"stats":{"oneOf":[{"$ref":"#/components/schemas/VPS.V1.DockerManager.ContainerStatsResource"}],"nullable":true,"description":"Real-time resource usage statistics (only available for running containers)"}},"type":"object"},"VPS.V1.DockerManager.ContainerStatsResource":{"properties":{"cpu_percentage":{"description":"CPU usage in percentage","type":"number","format":"float","example":15.4},"memory_percentage":{"description":"Memory usage in percentage","type":"number","format":"float","example":0.4},"memory_used":{"description":"Used memory in bytes","type":"number","format":"float","example":66532147.2},"memory_total":{"description":"Total available memory in bytes","type":"number","format":"float","example":16771847290.88},"net_in":{"description":"Inbound network traffic in bytes","type":"integer","example":2110000},"net_out":{"description":"Outbound network traffic in bytes","type":"integer","example":30100}},"type":"object"},"VPS.V1.DockerManager.ContentResource":{"properties":{"content":{"description":"Contents of docker-compose file","type":"string","example":"services:\n my-app:\n image: nginx\n ports:\n - \"80:80\"\n my-db:\n image: mysql"},"environment":{"description":"Project environment variables","type":"string","example":"VARIABLE1=value1\nVARIABLE2=value2","nullable":true}},"type":"object"},"VPS.V1.DockerManager.LogEntryCollection":{"description":"Array of [`VPS.V1.DockerManager.LogEntryResource`](#model/vpsv1dockermanagerlogentryresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.DockerManager.LogEntryResource"}},"VPS.V1.DockerManager.LogEntryResource":{"properties":{"timestamp":{"description":"ISO 8601 formatted timestamp when the log entry was generated by the container","type":"string","example":"2024-01-15T10:30:45.123456Z"},"line":{"description":"Raw log message content as output by the application inside the container","type":"string","example":"127.0.0.1 - - [15/Jan/2024:10:30:45 +0000] \"GET / HTTP/1.1\" 200 612"}},"type":"object"},"VPS.V1.DockerManager.LogsCollection":{"description":"Array of [`VPS.V1.DockerManager.LogsResource`](#model/vpsv1dockermanagerlogsresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.DockerManager.LogsResource"}},"VPS.V1.DockerManager.LogsResource":{"properties":{"service":{"description":"Name of the Docker Compose service that generated these log entries","type":"string","example":"web"},"entries":{"$ref":"#/components/schemas/VPS.V1.DockerManager.LogEntryCollection"}},"type":"object"},"VPS.V1.DockerManager.ProjectCollection":{"description":"Array of [`VPS.V1.DockerManager.ProjectResource`](#model/vpsv1dockermanagerprojectresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.DockerManager.ProjectResource"}},"VPS.V1.DockerManager.ProjectResource":{"properties":{"name":{"description":"Docker Compose project name (derived from directory name or compose file)","type":"string","example":"my-project"},"status":{"description":"Raw output from docker compose ps command showing service count and states","type":"string","example":"running(2)"},"state":{"description":"Derived project state parsed from the raw docker compose status","type":"string","enum":["running","stopped","created","mixed","unknown"],"example":"running","x-enum-descriptions":{"running":"Project is running and all services are healthy","stopped":"Project is not running and all services are stopped","created":"Project is created and not built yet, services are not running","mixed":"Project is running with some services not healthy or not running","unknown":"Could not determine the state of the project"}},"path":{"description":"Full filesystem path to the docker-compose.yml file","type":"string","example":"/docker/my-project/docker-compose.yaml"},"containers":{"$ref":"#/components/schemas/VPS.V1.DockerManager.ContainerCollection"}},"type":"object"},"VPS.V1.Firewall.FirewallCollection":{"description":"Array of [`VPS.V1.Firewall.FirewallResource`](#model/vpsv1firewallfirewallresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.Firewall.FirewallResource"}},"VPS.V1.Firewall.FirewallResource":{"properties":{"id":{"description":"Firewall ID","type":"integer","example":65224},"name":{"description":"Firewall name","type":"string","example":"HTTP and SSH only"},"is_synced":{"description":"Is current firewall synced with VPS","type":"boolean","example":false},"rules":{"$ref":"#/components/schemas/VPS.V1.Firewall.FirewallRuleCollection"},"created_at":{"type":"string","format":"date-time","example":"2021-09-01T12:00:00Z"},"updated_at":{"type":"string","format":"date-time","example":"2021-09-01T12:00:00Z"}},"type":"object"},"VPS.V1.Firewall.FirewallRuleCollection":{"description":"Array of [`VPS.V1.Firewall.FirewallRuleResource`](#model/vpsv1firewallfirewallruleresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.Firewall.FirewallRuleResource"}},"VPS.V1.Firewall.FirewallRuleResource":{"properties":{"id":{"description":"Firewall rule ID","type":"integer","example":24541},"action":{"description":"Firewall rule action","type":"string","enum":["accept","drop"],"example":"accept"},"protocol":{"description":"Firewall rule protocol","type":"string","enum":["TCP","UDP","ICMP","GRE","any","ESP","AH","ICMPv6","SSH","HTTP","HTTPS","MySQL","PostgreSQL"],"example":"TCP"},"port":{"description":"Firewall rule destination port: single or port range","type":"string","example":"1024:2048"},"source":{"description":"Firewall rule source. Can be `any` or `custom`","type":"string","example":"any"},"source_detail":{"description":"Firewall rule source detail. Can be `any` or IP address, CIDR or range","type":"string","example":"any"}},"type":"object"},"VPS.V1.IPAddress.IPAddressCollection":{"description":"Array of [`VPS.V1.IPAddress.IPAddressResource`](#model/vpsv1ipaddressipaddressresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.IPAddress.IPAddressResource"}},"VPS.V1.IPAddress.IPAddressResource":{"properties":{"id":{"description":"IP address ID","type":"integer","example":52347},"address":{"description":"IP address: IPv4 or IPv6","type":"string","example":"213.331.273.15"},"ptr":{"description":"IP address PTR record","type":"string","example":"something.domain.tld","nullable":true}},"type":"object"},"VPS.V1.Malware.MetricsResource":{"properties":{"records":{"description":"Records found during last scan","type":"integer","example":1},"malicious":{"description":"Malicious files found during last scan","type":"integer","example":2},"compromised":{"description":"Compromised files found during last scan","type":"integer","example":3},"scanned_files":{"description":"Total number of files scanned during last scan","type":"integer","example":193218},"scan_started_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"scan_ended_at":{"type":"string","format":"date-time","example":"2025-03-27T11:54:22Z","nullable":true}},"type":"object"},"VPS.V1.Metrics.MetricsCollection":{"properties":{"cpu_usage":{"oneOf":[{"$ref":"#/components/schemas/VPS.V1.Metrics.MetricsResource"}],"nullable":true,"description":"CPU usage in percentage, 0 - 100%","type":"object","example":{"unit":"%","usage":{"1742269632":1.45}}},"ram_usage":{"oneOf":[{"$ref":"#/components/schemas/VPS.V1.Metrics.MetricsResource"}],"nullable":true,"description":"RAM usage in bytes","type":"object","example":{"unit":"bytes","usage":{"1742269632":554176512}}},"disk_space":{"oneOf":[{"$ref":"#/components/schemas/VPS.V1.Metrics.MetricsResource"}],"nullable":true,"description":"Disk space usage in bytes","type":"object","example":{"unit":"bytes","usage":{"1742269632":2620018688}}},"outgoing_traffic":{"oneOf":[{"$ref":"#/components/schemas/VPS.V1.Metrics.MetricsResource"}],"nullable":true,"description":"Outgoing traffic in bytes","type":"object","example":{"unit":"bytes","usage":{"1742269632":784800}}},"incoming_traffic":{"oneOf":[{"$ref":"#/components/schemas/VPS.V1.Metrics.MetricsResource"}],"nullable":true,"description":"Incoming traffic in bytes","type":"object","example":{"unit":"bytes","usage":{"1742269632":8978400}}},"uptime":{"oneOf":[{"$ref":"#/components/schemas/VPS.V1.Metrics.MetricsResource"}],"nullable":true,"description":"Uptime in milliseconds","type":"object","example":{"unit":"milliseconds","usage":{"1742269632":455248}}}},"type":"object"},"VPS.V1.Metrics.MetricsResource":{"properties":{"unit":{"description":"Measurement unit","type":"string","example":"measurement-unit"},"usage":{"description":"Object, containing UNIX timestamps as a key and measurement as a value.","type":"object","example":{"timestamp":123}}},"type":"object"},"VPS.V1.PostInstallScript.PostInstallScriptCollection":{"description":"Array of [`VPS.V1.PostInstallScript.PostInstallScriptResource`](#model/vpsv1postinstallscriptpostinstallscriptresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.PostInstallScript.PostInstallScriptResource"}},"VPS.V1.PostInstallScript.PostInstallScriptResource":{"properties":{"id":{"description":"Post-install script ID","type":"integer","example":325},"name":{"description":"Name of the script","type":"string","example":"My Setup Script"},"content":{"description":"Content of the script","type":"string","example":"#!/bin/bash\\napt-get update\\napt-get install -y nginx"},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"updated_at":{"type":"string","format":"date-time","example":"2025-03-19T11:54:22Z"}},"type":"object"},"VPS.V1.PublicKey.PublicKeyCollection":{"description":"Array of [`VPS.V1.PublicKey.PublicKeyResource`](#model/vpsv1publickeypublickeyresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.PublicKey.PublicKeyResource"}},"VPS.V1.PublicKey.PublicKeyResource":{"properties":{"id":{"description":"Public key ID","type":"integer","example":325},"name":{"description":"Public key name","type":"string","example":"My public key"},"key":{"description":"Public key content","type":"string","example":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..."}},"type":"object"},"VPS.V1.Snapshot.SnapshotResource":{"properties":{"id":{"description":"Snapshot ID","type":"integer","example":325},"restore_time":{"description":"Estimated snapshot restore time in seconds","type":"integer","example":1800},"created_at":{"type":"string","format":"date-time","example":"2025-02-27T11:54:22Z"},"expires_at":{"type":"string","format":"date-time","example":"2025-03-19T11:54:22Z"}},"type":"object"},"VPS.V1.Template.TemplateCollection":{"description":"Array of [`VPS.V1.Template.TemplateResource`](#model/vpsv1templatetemplateresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.Template.TemplateResource"}},"VPS.V1.Template.TemplateResource":{"properties":{"id":{"description":"Template ID","type":"integer","example":6523},"name":{"description":"Template name","type":"string","example":"Ubuntu 20.04 LTS"},"description":{"description":"Template description","type":"string","example":"Ubuntu 20.04 LTS"},"documentation":{"description":"Link to official OS documentation","type":"string","example":"https://docs.ubuntu.com","nullable":true}},"type":"object"},"VPS.V1.VirtualMachine.VirtualMachineCollection":{"description":"Array of [`VPS.V1.VirtualMachine.VirtualMachineResource`](#model/vpsv1virtualmachinevirtualmachineresource)","type":"array","items":{"$ref":"#/components/schemas/VPS.V1.VirtualMachine.VirtualMachineResource"}},"VPS.V1.VirtualMachine.VirtualMachineResource":{"properties":{"id":{"description":"Virtual machine ID","type":"integer","example":17923},"firewall_group_id":{"description":"Active firewall ID, `null` if disabled","type":"integer","example":null,"nullable":true},"subscription_id":{"description":"Subscription ID","type":"string","example":"Azz353Uhl1xC54pR0","nullable":true},"data_center_id":{"description":"Data center ID","type":"integer","example":521,"nullable":true},"plan":{"description":"VPS plan name","type":"string","example":"KVM 4","nullable":true},"hostname":{"type":"string","example":"srv17923.hstgr.cloud"},"state":{"type":"string","enum":["running","starting","stopping","stopped","creating","initial","error","suspending","unsuspending","suspended","destroying","destroyed","recreating","restoring","recovery","stopping_recovery"],"example":"running"},"actions_lock":{"type":"string","enum":["unlocked","locked"],"example":"unlocked"},"cpus":{"description":"CPUs count assigned to virtual machine","type":"integer","example":4},"memory":{"description":"Memory available to virtual machine (in megabytes)","type":"integer","example":8192},"disk":{"description":"Virtual machine disk size (in megabytes)","type":"integer","example":51200},"bandwidth":{"description":"Monthly internet traffic available to virtual machine (in megabytes)","type":"integer","example":1073741824},"ns1":{"description":"Primary DNS resolver","type":"string","example":"1.1.1.1","nullable":true},"ns2":{"description":"Secondary DNS resolver","type":"string","example":"8.8.8.8","nullable":true},"ipv4":{"oneOf":[{"$ref":"#/components/schemas/VPS.V1.IPAddress.IPAddressCollection"}],"nullable":true,"description":"IPv4 address of virtual machine"},"ipv6":{"oneOf":[{"$ref":"#/components/schemas/VPS.V1.IPAddress.IPAddressCollection"}],"nullable":true,"description":"IPv6 address of virtual machine, `null` if not assigned"},"template":{"oneOf":[{"$ref":"#/components/schemas/VPS.V1.Template.TemplateResource"}],"nullable":true,"description":"OS template installed in virtual machine"},"created_at":{"type":"string","format":"date-time","example":"2024-09-05T07:25:36.00000Z"}},"type":"object"},"WordPress.V1.Common.VulnerabilityResource":{"properties":{"title":{"description":"Short title of the vulnerability","type":"string","example":"Cross-Site Scripting (XSS)"},"description":{"description":"Details about the vulnerability","type":"string","example":"A stored XSS vulnerability affecting older versions."},"affected_in":{"description":"Version in which the vulnerability was introduced or is present","type":"string","example":"4.7.0"},"fixed_in":{"description":"Version in which the vulnerability was fixed","type":"string","example":"4.7.1"},"direct_url":{"description":"Link to the vulnerability advisory","type":"string","example":"https://www.wordfence.com/threat-intel/vulnerabilities/id/example"}},"type":"object"},"WordPress.V1.HostingerPlugins.AiOptionStatusResource":{"properties":{"is_llmstxt_enabled":{"description":"Whether the llms.txt AI option is enabled.\nPresent when the option is requested or when no specific option filter is provided.","type":"boolean","example":true,"nullable":true},"is_web2agent_enabled":{"description":"Whether the Web2Agent AI option is enabled.\nPresent when the option is requested or when no specific option filter is provided.","type":"boolean","example":false,"nullable":true}},"type":"object"},"WordPress.V1.Installations.CheckIsValidResultCollection":{"description":"Array of [`WordPress.V1.Installations.CheckIsValidResultResource`](#model/wordpressv1installationscheckisvalidresultresource)","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Installations.CheckIsValidResultResource"}},"WordPress.V1.Installations.CheckIsValidResultResource":{"properties":{"software_id":{"description":"WordPress installation (software) identifier","type":"string","example":"123"},"is_valid":{"description":"Whether the WordPress installation is valid and working correctly","type":"boolean","example":true}},"type":"object"},"WordPress.V1.Installations.JwtTokenResource":{"properties":{"token":{"description":"Signed JWT used to authenticate requests against the WordPress installation","type":"string","example":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"},"expires_in":{"description":"Token lifetime in seconds from the moment it was issued","type":"integer","example":3600},"expires_at":{"description":"Date-time at which the token expires, or null when not provided","type":"string","format":"date-time","example":"2024-06-05T12:08:00Z","nullable":true},"mcp_url":{"description":"MCP (Model Context Protocol) endpoint URL for the WordPress installation, or null when not provided","type":"string","example":"https://example.com/wp-json/hostinger/mcp","nullable":true}},"type":"object"},"WordPress.V1.Installations.UpdateCollection":{"description":"Array of [`WordPress.V1.Installations.UpdateResource`](#model/wordpressv1installationsupdateresource)","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Installations.UpdateResource"}},"WordPress.V1.Installations.UpdateResource":{"properties":{"version":{"description":"Available WordPress core version","type":"string","example":"6.5.2"},"type":{"description":"Update type","type":"string","enum":["major","minor"],"example":"minor"},"url":{"description":"Download URL for the update package","type":"string","example":"https://wordpress.org/wordpress-6.5.2.zip"}},"type":"object"},"WordPress.V1.Installations.VersionResource":{"properties":{"version":{"description":"Installed WordPress core version","type":"string","example":"6.5.2"},"vulnerabilities":{"description":"Known vulnerabilities affecting the installed core version","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Common.VulnerabilityResource"}}},"type":"object"},"WordPress.V1.Installations.WordPressInstallationCollection":{"description":"Array of [`WordPress.V1.Installations.WordPressInstallationResource`](#model/wordpressv1installationswordpressinstallationresource)","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Installations.WordPressInstallationResource"}},"WordPress.V1.Installations.WordPressInstallationResource":{"properties":{"id":{"description":"WordPress installation (software) id","type":"string","example":"123"},"username":{"description":"Hosting account username","type":"string","example":"u123456789"},"domain":{"description":"Domain the installation belongs to","type":"string","example":"example.com"},"site_title":{"description":"WordPress site title","type":"string","example":"My site"},"url":{"description":"WordPress site URL","type":"string","example":"https://example.com"},"directory":{"description":"Installation directory","type":"string","example":"public_html"},"language":{"description":"WordPress locale","type":"string","example":"en_US"},"login":{"description":"WordPress admin username","type":"string","example":"admin"},"email":{"description":"WordPress admin email","type":"string","example":"owner@example.com"},"is_valid":{"description":"Whether the installation is considered valid","type":"boolean","example":true},"validation_error":{"description":"Reason the installation is invalid, if any","type":"string","example":"Invalid domain","nullable":true},"created_at":{"description":"Installation creation timestamp","type":"string","format":"date-time","example":"2022-01-01T00:00:00Z"}},"type":"object"},"WordPress.V1.Installations.WordPressMcpDetailsResource":{"properties":{"token":{"description":"JWT used to authenticate against the installation MCP server","type":"string","example":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"},"mcp_url":{"description":"MCP (Model Context Protocol) endpoint URL for the WordPress installation","type":"string","example":"https://example.com/wp-json/hostinger/mcp"},"expires_in":{"description":"Token lifetime in seconds from the moment it was issued","type":"integer","example":3600},"expires_at":{"description":"Date-time at which the token expires","type":"string","format":"date-time","example":"2024-06-05T12:08:00Z","nullable":true}},"type":"object"},"WordPress.V1.Installations.WordPressMcpInstallationCollection":{"description":"Array of [`WordPress.V1.Installations.WordPressMcpInstallationResource`](#model/wordpressv1installationswordpressmcpinstallationresource)","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Installations.WordPressMcpInstallationResource"}},"WordPress.V1.Installations.WordPressMcpInstallationResource":{"properties":{"id":{"description":"WordPress installation (software) id","type":"string","example":"123"},"username":{"description":"Hosting account username","type":"string","example":"u123456789"},"domain":{"description":"Domain the installation belongs to","type":"string","example":"example.com"},"directory":{"description":"Installation directory on the server","type":"string","example":"/home/u123456789/domains/example.com/public_html"},"mcp_details":{"oneOf":[{"$ref":"#/components/schemas/WordPress.V1.Installations.WordPressMcpDetailsResource"}],"nullable":true,"description":"MCP connection details, or null when the installation has no MCP endpoint or the details could not be retrieved"}},"type":"object"},"WordPress.V1.Litespeed.LitespeedCacheStatusResource":{"properties":{"is_installed":{"description":"Whether the LiteSpeed Cache plugin is installed on the WordPress installation","type":"boolean","example":true},"is_active":{"description":"Whether the LiteSpeed Cache plugin is active on the WordPress installation","type":"boolean","example":true}},"type":"object"},"WordPress.V1.Login.LoginLinksResource":{"properties":{"login":{"description":"Primary auto-login URL for the WordPress installation","type":"string","example":"https://example.com/create_autologin_qs1s121s.php","nullable":true},"fallback":{"description":"Fallback auto-login URL using the temporary Hostinger domain","type":"string","example":"https://xyz.hostingersite.com/create_autologin_qs1s121s.php","nullable":true},"default":{"description":"Default WordPress admin URL used when auto-login is unavailable","type":"string","example":"https://example.com/wp-admin/","nullable":true}},"type":"object"},"WordPress.V1.Maintenance.MaintenanceStatusResource":{"properties":{"status":{"description":"Current maintenance mode status for the WordPress installation","type":"string","enum":["enabled","disabled"],"example":"enabled"}},"type":"object"},"WordPress.V1.Memcached.MemcachedStatusResource":{"properties":{"status":{"description":"Current Memcached object cache status for the WordPress installation","type":"string","enum":["active","inactive"],"example":"active"}},"type":"object"},"WordPress.V1.Plugins.AvailablePluginCollection":{"description":"Array of [`WordPress.V1.Plugins.AvailablePluginResource`](#model/wordpressv1pluginsavailablepluginresource)","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Plugins.AvailablePluginResource"}},"WordPress.V1.Plugins.AvailablePluginResource":{"properties":{"slug":{"description":"Plugin slug used when installing the plugin","type":"string","example":"akismet"},"title":{"description":"Human readable plugin name","type":"string","example":"Akismet Anti-Spam"},"description":{"description":"Short plugin description","type":"string","example":"Protect your site from spam."},"onboarding_description_slug":{"description":"Translation slug for the onboarding description","type":"string","example":"akismet_onboarding_description","nullable":true},"recommended_description_slug":{"description":"Translation slug for the recommended description","type":"string","example":"akismet_recommended_description","nullable":true},"link":{"description":"Link to the plugin page on WordPress.org","type":"string","example":"https://wordpress.org/plugins/akismet/"},"version":{"description":"Latest available plugin version","type":"string","example":"5.3"},"required_wordpress_version":{"description":"Minimum WordPress version required by the plugin","type":"string","example":"5.8"},"required_php_version":{"description":"Minimum PHP version required by the plugin","type":"string","example":"7.2"},"is_plan_upgrade_needed":{"description":"Whether a hosting plan upgrade is required to use the plugin","type":"boolean","example":false}},"type":"object"},"WordPress.V1.Plugins.InstalledPluginCollection":{"description":"Array of [`WordPress.V1.Plugins.InstalledPluginResource`](#model/wordpressv1pluginsinstalledpluginresource)","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Plugins.InstalledPluginResource"}},"WordPress.V1.Plugins.InstalledPluginResource":{"properties":{"name":{"description":"Plugin slug","type":"string","example":"akismet"},"title":{"description":"Human readable plugin name","type":"string","example":"Akismet Anti-Spam"},"version":{"description":"Installed plugin version","type":"string","example":"5.3"},"status":{"description":"Whether the plugin is active or inactive","type":"string","enum":["active","inactive"],"example":"active"},"update":{"description":"Available update version, or \"none\" when up to date","type":"string","example":"none"},"vulnerabilities":{"description":"Known vulnerabilities affecting the installed version","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Common.VulnerabilityResource"}}},"type":"object"},"WordPress.V1.Plugins.PluginCollection":{"description":"Array of [`WordPress.V1.Plugins.PluginResource`](#model/wordpressv1pluginspluginresource)","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Plugins.PluginResource"}},"WordPress.V1.Plugins.PluginResource":{"properties":{"slug":{"description":"Plugin slug used when installing the plugin","type":"string","example":"akismet"},"title":{"description":"Human readable plugin name","type":"string","example":"Akismet Anti-Spam"},"icons":{"description":"Plugin icon URLs keyed by resolution","properties":{"1x":{"type":"string","example":"https://ps.w.org/akismet/assets/icon-128x128.png"},"2x":{"type":"string","example":"https://ps.w.org/akismet/assets/icon-256x256.png"}},"type":"object","nullable":true},"description":{"description":"Short plugin description","type":"string","example":"Used by millions, Akismet is quite possibly the best way to protect your site from spam."}},"type":"object"},"WordPress.V1.Plugins.SuggestedPluginGroupCollection":{"description":"Array of [`WordPress.V1.Plugins.SuggestedPluginGroupResource`](#model/wordpressv1pluginssuggestedplugingroupresource)","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Plugins.SuggestedPluginGroupResource"}},"WordPress.V1.Plugins.SuggestedPluginGroupResource":{"properties":{"website_type":{"description":"Website type the suggested plugins are grouped by","type":"string","enum":["business","online-store","blog","portfolio","affiliate-marketing","other","default"],"example":"blog"},"plugins":{"description":"Plugins suggested for the website type","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Plugins.SuggestedPluginResource"}}},"type":"object"},"WordPress.V1.Plugins.SuggestedPluginResource":{"properties":{"slug":{"description":"Plugin slug used when installing the plugin","type":"string","example":"akismet"},"title":{"description":"Human readable plugin name","type":"string","example":"Akismet Anti-Spam"},"description":{"description":"Short plugin description","type":"string","example":"Protect your site from spam."},"onboarding_description_slug":{"description":"Translation slug for the onboarding description","type":"string","example":"akismet_onboarding_description","nullable":true},"recommended_description_slug":{"description":"Translation slug for the recommended description","type":"string","example":"akismet_recommended_description","nullable":true},"link":{"description":"Link to the plugin page on WordPress.org","type":"string","example":"https://wordpress.org/plugins/akismet/"},"version":{"description":"Latest available plugin version","type":"string","example":"5.3"},"required_wordpress_version":{"description":"Minimum WordPress version required by the plugin","type":"string","example":"5.8"},"required_php_version":{"description":"Minimum PHP version required by the plugin","type":"string","example":"7.2"},"is_preselected":{"description":"Whether the plugin is preselected during onboarding","type":"boolean","example":true},"is_plan_upgrade_needed":{"description":"Whether a hosting plan upgrade is required to use the plugin","type":"boolean","example":false}},"type":"object"},"WordPress.V1.Plugins.WoocommerceInstalledResource":{"properties":{"is_installed":{"description":"Whether WooCommerce is installed on any WordPress installation of the domain","type":"boolean","example":true}},"type":"object"},"WordPress.V1.Themes.InstalledThemeCollection":{"description":"Array of [`WordPress.V1.Themes.InstalledThemeResource`](#model/wordpressv1themesinstalledthemeresource)","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Themes.InstalledThemeResource"}},"WordPress.V1.Themes.InstalledThemeResource":{"properties":{"name":{"description":"Theme slug","type":"string","example":"twentytwentyone"},"title":{"description":"Human readable theme name","type":"string","example":"Twenty Twenty-One"},"version":{"description":"Installed theme version","type":"string","example":"2.2"},"status":{"description":"Whether the theme is active or inactive","type":"string","enum":["active","inactive"],"example":"active"},"update":{"description":"Available update version, or \"none\" when up to date","type":"string","example":"none"},"vulnerabilities":{"description":"Known vulnerabilities affecting the installed version","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Common.VulnerabilityResource"}}},"type":"object"},"WordPress.V1.Themes.ThemeCollection":{"description":"Array of [`WordPress.V1.Themes.ThemeResource`](#model/wordpressv1themesthemeresource)","type":"array","items":{"$ref":"#/components/schemas/WordPress.V1.Themes.ThemeResource"}},"WordPress.V1.Themes.ThemeResource":{"properties":{"slug":{"description":"Theme slug used when installing the theme","type":"string","example":"twentytwentyone"},"title":{"description":"Human readable theme name","type":"string","example":"Twenty Twenty-One"},"url":{"description":"Link to the theme page on WordPress.org","type":"string","example":"https://wordpress.org/themes/twentytwentyone/"},"featured_image_url":{"description":"URL of the theme preview thumbnail","type":"string","example":"https://ts.w.org/wp-content/themes/twentytwentyone/screenshot.png","nullable":true},"full_image_url":{"description":"URL of the full-size theme preview image","type":"string","example":"https://ts.w.org/wp-content/themes/twentytwentyone/screenshot.png","nullable":true},"description":{"description":"Short theme description","type":"string","example":"A blank canvas for your ideas.","nullable":true},"logo_url":{"description":"URL of the theme logo","type":"string","example":"https://ts.w.org/wp-content/themes/twentytwentyone/logo.png","nullable":true},"is_plan_upgrade_needed":{"description":"Whether a hosting plan upgrade is required to use the theme","type":"boolean","example":false}},"type":"object"}},"responses":{"Common.Response.ErrorResponse":{"description":"Error response","content":{"application/json":{"schema":{"properties":{"message":{"description":"Message of the error","type":"string","example":"Error message"},"correlation_id":{"description":"Request correlation ID","type":"string","example":"26a91bd9-f8c8-4a83-9df9-83e23d696fe3"}},"type":"object"}}},"x-scalar-ignore":true},"Common.Response.UnauthorizedResponse":{"description":"Unauthenticated response","content":{"application/json":{"schema":{"properties":{"message":{"description":"Message of the error","type":"string","example":"Unauthenticated"},"correlation_id":{"description":"Request correlation ID","type":"string","example":"26a91bd9-f8c8-4a83-9df9-83e23d696fe3"}},"type":"object"}}},"x-scalar-ignore":true},"Common.Response.UnprocessableContentResponse":{"description":"Validation error response","content":{"application/json":{"schema":{"properties":{"message":{"description":"Validation error message","type":"string","example":"The name field is required. (and 1 more error)"},"errors":{"description":"Object of detailed errors for each field","properties":{"field_1":{"type":"array","items":{},"example":["The field_1 field is required.","The field_1 must be a number."]},"field_2":{"type":"array","items":{},"example":["The field_2 field is required.","The field_2 must be a string."]}},"type":"object"},"correlation_id":{"description":"Request correlation ID","type":"string","example":"26a91bd9-f8c8-4a83-9df9-83e23d696fe3"}},"type":"object"}}},"x-scalar-ignore":true}},"parameters":{"agency_cron_job_uuid_path":{"name":"uuid","in":"path","description":"Unique identifier of the cron job as returned by the list cron jobs endpoint.","required":true,"schema":{"type":"string","format":"uuid","example":"01931d6f-68f5-7b72-8d9e-09c6e1e6aa0e"}},"agency_database_name_path":{"name":"database_name","in":"path","description":"Full database name as returned by the list databases endpoint.","required":true,"schema":{"type":"string","example":"my_database"}},"agency_database_user_name_path":{"name":"database_user_name","in":"path","description":"Database username as returned by the list databases endpoint.","required":true,"schema":{"type":"string","example":"my_user"}},"agency_hosting_domain_filter":{"name":"domain","in":"query","description":"Filter by domain name (case-insensitive substring match)","required":false,"schema":{"type":"string","example":"example.com","nullable":true}},"from_domain":{"name":"from_domain","in":"path","description":"Current domain name to change from","required":true,"schema":{"type":"string","example":"old.example.com"}},"order_id_path":{"name":"order_id","in":"path","description":"Agency Plan order ID","required":true,"schema":{"type":"integer","example":123456}},"agency_hosting_order_ids":{"name":"order_ids","in":"query","description":"Filter by order IDs. Accepts a comma-separated list.","required":false,"style":"form","explode":false,"schema":{"type":"array","items":{"type":"integer"},"example":[12345,67890],"nullable":true}},"setup_uuid":{"name":"setup_uuid","in":"path","description":"Website setup UUID","required":true,"schema":{"type":"string","format":"uuid","example":"0193b6d4-fabb-70e0-8ea4-cfe060a45898"}},"agency_hosting_states":{"name":"states","in":"query","description":"Filter by website state. Accepts a comma-separated list.","required":false,"style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["active","locked","suspended","deleting","deleted"]},"example":["active"],"nullable":true}},"agency_time_frame_days":{"name":"time_frame_days","in":"query","description":"Length of the window in days, ending now. Bucket size grows with the window.","required":false,"schema":{"type":"integer","default":1,"enum":[1,7,14,30],"example":7}},"agency_time_frame_hours":{"name":"time_frame_hours","in":"query","description":"Length of the window in hours, ending now. Bucket size grows with the window.","required":false,"schema":{"type":"integer","default":24,"enum":[1,24,168,336,720],"example":168}},"agency_hosting_website_types":{"name":"website_types","in":"query","description":"Filter by detected website type, e.g. wordpress,nodejs. Accepts a comma-separated list.","required":false,"style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["wordpress","builder","horizons","nodejs","other"]},"example":["wordpress","nodejs"],"nullable":true}},"website_uid":{"name":"website_uid","in":"path","description":"Agency Plan website UID","required":true,"schema":{"type":"string","example":"zpwlGlp19"}},"website_uuids":{"name":"website_uuids","in":"query","description":"Filter by website UIDs","required":false,"schema":{"type":"array","items":{"type":"string"},"example":["zpwlGlp19"],"nullable":true}},"category":{"name":"category","in":"query","description":"Filter catalog items by category","schema":{"type":"string","enum":["DOMAIN","VPS","EMAIL"],"example":"VPS"}},"name":{"name":"name","in":"query","description":"Filter catalog items by name. Use `*` for wildcard search, e.g. `.COM*` to find .com domain","schema":{"type":"string","example":".COM*"}},"paymentMethodId":{"name":"paymentMethodId","in":"path","description":"Payment method ID","required":true,"schema":{"type":"integer","example":9693613}},"subscriptionId":{"name":"subscriptionId","in":"path","description":"Subscription ID","required":true,"schema":{"type":"string","example":"Cxy353Uhl1xC54pG6"}},"domain":{"name":"domain","in":"path","description":"Domain name","required":true,"schema":{"type":"string","example":"mydomain.tld"}},"page":{"name":"page","in":"query","description":"Page number","required":false,"schema":{"type":"integer","example":1}},"per_page":{"name":"per_page","in":"query","description":"Number of items per page","required":false,"schema":{"type":"integer","default":25,"maximum":100,"example":25}},"snapshotId":{"name":"snapshotId","in":"path","description":"Snapshot ID","required":true,"schema":{"type":"integer","example":53513053}},"force_sync":{"name":"force_sync","in":"query","description":"Re-check the move against the registry before responding. Only has an effect while the move is in the `activating` status.","schema":{"type":"boolean","default":false,"example":true}},"tld":{"name":"tld","in":"query","description":"Filter by TLD (without leading dot)","schema":{"type":"string","example":"com"}},"whoisId":{"name":"whoisId","in":"path","description":"WHOIS ID","required":true,"schema":{"type":"integer","example":564651}},"website_id_path":{"name":"websiteId","in":"path","description":"The website ID","required":true,"schema":{"type":"string","example":"123e4567-e89b-12d3-a456-426614174000"}},"build_uuid_path":{"name":"uuid","in":"path","description":"Build UUID","required":true,"schema":{"type":"string","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000"}},"cron_job_uid_path":{"name":"uid","in":"path","description":"Unique identifier of the cron job as returned by the list cron jobs endpoint.","required":true,"schema":{"type":"string","example":"cron_abc123"}},"database_is_assigned":{"name":"is_assigned","in":"query","description":"When used with domain, return only databases assigned to that domain.","required":false,"schema":{"type":"boolean","example":true,"nullable":true}},"database_name_path":{"name":"name","in":"path","description":"Full database name as returned by the list databases endpoint.","required":true,"schema":{"type":"string","example":"u123456789_test_db"}},"database_search":{"name":"search","in":"query","description":"Search databases by name, user, or creation date.","required":false,"schema":{"type":"string","maxLength":512,"example":"test_db","nullable":true}},"directory":{"name":"directory","in":"query","description":"Directory path to check","required":false,"schema":{"type":"string","default":"","example":"blog"}},"domain_filter":{"name":"domain","in":"query","description":"Filter by domain name (case-insensitive substring match)","required":false,"schema":{"type":"string","example":"example.com","nullable":true}},"is_enabled":{"name":"is_enabled","in":"query","description":"Filter by enabled status","required":false,"schema":{"type":"boolean","example":true,"nullable":true}},"order_id":{"name":"order_id","in":"query","description":"Order ID","required":false,"schema":{"type":"integer","example":123,"nullable":true}},"order_ids":{"name":"order_ids","in":"query","description":"Filter by specific order IDs","required":false,"schema":{"type":"array","items":{"type":"integer"},"example":[12345,67890],"nullable":true}},"statuses":{"name":"statuses","in":"query","description":"Filter by order statuses","required":false,"schema":{"type":"array","items":{"type":"string","enum":["active","deleting","deleted","suspended"]},"example":["active","suspended"],"nullable":true}},"parked_domain_path":{"name":"parkedDomain","in":"path","required":true,"schema":{"type":"string","example":"parked-domain.com"}},"order_id_required":{"name":"order_id","in":"query","description":"Order ID","required":true,"schema":{"type":"integer","example":123,"nullable":false}},"subdomain_path":{"name":"subdomain","in":"path","required":true,"schema":{"type":"string","example":"blog"}},"username":{"name":"username","in":"query","description":"Filter by specific username","required":false,"schema":{"type":"string","example":"cl_user123","nullable":true}},"username_path":{"name":"username","in":"path","required":true,"schema":{"type":"string","example":"u123456789"}},"hosting_website_types":{"name":"website_types","in":"query","description":"Filter by detected website type, e.g. wordpress,nodejs. Accepts a comma-separated list.","required":false,"style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["wordpress","builder","horizons","nodejs","other"]},"example":["wordpress","nodejs"],"nullable":true}},"mail_access_log_has_deletions":{"name":"has_deletions","in":"query","description":"Filter access log entries by whether the session had deletions","required":false,"schema":{"type":"boolean","example":false,"nullable":true}},"mail_access_log_protocol":{"name":"protocol","in":"query","description":"Filter access log entries by protocol","required":false,"schema":{"type":"string","enum":["imap","pop3","smtp"],"example":"imap","nullable":true}},"mail_alias_id_path":{"name":"aliasId","in":"path","description":"Alias resource ID","required":true,"schema":{"type":"string","example":"AA1a2b3c4d5e6f7g"}},"mail_api_token_id_path":{"name":"tokenId","in":"path","description":"API token ID (returned when the token was created)","required":true,"schema":{"type":"string","example":"019683f8-1234-7abc-8def-0123456789ab"}},"mail_api_token_order_filter":{"name":"order_id","in":"query","description":"Filter tokens by order resource ID. Single value or comma-separated list.","required":false,"schema":{"type":"string","example":"OR1a2b3c4d5e6f7g,OR9z8y7x6w5v4u3t","nullable":true}},"mail_autoreply_id_path":{"name":"autoreplyId","in":"path","description":"Autoreply resource ID","required":true,"schema":{"type":"string","example":"AR1a2b3c4d5e6f7g"}},"mail_catchall_id_path":{"name":"catchallId","in":"path","description":"Catch-all resource ID","required":true,"schema":{"type":"string","example":"CA1a2b3c4d5e6f7g"}},"mail_order_domain_filter":{"name":"domain","in":"query","description":"Filter orders by domain name (exact match)","required":false,"schema":{"type":"string","example":"example.com","nullable":true}},"mail_forwarder_id_path":{"name":"forwarderId","in":"path","description":"Forwarder resource ID","required":true,"schema":{"type":"string","example":"FW1a2b3c4d5e6f7g"}},"mail_log_account":{"name":"account","in":"query","description":"Filter log entries by a specific email account","required":false,"schema":{"type":"string","format":"email","example":"user@example.com","nullable":true}},"mail_log_date":{"name":"date","in":"query","description":"Exact date filter (YYYY-MM-DD). Takes precedence over `from_date`/`to_date` when both are given.","required":false,"schema":{"type":"string","format":"date","example":"2026-03-16","nullable":true}},"mail_log_from_date":{"name":"from_date","in":"query","description":"Date range start (RFC 3339)","required":false,"schema":{"type":"string","format":"date-time","example":"2026-03-01T00:00:00Z","nullable":true}},"mail_log_recipient":{"name":"recipient","in":"query","description":"Filter log entries by recipient. Accepts a full email address or a domain.","required":false,"schema":{"type":"string","example":"recipient.com","nullable":true}},"mail_log_sender":{"name":"sender","in":"query","description":"Filter log entries by sender. Accepts a full email address or a domain.","required":false,"schema":{"type":"string","example":"user@example.com","nullable":true}},"mail_log_status":{"name":"status","in":"query","description":"Filter log entries by status","required":false,"schema":{"type":"string","enum":["Successful","Failed"],"example":"Successful","nullable":true}},"mail_log_to_date":{"name":"to_date","in":"query","description":"Date range end (RFC 3339)","required":false,"schema":{"type":"string","format":"date-time","example":"2026-03-31T23:59:59Z","nullable":true}},"mail_mailbox_action_event":{"name":"event","in":"query","description":"Filter mailbox action log entries by event type","required":false,"schema":{"type":"string","enum":["MessageNew","MessageRead","MessageAppend","MessageExpunge","MailboxCreate","MailboxDelete","MailboxRename"],"example":"MessageNew","nullable":true}},"mail_mailbox_email":{"name":"email","in":"query","description":"Mailbox email address. Must belong to the order's domain.","required":true,"schema":{"type":"string","format":"email","example":"user@example.com"}},"mail_mailbox_id_path":{"name":"mailboxId","in":"path","description":"Mailbox resource ID","required":true,"schema":{"type":"string","example":"AC1a2b3c4d5e6f7g"}},"mail_mailbox_search":{"name":"search","in":"query","description":"Filter mailboxes whose email address contains the given string","required":false,"schema":{"type":"string","maxLength":255,"example":"info","nullable":true}},"mail_mailbox_sort":{"name":"sort","in":"query","description":"Sort mailboxes by field. Prefix with `-` for descending order.","required":false,"schema":{"type":"string","default":"address","enum":["address","-address"],"example":"address","nullable":true}},"mail_order_id_path":{"name":"orderId","in":"path","description":"Order resource ID","required":true,"schema":{"type":"string","example":"OR1a2b3c4d5e6f7g"}},"mail_order_sort":{"name":"sort","in":"query","description":"Sort orders by field. Prefix with `-` for descending order.","required":false,"schema":{"type":"string","default":"-created_at","enum":["created_at","-created_at","expires_at","-expires_at"],"example":"-created_at","nullable":true}},"mail_order_status":{"name":"status","in":"query","description":"Filter orders by status","required":false,"schema":{"type":"string","enum":["pending_setup","active","suspended"],"example":"active","nullable":true}},"mail_order_is_trial":{"name":"is_trial","in":"query","description":"Filter orders by trial state","required":false,"schema":{"type":"boolean","example":false,"nullable":true}},"mail_webhook_id_path":{"name":"webhookId","in":"path","description":"Webhook ID (returned when the webhook was created)","required":true,"schema":{"type":"string","example":"019683f8-1234-7abc-8def-0123456789ab"}},"mail_webhook_mailbox_filter":{"name":"mailbox_id","in":"query","description":"Filter by the mailbox resource ID the webhooks are attached to","required":false,"schema":{"type":"string","example":"AC1a2b3c4d5e6f7g","nullable":true}},"mail_webhook_status":{"name":"status","in":"query","description":"Filter webhooks by status","required":false,"schema":{"type":"string","enum":["active","disabled","paused"],"example":"active","nullable":true}},"reach_automation_sort_direction":{"name":"sort_direction","in":"query","description":"Order automations by creation date. Newest first unless set to `asc`.","required":false,"schema":{"type":"string","enum":["asc","desc"],"example":"desc"}},"reach_automation_status":{"name":"status","in":"query","description":"Filter automations by status.\n\nThere is no `completed` status. An automation that has finished for every contact still\nreports `active`.","required":false,"schema":{"type":"string","enum":["active","paused","draft"],"example":"active"}},"automationUuid":{"name":"automationUuid","in":"path","description":"Automation uuid parameter","required":true,"schema":{"type":"string","example":"550e8400-e09b-41d4-a716-400055000000"}},"reach_campaign_sort_direction":{"name":"sort_direction","in":"query","description":"Order campaigns by creation date. Newest first unless set to `asc`.","required":false,"schema":{"type":"string","enum":["asc","desc"],"example":"desc"}},"reach_campaign_status":{"name":"status","in":"query","description":"Filter campaigns by status.\n\nA fully sent campaign has the status `publish`. There is no `sent` status, and campaigns can\nbe neither paused nor archived.","required":false,"schema":{"type":"string","enum":["draft","scheduled","sending","publish","failed"],"example":"publish"}},"reach_campaign_type":{"name":"type","in":"query","description":"Filter campaigns by type.\n\nDefaults to `campaign`, which leaves out the emails sent by automations and the double\nopt-in confirmations.","required":false,"schema":{"type":"string","default":"campaign","enum":["campaign","automation","double_opt_in"],"example":"campaign"}},"campaignUuid":{"name":"campaignUuid","in":"path","description":"Campaign uuid parameter","required":true,"schema":{"type":"string","example":"550e8400-e09b-41d4-a716-400055000000"}},"search":{"name":"search","in":"query","description":"Search contacts by email","required":false,"schema":{"type":"string","maxLength":255,"example":"john.doe@example.com"}},"uuid":{"name":"uuid","in":"path","description":"UUID of the contact to delete","required":true,"schema":{"type":"string","format":"uuid"}},"fieldUuid":{"name":"fieldUuid","in":"path","description":"Contact field uuid parameter","required":true,"schema":{"type":"string","format":"uuid","example":"550e8400-e29b-41d4-a716-446655440000"}},"formUuid":{"name":"formUuid","in":"path","description":"Form uuid parameter","required":true,"schema":{"type":"string","example":"550e8400-e09b-41d4-a716-400055000000"}},"group_uuid":{"name":"group_uuid","in":"query","description":"Filter contacts by group UUID","required":false,"schema":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"}},"contactUuid":{"name":"contactUuid","in":"path","description":"Contact uuid parameter","required":true,"schema":{"type":"string","format":"uuid","example":"550e8400-e29b-41d4-a716-446655440000"}},"profileUuid":{"name":"profileUuid","in":"path","description":"Profile uuid parameter","required":true,"schema":{"type":"string","example":"550e8400-e09b-41d4-a716-400055000000"}},"count_type":{"name":"count_type","in":"query","description":"Which matching contacts to count for each segment","required":false,"schema":{"type":"string","default":"all","enum":["all","subscribed"],"example":"all"}},"segmentUuid":{"name":"segmentUuid","in":"path","description":"Segment uuid parameter","required":true,"schema":{"type":"string","example":"550e8400-e09b-41d4-a716-400055000000"}},"subscription_status":{"name":"subscription_status","in":"query","description":"Filter contacts by subscription status","required":false,"schema":{"type":"string","enum":["subscribed","unsubscribed","confirmed","pending"],"example":"subscribed"}},"tag_uuid":{"name":"tag_uuid","in":"query","description":"Filter contacts by tag UUID","required":false,"schema":{"type":"string","format":"uuid","example":"550e8400-e29b-41d4-a716-446655440000"}},"tagUuid":{"name":"tagUuid","in":"path","description":"Tag uuid parameter","required":true,"schema":{"type":"string","format":"uuid","example":"550e8400-e29b-41d4-a716-446655440000"}},"tokenId":{"name":"tokenId","in":"path","description":"Token ID","required":true,"schema":{"type":"integer","example":6409747}},"actionId":{"name":"actionId","in":"path","description":"Action ID","required":true,"schema":{"type":"integer","example":8123712}},"backupId":{"name":"backupId","in":"path","description":"Backup ID","required":true,"schema":{"type":"integer","example":8676502}},"projectName":{"name":"projectName","in":"path","description":"Docker Compose project name using alphanumeric characters, dashes, and underscores only","required":true,"schema":{"type":"string","maxLength":64,"minLength":3,"example":"my-docker-project"}},"firewallId":{"name":"firewallId","in":"path","description":"Firewall ID","required":true,"schema":{"type":"integer","example":9449049}},"ruleId":{"name":"ruleId","in":"path","description":"Firewall Rule ID","required":true,"schema":{"type":"integer","example":8941182}},"ipAddressId":{"name":"ipAddressId","in":"path","description":"IP Address ID","required":true,"schema":{"type":"integer","example":246547}},"postInstallScriptId":{"name":"postInstallScriptId","in":"path","description":"Post-install script ID","required":true,"schema":{"type":"integer","example":9568314}},"publicKeyId":{"name":"publicKeyId","in":"path","description":"Public Key ID","required":true,"schema":{"type":"integer","example":6672861}},"templateId":{"name":"templateId","in":"path","description":"Template ID","required":true,"schema":{"type":"integer","example":2868928}},"virtualMachineId":{"name":"virtualMachineId","in":"path","description":"Virtual Machine ID","required":true,"schema":{"type":"integer","example":1268054}},"software_path":{"name":"software","in":"path","description":"WordPress installation (software) identifier","required":true,"schema":{"type":"string","pattern":"^[0-9]+$","example":"1232456789"}}},"securitySchemes":{"apiToken":{"type":"http","description":"API Token authentication","scheme":"bearer"}}},"security":[{"apiToken":[]}],"tags":[{"name":"Billing"},{"name":"Billing: Catalog","description":"Access a comprehensive catalog of service plans and\nsubscription options, complete with detailed pricing\nand features.","x-displayName":"Catalog","x-parent":"Billing"},{"name":"Billing: Orders","description":"Initiate and track new service orders seamlessly. This\ncategory streamlines the process of purchasing Hostinger\nservices, enabling efficient management of order details.","x-displayName":"Orders","x-parent":"Billing"},{"name":"Billing: Payment methods","description":"Review and manage the payment methods linked to your\nHostinger account. Enjoy a secure and convenient overview\nfor handling billing and transactions.","x-displayName":"Payment methods","x-parent":"Billing"},{"name":"Billing: Subscriptions","description":"Manage your account's subscriptions by retrieving lists of\nactive and expired plans along with details such as\nactivation and expiration dates.","x-displayName":"Subscriptions","x-parent":"Billing"},{"name":"Domains"},{"name":"Domains: Availability","description":"Check the availability of domain names across multiple TLDs.\nThis category allows you to verify if a specific domain name\nis available for registration, and to get AI generated name\nsuggestions when the name you wanted is already taken.","x-displayName":"Availability","x-parent":"Domains"},{"name":"Domains: Forwarding","description":"Domain forwarding or redirect is an easy way to direct your\nwebsite visitors to another site or page, making it simple to\nmaintain your brand and keep your visitors engaged.","x-displayName":"Forwarding","x-parent":"Domains"},{"name":"Domains: Move","description":"Move domains between Hostinger accounts. This category\nincludes endpoints for initiating and cancelling moves of\nyour own domains to another account, and for accepting or\nrejecting moves initiated towards your account.\nA move changes which Hostinger account owns the domain and\ndoes not involve a registrar transfer.","x-displayName":"Move","x-parent":"Domains"},{"name":"Domains: Portfolio","description":"Retrieve and manage your domain portfolio. This category lets\nyou list all domains linked to your account, including their\ncreation and expiration details.","x-displayName":"Portfolio","x-parent":"Domains"},{"name":"Domains: Transfer","description":"Domains: Transfer","x-displayName":"Transfer","x-parent":"Domains"},{"name":"Domains: WHOIS","description":"Manage WHOIS contact profiles for your domains. This category\nincludes endpoints for creating, updating, deleting, and\nretrieving WHOIS profiles.\nWHOIS profile stores registration data for domain names and\nis required for domain registration.","x-displayName":"WHOIS","x-parent":"Domains"},{"name":"DNS"},{"name":"DNS: Snapshot","description":"Manage DNS snapshots for your domains.\nThis category includes endpoints for viewing and restoring\nsnapshots of your domain DNS zone.\nSnapshot is a point-in-time copy of your DNS zone, allowing you\nto restore your domain's DNS settings to a previous state.","x-displayName":"Snapshot","x-parent":"DNS"},{"name":"DNS: Zone","description":"Manage DNS zones and records for your domains. This category\nincludes endpoints for retrieving, updating, deleting DNS zone\nand it's associated records.\nThe DNS zone will be created once you purchase new domain\nat Hostinger.","x-displayName":"Zone","x-parent":"DNS"},{"name":"Domain Access Verifier"},{"name":"Domain Access Verifier: Verifications","description":"Manage domain verifications.\nThis category includes endpoints for retrieving active domain\nverifications, including verification status, records, and\nattempt dates.\nDomain verification allows you to prove ownership of domains\nthrough nameserver or TXT record verification methods.","x-displayName":"Verifications","x-parent":"Domain Access Verifier"},{"name":"Mail"},{"name":"Mail: Orders","description":"Manage your mail service orders. This category includes\nendpoints for listing mail orders associated with your\naccount, along with their status, plan, domain, and\nexpiration details.","x-displayName":"Orders","x-parent":"Mail"},{"name":"Mail: Mailboxes","description":"Manage mailboxes of your mail orders. This category includes\nendpoints for listing mailboxes with their status, enabled\nprotocols, attached resource counts, and usage numbers.","x-displayName":"Mailboxes","x-parent":"Mail"},{"name":"Mail: Aliases","description":"Manage aliases of your mailboxes. An alias is an additional email\naddress that delivers incoming messages to an existing mailbox. This\ncategory includes endpoints for creating, listing, and deleting\naliases.","x-displayName":"Aliases","x-parent":"Mail"},{"name":"Mail: Autoreplies","description":"Manage automatic replies of your mailboxes. This category includes\nendpoints for creating, updating, listing, and deleting autoreplies\nsuch as out-of-office messages. A mailbox can have one autoreply.","x-displayName":"Autoreplies","x-parent":"Mail"},{"name":"Mail: Forwarders","description":"Manage forwarders of your mailboxes. This category includes endpoints\nfor creating, listing, and deleting forwarders that redirect incoming\nmessages to another email address. The destination address must\nconfirm the forwarding before it becomes active.","x-displayName":"Forwarders","x-parent":"Mail"},{"name":"Mail: Catchalls","description":"Manage catch-alls of your domains. A catch-all routes all messages\nsent to unknown addresses of a domain to a designated mailbox. The\nmailbox address must confirm the catch-all before it becomes active.","x-displayName":"Catchalls","x-parent":"Mail"},{"name":"Mail: Webhooks","description":"Manage webhooks of your mailboxes. This category includes endpoints\nfor creating webhooks that notify your systems about mailbox events\nsuch as received messages.","x-displayName":"Webhooks","x-parent":"Mail"},{"name":"Mail: API Tokens","description":"Manage API tokens for the\n[Hostinger Email API](https://api.mail.hostinger.com/). Tokens are\nscoped to mailboxes of a mail order and grant access to mailbox\nprovisioning and management through the Email API.","x-displayName":"API Tokens","x-parent":"Mail"},{"name":"Mail: Logs","description":"Inspect activity logs of your mail orders. This category includes\nendpoints for access logs, inbound and outbound delivery logs,\nmailbox action logs, and account action logs.","x-displayName":"Logs","x-parent":"Mail"},{"name":"Hosting"},{"name":"Hosting: Cache","description":"Hosting: Cache","x-displayName":"Cache","x-parent":"Hosting"},{"name":"Hosting: Cron Jobs","description":"Hosting: Cron Jobs","x-displayName":"Cron Jobs","x-parent":"Hosting"},{"name":"Hosting: Datacenters","description":"Access information about available datacenters for hosting\nservices. This category provides details about data center\nlocations and capabilities to help you choose the optimal\nregion for your hosting needs.","x-displayName":"Datacenters","x-parent":"Hosting"},{"name":"Hosting: Databases","description":"Hosting: Databases","x-displayName":"Databases","x-parent":"Hosting"},{"name":"Hosting: Domains","description":"Manage domain-related hosting services and configurations.\nThis category includes endpoints for domain management,\nverification, and domain-specific hosting features.","x-displayName":"Domains","x-parent":"Hosting"},{"name":"Hosting: Files","description":"Hosting: Files","x-displayName":"Files","x-parent":"Hosting"},{"name":"Hosting: NodeJS","description":"Hosting: NodeJS","x-displayName":"NodeJS","x-parent":"Hosting"},{"name":"Hosting: Orders","description":"Manage hosting service orders and subscriptions. This\ncategory provides access to order information, status\ntracking, and order management capabilities for hosting\nservices.","x-displayName":"Orders","x-parent":"Hosting"},{"name":"Hosting: PHP","description":"Hosting: PHP","x-displayName":"PHP","x-parent":"Hosting"},{"name":"Hosting: Redirects","description":"Manage redirects for hosted websites. This category includes\nendpoints for listing, creating, and deleting redirects.","x-displayName":"Redirects","x-parent":"Hosting"},{"name":"Hosting: Websites","description":"Manage hosted websites and web applications. This category\nincludes endpoints for website deployment, configuration,\nmonitoring, and management of hosting resources.","x-displayName":"Websites","x-parent":"Hosting"},{"name":"Agency Hosting"},{"name":"Agency Hosting: Cache","description":"Agency Hosting: Cache","x-displayName":"Cache","x-parent":"Agency Hosting"},{"name":"Agency Hosting: Cron Jobs","description":"Agency Hosting: Cron Jobs","x-displayName":"Cron Jobs","x-parent":"Agency Hosting"},{"name":"Agency Hosting: Databases","description":"Agency Hosting: Databases","x-displayName":"Databases","x-parent":"Agency Hosting"},{"name":"Agency Hosting: Datacenters","description":"Agency Hosting: Datacenters","x-displayName":"Datacenters","x-parent":"Agency Hosting"},{"name":"Agency Hosting: Domains","description":"Agency Hosting: Domains","x-displayName":"Domains","x-parent":"Agency Hosting"},{"name":"Agency Hosting: Files","description":"Agency Hosting: Files","x-displayName":"Files","x-parent":"Agency Hosting"},{"name":"Agency Hosting: Metrics","description":"Agency Hosting: Metrics","x-displayName":"Metrics","x-parent":"Agency Hosting"},{"name":"Agency Hosting: Orders","description":"Agency Hosting: Orders","x-displayName":"Orders","x-parent":"Agency Hosting"},{"name":"Agency Hosting: PHP","description":"Agency Hosting: PHP","x-displayName":"PHP","x-parent":"Agency Hosting"},{"name":"Agency Hosting: Website Setups","description":"Agency Hosting: Website Setups","x-displayName":"Website Setups","x-parent":"Agency Hosting"},{"name":"Agency Hosting: Websites","description":"Agency Hosting: Websites","x-displayName":"Websites","x-parent":"Agency Hosting"},{"name":"Agency Hosting: WordPress","description":"Agency Hosting: WordPress","x-displayName":"WordPress","x-parent":"Agency Hosting"},{"name":"WordPress"},{"name":"WordPress: Installations","description":"Manage WordPress installations on your hosting websites. This\ncategory includes endpoints for installing WordPress, listing\nexisting installations along with their validation status, and\nimporting a WordPress site from previously uploaded archive and\ndatabase files.","x-displayName":"Installations","x-parent":"WordPress"},{"name":"WordPress: Plugins","description":"Manage WordPress plugins on your installations. This category\nincludes endpoints for installing, activating, updating,\nlisting, and deleting plugins.","x-displayName":"Plugins","x-parent":"WordPress"},{"name":"WordPress: Themes","description":"Manage WordPress themes on your installations. This category\nincludes endpoints for installing, activating, updating,\nlisting, and deleting themes.","x-displayName":"Themes","x-parent":"WordPress"},{"name":"WordPress: Object Cache","description":"WordPress: Object Cache","x-displayName":"Object Cache","x-parent":"WordPress"},{"name":"WordPress: LiteSpeed Cache","description":"WordPress: LiteSpeed Cache","x-displayName":"LiteSpeed Cache","x-parent":"WordPress"},{"name":"WordPress: Maintenance","description":"WordPress: Maintenance","x-displayName":"Maintenance","x-parent":"WordPress"},{"name":"WordPress: Login","description":"WordPress: Login","x-displayName":"Login","x-parent":"WordPress"},{"name":"WordPress: AI Tools","description":"WordPress: AI Tools","x-displayName":"AI Tools","x-parent":"WordPress"},{"name":"Horizons"},{"name":"Horizons: Websites","description":"Create and access Hostinger Horizons websites. This category\nincludes endpoints for creating new AI-generated websites from\na text prompt and retrieving links to edit existing websites\nin the Hostinger Horizons interface.","x-displayName":"Websites","x-parent":"Horizons"},{"name":"Reach"},{"name":"Reach: Contacts","description":"Manage your email contacts and contact groups. This category\nincludes endpoints for creating, deleting, and listing\ncontacts, as well as managing contact groups.","x-displayName":"Contacts","x-parent":"Reach"},{"name":"Reach: Contact Fields","description":"Reach: Contact Fields","x-displayName":"Contact Fields","x-parent":"Reach"},{"name":"Reach: Tags","description":"Reach: Tags","x-displayName":"Tags","x-parent":"Reach"},{"name":"Reach: Segments","description":"Filter and segment your email contacts using various\ncriteria. This category includes endpoints for filtering\ncontacts by attributes, tags, and email addresses, as well\nas listing all available segments and retrieving contacts\nthat match specific attribute conditions.","x-displayName":"Segments","x-parent":"Reach"},{"name":"Reach: Automations","description":"Reach: Automations","x-displayName":"Automations","x-parent":"Reach"},{"name":"Reach: Campaigns","description":"Reach: Campaigns","x-displayName":"Campaigns","x-parent":"Reach"},{"name":"Reach: Templates","description":"Reach: Templates","x-displayName":"Templates","x-parent":"Reach"},{"name":"Reach: Forms","description":"Reach: Forms","x-displayName":"Forms","x-parent":"Reach"},{"name":"Reach: Profiles","description":"Reach: Profiles","x-displayName":"Profiles","x-parent":"Reach"},{"name":"VPS"},{"name":"VPS: Actions","description":"Track and review operations performed on your virtual\nmachines. These endpoints provide details about specific\nactions—such as start, stop, or restart—including\ntimestamps and statuses.","x-displayName":"Actions","x-parent":"VPS"},{"name":"VPS: Backups","description":"Safeguard your data by managing backups. You can list\navailable backups or restore a virtual machine from a backup.","x-displayName":"Backups","x-parent":"VPS"},{"name":"VPS: Data centers","description":"Access information on available data centers, including\nlocation details, so you can choose the optimal region for\ndeploying your virtual machines.","x-displayName":"Data centers","x-parent":"VPS"},{"name":"VPS: Docker Manager","description":"Manage Docker Compose projects directly on your VPS\ninstances. This feature is only available for VPS instances\nusing Docker OS templates and is currently experimental -\nbreaking changes may occur in future updates.\nIt enables you to programmatically deploy projects from\ndocker-compose.yml files by providing either a URL (including\nGitHub repositories) or the compose file contents directly.\nControl project lifecycle (start/stop/restart/update/delete)\nand retrieve runtime information including container lists,\nproject details, and aggregated logs.\nAll operations are scoped to a specific virtual machine for\nmulti-tenant management.","x-displayName":"Docker Manager","x-parent":"VPS"},{"name":"VPS: PTR records","description":"Manage reverse DNS settings by creating or deleting PTR\nrecords for your virtual machines, ensuring that IP addresses\ncorrectly resolve to hostnames.","x-displayName":"PTR records","x-parent":"VPS"},{"name":"VPS: Firewall","description":"Enhance network security with endpoints for creating,\nactivating, deactivating, syncing, updating, and deleting\nfirewalls and firewall rules for your virtual machines.\nThis firewall applies rules at the network level, so it will\ntake precedence over the virtual machine's internal firewall.\n\n**Access to firewall requires having at least one virtual machine.**","x-displayName":"Firewall","x-parent":"VPS"},{"name":"VPS: Malware scanner","description":"Monitor your virtual machines' security using the Monarx\nmalware scanner. Retrieve scan metrics or install/uninstall\nthe scanner to help protect against malware threats.","x-displayName":"Malware scanner","x-parent":"VPS"},{"name":"VPS: OS Templates","description":"Retrieve details of operating system templates or list all\navailable templates to choose the right configuration when\ndeploying or recreating virtual machines.","x-displayName":"OS Templates","x-parent":"VPS"},{"name":"VPS: Post-install scripts","description":"This category allows you to create, update, delete, and\nretrieve scripts that can be used for automated tasks after\nthe operating system installation. Use case includes setting\nup software, configuring settings, or running custom commands.","x-displayName":"Post-install scripts","x-parent":"VPS"},{"name":"VPS: Public Keys","description":"Manage SSH keys for secure access. This category covers\nadding new public keys, attaching them to virtual machines,\nretrieving key lists, and deleting keys.","x-displayName":"Public Keys","x-parent":"VPS"},{"name":"VPS: Recovery","description":"Initiate or stop recovery mode to perform system rescue\noperations. This category enables you to boot a virtual\nmachine into a state suitable for repairing file systems\nor recovering data.","x-displayName":"Recovery","x-parent":"VPS"},{"name":"VPS: Snapshots","description":"Create, restore, or delete snapshots that capture the state\nof your virtual machines at a given point, allowing you to\nquickly recover or test changes without affecting current\noperations.","x-displayName":"Snapshots","x-parent":"VPS"},{"name":"VPS: Virtual machine","description":"Core virtual machine management functionality. Endpoints in\nthis category let you retrieve machine details, configure\nsettings (hostname, nameservers, passwords), and perform\noperations like start, stop, restart, or recreate.","x-displayName":"Virtual machine","x-parent":"VPS"},{"name":"Ecommerce"},{"name":"Ecommerce: Stores","description":"Manage your online stores. This category includes endpoints\nfor listing and creating stores associated with your account,\nand deleting stores you no longer need.","x-displayName":"Stores","x-parent":"Ecommerce"},{"name":"Ecommerce: Sales channels","description":"Ecommerce: Sales channels","x-displayName":"Sales channels","x-parent":"Ecommerce"},{"name":"Ecommerce: Products","description":"Manage products in your online store. This category includes\nendpoints for creating physical and digital products with\npricing and optional descriptions.","x-displayName":"Products","x-parent":"Ecommerce"},{"name":"Ecommerce: Product variants","description":"Ecommerce: Product variants","x-displayName":"Product variants","x-parent":"Ecommerce"},{"name":"Ecommerce: Discounts","description":"Ecommerce: Discounts","x-displayName":"Discounts","x-parent":"Ecommerce"},{"name":"Ecommerce: Orders","description":"Ecommerce: Orders","x-displayName":"Orders","x-parent":"Ecommerce"},{"name":"Ecommerce: Shipping","description":"Configure shipping options for your online store. This\ncategory includes endpoints for setting the flat-rate\nshipping price applied to customer orders.","x-displayName":"Shipping","x-parent":"Ecommerce"},{"name":"Ecommerce: Payments","description":"Manage payment methods for your online store. This category\nincludes endpoints for enabling payment options such as manual\n(cash on delivery) payment at checkout.","x-displayName":"Payments","x-parent":"Ecommerce"},{"name":"Ecommerce: Miscellaneous","description":"Ecommerce: Miscellaneous","x-displayName":"Miscellaneous","x-parent":"Ecommerce"}],"x-tagGroups":[{"name":"Billing","tags":["Billing: Catalog","Billing: Orders","Billing: Payment methods","Billing: Subscriptions"]},{"name":"Domains","tags":["Domains: Availability","Domains: Forwarding","Domains: Move","Domains: Portfolio","Domains: Transfer","Domains: WHOIS"]},{"name":"DNS","tags":["DNS: Snapshot","DNS: Zone"]},{"name":"Domain Access Verifier","tags":["Domain Access Verifier: Verifications"]},{"name":"Mail","tags":["Mail: Orders","Mail: Mailboxes","Mail: Aliases","Mail: Autoreplies","Mail: Forwarders","Mail: Catchalls","Mail: Webhooks","Mail: API Tokens","Mail: Logs"]},{"name":"Hosting","tags":["Hosting: Cache","Hosting: Cron Jobs","Hosting: Datacenters","Hosting: Databases","Hosting: Domains","Hosting: Files","Hosting: NodeJS","Hosting: Orders","Hosting: PHP","Hosting: Redirects","Hosting: Websites"]},{"name":"Agency Hosting","tags":["Agency Hosting: Cache","Agency Hosting: Cron Jobs","Agency Hosting: Databases","Agency Hosting: Datacenters","Agency Hosting: Domains","Agency Hosting: Files","Agency Hosting: Metrics","Agency Hosting: Orders","Agency Hosting: PHP","Agency Hosting: Website Setups","Agency Hosting: Websites","Agency Hosting: WordPress"]},{"name":"WordPress","tags":["WordPress: Installations","WordPress: Plugins","WordPress: Themes","WordPress: Object Cache","WordPress: LiteSpeed Cache","WordPress: Maintenance","WordPress: Login","WordPress: AI Tools"]},{"name":"Horizons","tags":["Horizons: Websites"]},{"name":"Reach","tags":["Reach: Contacts","Reach: Contact Fields","Reach: Tags","Reach: Segments","Reach: Automations","Reach: Campaigns","Reach: Templates","Reach: Forms","Reach: Profiles"]},{"name":"VPS","tags":["VPS: Actions","VPS: Backups","VPS: Data centers","VPS: Docker Manager","VPS: PTR records","VPS: Firewall","VPS: Malware scanner","VPS: OS Templates","VPS: Post-install scripts","VPS: Public Keys","VPS: Recovery","VPS: Snapshots","VPS: Virtual machine"]},{"name":"Ecommerce","tags":["Ecommerce: Stores","Ecommerce: Sales channels","Ecommerce: Products","Ecommerce: Product variants","Ecommerce: Discounts","Ecommerce: Orders","Ecommerce: Shipping","Ecommerce: Payments","Ecommerce: Miscellaneous"]},{"name":"Miscellaneous","tags":["Models"]}]}})