Create an order

Create an order using public product slugs, public IDs, and customer-facing fields. Send a caller-generated attemptKey for retry-safe order creation: generate a fresh value per logical checkout/order attempt, then reuse the same value only when retrying that same request after a timeout or lost response. Repeats…

Read full description Hide full description

Create an order using public product slugs, public IDs, and customer-facing fields. Send a caller-generated attemptKey for retry-safe order creation: generate a fresh value per logical checkout/order attempt, then reuse the same value only when retrying that same request after a timeout or lost response. Repeats with the same key can return the existing order/invoice for the previous attempt within the duplicate-prevention window (currently one hour). Authenticated API callers normally omit clientData; the server uses the stored account profile. Use the write:orders scope for least-privilege API keys; broader write:billing, write:services, and write:all keys remain compatible. transfer:domains is for outgoing transfer/EPP-code actions and is not sufficient by itself to place a transfer-in order. Use clientData only to override or provide missing account/profile fields. Use item-level registrantContact when a domain should be registered to a different person or organisation than the account owner. For regular fixed-cycle VPS orders, first call GET /api/v2/products/vps and send one of its data[].slug values as items[].productSlug; do not use this endpoint for pay-as-you-go Cloud VPS creation. PAYG Cloud VPS deployment uses POST /api/v2/vps/payg/deployments. For shared hosting orders, first call GET /api/v2/products/shared-hosting, send one of its data[].slug values as items[].productSlug, and set items[].primaryDomain to the domain the hosting account should use. For domain registration, first call GET /api/v2/products/domains/{tld} and GET /api/v2/domains/availability?name=example.se; copy required item-level values such as acceptedTerms, eppCode, premium, requiresRegistrarFeeAcceptance, nameservers, or copyExistingDns into the order item. If the caller's stored profile is missing a registry-required field, either update PATCH /api/v2/me before ordering or include a partial clientData override. Payable orders return an invoice reference and may include a checkout URL. Payment preferences are checkout hints for the invoice created by the order. Use card, swish, bankgiro, sepa, or invoice when no specific payment flow should start. Account credit is applied after invoice creation through the invoice credit action.

Billing & Orders Orders

Authentication

Required API scope: write:orders

Use Authorization: Bearer <token> for API keys. Dashboard sessions may also use hostup_session.

Context

Headers

Accept Example
Content-Type Example

Body

required
application/json
items array
clientData object

Optional for authenticated API-key/session orders. Use only to override or provide missing profile fields returned by availability/validation requirements. Required for unauthenticated signup orders.

paymentMethod string · enum · Example: card

Canonical checkout preference for the invoice created by the order. Use `card` for card-backed hosted checkout flows, `swish` for Swish, `bankgiro` for Swedish SEK invoice payment, `sepa` for EUR SEPA bank transfer, or `invoice` to create the invoice without starting a specific payment flow. Provider names are not public v2 method values. Account credit is applied after invoice creation through the invoice credit action.

card
swish
bankgiro
sepa
invoice
attemptKey string · Example: order_attempt_01hxa3b4c5d6e7f8g9h0j1k2m3

Optional caller-generated idempotency key for retry-safe order creation. Generate a fresh value for each logical order/checkout attempt and reuse that exact value only when retrying the same request after a timeout or lost response. If the previous attempt created an order, repeats with the same key within the duplicate-prevention window (currently one hour) return that existing order/invoice instead of creating another order. Do not reuse a key for a different cart.

Responses

200 Idempotent retry returned the existing order or account-only result.

No response body

201 Order created.
id string · Example: ord_01hxa3b4c5d6e7f8g9h0j1k2m3
number string · Example: O-HXA3B4C5
status string · enum · Example: pending
pending
active
completed
cancelled
failed
type string · enum · Example: new
new
renew
upgrade
transfer
invoiceId stringnull · Example: inv_01hxa3b4c5d6e7f8g9h0j1k2m3
checkoutUrl stringnull · Example: https://cloud.hostup.se/billing?invoice=202600001

Compatibility alias used by older clients. New integrations should read `invoice.paymentUrl` when `invoice` is present.

client object
client.id stringnull · Example: null
client.email stringnull · Example: [email protected]
client.firstName stringnull · Example: Anna
client.lastName stringnull · Example: Svensson
client.companyName stringnull · Example: null
billing object
billing.amount number required · Example: 199
billing.currencyCode string required · Example: SEK
billing.billingCycle stringnull · enum required · Example: annually

Canonical billing cycle. VPS services with `isPayg: true` still report `monthly` for summary display; use `isPayg` to distinguish PAYG Cloud VPS from fixed-cycle VPS.

monthly
quarterly
semiannually
annually
biennially
triennially
free
billing.isPayg boolean required · Example: false

For VPS service/order billing, true means pay-as-you-go Cloud VPS and false means fixed-cycle/prepaid VPS. Non-VPS resources normally return false.

billing.periodYears integernull · Example: 1
invoice object | null
invoice.id string required · Example: inv_01hxa3b4c5d6e7f8g9h0j1k2m3
invoice.number stringnull required · Example: 202600001
invoice.amount number required · Example: 159
invoice.currencyCode string required · Example: SEK
invoice.dueAt stringnull required · Example: 2026-05-11T23:59:59.000Z
invoice.status string · enum required · Example: unpaid
paid
unpaid
partially_paid
draft
cancelled
refunded
invoice.paymentUrl stringnull required · Example: /billing?invoice=202600001
invoice.totals object required
invoice.dates object required
paymentStatus object
paymentStatus.status string · enum · Example: unpaid
paid
unpaid
credit_note
pending
unknown
paymentStatus.reason stringnull · Example: Invoice is unpaid.
actions object
actions.canRetry object
actions.canRetry.allowed boolean required · Example: true
actions.canRetry.reason stringnull required · Example: null
actions.canRetry.code stringnull · Example: pending_order

Machine-readable reason code when an action is blocked.

actions.canCancel object
actions.canCancel.allowed boolean required · Example: true
actions.canCancel.reason stringnull required · Example: null
actions.canCancel.code stringnull · Example: pending_order

Machine-readable reason code when an action is blocked.

domains array<object>
hosting array<object>
addons array<object>
upgrades array<object>
invoiceLookupPending boolean · Example: false
createdAt stringnull
contractAcceptedAt stringnull · Example: null
notes stringnull · Example: null
referenceNumber stringnull · Example: null
400 Invalid request. The response body is an RFC 7807 Problem Details document.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on `detail`.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when `code` is `invalid_request`.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
401 Unauthorized. Authentication is required.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on `detail`.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when `code` is `invalid_request`.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
403 Forbidden. The caller lacks a required scope or does not own the resource.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on `detail`.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when `code` is `invalid_request`.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
404 Not found. The resource does not exist or is not owned by the caller.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on `detail`.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when `code` is `invalid_request`.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
429 Rate limited. Retry after the limit resets. 429 responses include `Retry-After` seconds plus `X-RateLimit-*` headers.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on `detail`.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when `code` is `invalid_request`.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
500 Internal error. Retry later or contact support if the issue persists.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on `detail`.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when `code` is `invalid_request`.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
POST https://cloud.hostup.se/api/v2/orders
For AI assistants
View as Markdown
cURL
curl -X POST "https://cloud.hostup.se/api/v2/orders" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "paymentMethod": "bankgiro",
    "items": [
      {
        "type": "domain",
        "action": "register",
        "domainName": "example.se",
        "years": 1,
        "acceptedTerms": [
          "se_registration_terms"
        ]
      }
    ]
  }'
Response
{
  "id": "ord_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "number": "2096179503",
  "status": "pending",
  "type": "new",
  "invoiceId": "inv_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "checkoutUrl": "https://cloud.hostup.se/billing?invoice=202600001",
  "client": {
    "id": "client_01hxa3b4c5d6e7f8g9h0j1k2m3",
    "email": null,
    "firstName": "Example",
    "lastName": "Customer",
    "companyName": "Example Company"
  },
  "billing": {
    "amount": 98.75,
    "currencyCode": "SEK",
    "billingCycle": null,
    "isPayg": false
  },
  "invoice": {
    "id": "inv_01hxa3b4c5d6e7f8g9h0j1k2m3",
    "number": "202600001",
    "amount": 98.75,
    "currencyCode": "SEK",
    "dueAt": "2026-05-11T23:59:59.000Z",
    "status": "unpaid",
    "paymentUrl": "/billing?invoice=202600001",
    "totals": {
      "currencyCode": "SEK",
      "total": 98.75,
      "amountPaid": 0,
      "outstanding": 98.75
    },
    "dates": {
      "dueAt": "2026-05-11T23:59:59.000Z"
    }
  },
  "paymentStatus": {
    "status": "unpaid",
    "reason": "Invoice has not been paid yet."
  },
  "actions": {
    "canRetry": {
      "allowed": false,
      "reason": "The order invoice must be paid before retrying."
    },
    "canCancel": {
      "allowed": true,
      "reason": null
    }
  },
  "domains": [
    {
      "name": "example.com",
      "tld": "se",
      "amount": 79,
      "currencyCode": "SEK"
    }
  ],
  "hosting": [
    {
      "name": "Example Web Hosting",
      "amount": 150,
      "currencyCode": "SEK"
    }
  ],
  "addons": [],
  "upgrades": [],
  "invoiceLookupPending": false,
  "createdAt": "2026-04-27T12:00:00.000Z",
  "contractAcceptedAt": null,
  "notes": null,
  "referenceNumber": null,
  "pendingManualProcessing": false,
  "enableAffiliateTracking": true
}
Request Body Register .se domain with stored profile
{
  "paymentMethod": "bankgiro",
  "items": [
    {
      "type": "domain",
      "action": "register",
      "domainName": "example.se",
      "years": 1,
      "acceptedTerms": [
        "se_registration_terms"
      ]
    }
  ]
}