Skip to content
Coritan Docs

Set up products and pricing

Create the products your customers buy, link each one to a Coritan product, and set, change or retire a price for each billing cycle.

View as Markdown

Products are what your customers can buy, and plans are their prices. Create a product for each thing you sell, link it to a Coritan product when Coritan should set up the service, then add at least one plan so customers can order it. Products is one of the two pages of Catalogue. The other, Software, lists the games and applications customers can install on the servers they order, as Browse the software your customers can install describes.

  • Any member can see products and their plans. Creating and changing them takes the Owner or Admin role.
  • For a linked product, look at the Coritan product you want to resell and its list price for each billing cycle. Your plans cannot be cheaper than they cost you, as What the hosting costs you explains.
Platform product
Coritan sets up the service, such as a server on App Deployment or a Cloud Compute instance, when a customer orders, and charges your organization below its list price for it: by use for compute on the Usage billing basis, and the wholesale price each time the customer pays for it otherwise.
Standalone
You fulfil it yourself, and Coritan sets nothing up. Use it for a service you provide outside Coritan, such as setup work. Priority Support is one of these on the storefronts that sell it. Coritan creates it and sets its prices again on each restart, and Priority Support explains what it gives a customer.
  1. In the dashboard, open the organization, then Catalogue, then Products.
  2. Type in Search name, slug or description, or choose Available or Hidden in Any status, and Platform product or Standalone in Any kind.
  3. Select a column heading to sort the list by it.
  4. Select a product to open its page.

Each row shows the product's name and description, its Kind (for a platform product, with the Coritan product it sets up and that product's list price, such as CX4 (App Deployment), $6.99/mo), its Status, how many Plans on sale it has, and its Order on the storefront. A product with no plan on sale shows None, and customers cannot order it. The search, the filters and the sort stay in the page's address, so a reload or a link you share opens the list as you left it, and All products on a product's page takes you back to it. When nothing matches, Reset filters shows every product again.

  1. On Products, select New product….
  2. Enter a Name and check the Slug, which your storefront uses in the product's address. The slug follows the name until you change it. It takes lowercase letters, digits and hyphens, and cannot be changed later.
  3. Add a Description if you like.
  4. Under Kind, choose Platform product and then the one it sets up in the Platform product list, or choose Standalone.
  5. Select Create product.

The Platform product list holds Coritan's catalogue, with the free plan when Coritan lets your organization sell it. It is grouped by product, such as App Deployment, Cloud Compute or Mail Hosting, and each entry shows its list price, monthly where it has one. Once you choose one, the hint under the list names the product it belongs to and its list price.

The list has pay as you go Object Storage, which your customers pay for by use at rates you set, as Sell Object Storage explains. It leaves out every other product Coritan bills by use.

The product's page opens with New plan… as its first button: a product without a plan on sale cannot be ordered.

Pay as you go Object Storage is the one product billed by use that your organization can resell. Your customers pay your rates for what they store and for each request, and you pay Coritan its wholesale rates for the same use. A product linked to it needs its rates before it exists.

  1. On Products, select New product… and choose Platform product.
  2. In the Platform product list, choose Object Storage. The dialog shows the rates and the free amounts, starting from Coritan's list rates in the currency your invoices are made in.
  3. Set the rate for storage (per GB-month), for Class A operations (per million) and for Class B operations (per million). A rate takes up to four decimal places. The hint under each one names the least it may be, the wholesale rate Coritan charges you, and Coritan's list rate.
  4. Set Free storage, Free Class A operations and Free Class B operations if you want your customers to have some each month. They start at 0.
  5. Select Create product, then add a plan. A monthly plan with a price of 0 charges nothing at checkout, and the customer pays for use only. A plan with a price adds that fee to every renewal.

A rate cannot be below the wholesale rate: Coritan's list rate less the wholesale discount, in your invoice currency. A lower one is refused under its field with the least it may be, such as Enter a rate of at least €0.0075, the wholesale rate Coritan charges you for it.

The product's page has an Object Storage rates card. Its table shows Your rate, At least (the wholesale rate), Coritan lists and Free for each customer each month for each kind of use. Owners and admins select Edit rates…, change the six fields and select Save rates. Customers' use is rated at the new rates from the next hour. Use rated before keeps the rate it had.

A card that says These are Coritan's list rates belongs to a product with no rates of its own. Customers pay Coritan's list rates until you save yours. A card that says Your rates are in another currency than your invoices means you changed your organization's currency after you saved the rates. Use is not added to an invoice until you save the rates again in the new currency.

  • Every hour, Coritan measures each customer's buckets and counts their requests, and rates the use at your rates after the customer's free amounts. The free amounts belong to the customer each calendar month, shared by the customer's services of this product. Your own account's free amounts are never used.
  • On each renewal invoice, the customer's use is one line for storage, one for Class A operations and one for Class B operations, each with its quantity and your price. A kind of use that came to less than half a cent waits for the next invoice, and a kind the free amounts covered has no line. An invoice with no line settles at 0.
  • When a service ends, one more invoice carries what it still owes, if any kind of use came to a cent. It falls due after your payment terms.
  • The lines are in your invoice currency, and tax is added to them as it is to every line.

Coritan charges its wholesale rate for all of your customers' use, the free part included, when the customer's invoice is paid. Each charge covers one service and one kind of use, and it is deducted from your next hosting payout as the other wholesale charges are. What no invoice carries, such as use under a cent when a service ends, is charged when the service ends. Because the free amounts are charged at the wholesale rate, they cost you. Organizations that Coritan runs are not charged.

Coritan never bills your own account for your customers' storage. Your own Object Storage, if you have any, is rated at the platform's rates and your own free amounts, and stays on your platform invoice.

A storefront can sell three add-ons for a server: Extra CPU, Automatic Server Backups and Server Management. A customer buys one from the server's page in your storefront, or at checkout when they order the server, and the store invoices it on your invoice, at your price, with your tax and in your currency. Add-ons lists the routes the server's page calls, and Offer add-ons with a server lists the ones checkout calls.

Each add-on is a platform product that Coritan creates on the storefronts that sell it, linked to the matching Coritan add-on. It is not listed beside the plans: the catalogue leaves it out, and the generic order refuses it with Order add-ons from the server's page.

Add-on What a customer gets How it is priced
Extra CPU One more vCPU for each unit, up to 8 on a server. One price for each unit and billing period.
Automatic Server Backups A snapshot every day, keeping the newest 7. One on a server. One price for each billing period.
Server Management Your team installs and sets up plugins, mods and modpacks when the customer asks by ticket. One on a server. Sold for Minecraft servers only (Choose the games an add-on is sold for). One price for each billing period.

An add-on has a plan for each billing period your servers use, weekly included, because it renews on the server's cycle. A paid server whose billing period has no plan for an add-on does not offer it, and the order answers no_price_for_cycle.

A free server takes add-ons too. It has no renewal date to line up with, so each add-on is billed on its own. The customer chooses a monthly, quarterly or annual period from the plans you set, the first invoice charges the full price for that period, and the add-on renews on its own date. Add a plan for every period you want a free server's customers to choose.

Your checkout can show these add-ons beside a server plan, and Priority Support if you sell it. GET /storefront/server-addons lists the add-ons that fit the plan the customer looks at, with your prices, and the customer picks them in the same order as the server. An add-on with no price above 0 is not offered. Offer add-ons with a server has the fields.

Choose the games an add-on is sold for

Section titled Choose the games an add-on is sold for

An add-on's product has a metadata.addon block that Coritan copies from its own add-on when it creates the product. Its games list names the games the add-on is sold for, as the game of a server plan names them, such as ["minecraft"]. Server Management starts with ["minecraft"], so a plan for another game does not offer it. An add-on with no games list is sold for every game, and a plan with no game takes every add-on. The server's page and the checkout both follow the list.

When a customer pays, the add-on starts on the server. What the first invoice charges depends on where the add-on was bought:

  • On the page of a paid server that already runs: the invoice charges only the rest of the server's current billing period, so every renewal after that falls on the server's own date.
  • At checkout, with a new server: the server starts when the invoice is paid, so the invoice charges one full period of the server's billing period, and the add-on renews with the server.
  • On a free server: the add-on is billed on its own. The invoice charges one full period of the cycle the customer chose, and the add-on renews on its own date.

Cancelling the add-on, or the server ending, takes the effect off. Coritan deducts its wholesale price for each add-on line from your next hosting payout, as Other plans explains.

The heading shows the product's name and its status, its slug, its kind, when it was created and its number. The status is Available or Hidden, or No plan on sale while the product is available but customers cannot order it. While the product has no plan on sale, the heading's first button is New plan… and a note under it says Customers cannot order it; a hidden product's note says Hidden from the storefront. View services opens the services of this product.

Plans
Each plan with its Cycle and Price, with any setup fee under it. For a linked product, the card adds what Coritan charges for the hosting (Wholesale) and the Margin your price leaves.
Object Storage rates
On a product linked to pay as you go Object Storage, the rates your customers pay and what each gets free, as Sell Object Storage describes.
Details
The description, the Status, the Kind, the Platform product a linked one sets up and its List price, the Sort order and when it was Created.
  1. Open the product and select New plan…: in the heading while the product has no plan on sale, and on the Plans card once it has one.
  2. Enter a Plan name, such as Monthly.
  3. Choose a Billing cycle: monthly, quarterly, every 6 months, yearly, biennially, one time or hourly. A one time plan is paid once: the order has no next due date and is never invoiced again.
  4. Choose the Currency, one of the currencies your customers can pay in. It starts on your organization's own.
  5. Enter the Price and, if you charge one, a Setup fee, which is charged once with the first invoice. For a linked product, the hint under Price names the least it may be for that cycle and currency, such as At least €17.99, the wholesale price Coritan charges for this hosting., and the margin once you type a price. For a compute plan it names the idle cost, such as Enter a price of at least €5.68, what this plan costs sitting idle all month. The hint under Setup fee names its least when the hosting has a setup fee.
  6. Select Add plan.

The plan appears on the Plans card, and the product can be ordered on your storefront.

A price or setup fee cannot be below zero. For a linked product, the price must be at least the wholesale price for the plan's billing cycle, or for a compute plan its Idle figure when that is higher, and the setup fee at least the wholesale setup fee. A lower one is refused under its field with the least it may be, such as Enter a price of at least €17.99, the wholesale price Coritan charges for this hosting., and the plan is not added.

  1. On the Plans card, open the plan's actions menu and choose Edit plan….
  2. Change the Plan name, Billing cycle, Currency, Price or Setup fee. For a linked plan, the hint under Price says what Coritan charges for the hosting and the margin your price leaves, such as Coritan charges €17.99 for the hosting, so the margin is −€2.00 (−13%). For a compute plan it names its idle cost.
  3. Select Save changes.

Services already on the plan keep what they pay, and a new price applies to orders from then on. A new price or setup fee must clear the floor, and so must both when the plan moves to another cycle or currency.

  1. In the plan's actions menu, choose Retire plan….
  2. Select Retire plan to confirm.

Customers can no longer order the plan. Services already on it keep it, and keep paying what they pay now. When it was the last plan on sale, the product cannot be ordered until you add a plan or restore this one.

The plan stays on the card, marked Retired, with the plans on sale, and Restore plan in its menu puts it back on sale at once, today or months later. A plan put back on sale must clear its floor as a new one does. Your storefront and Order service… list only the plans on sale, so customers never see a retired one.

Coritan sells your organization the hosting it resells below its list price, by the wholesale discount. The discount is a setting, so this page does not type it: The reseller program's terms show it, and so does Settings, then General, as Hosting you resell. You set any price at or above what a plan costs you, and the difference is yours.

A compute plan is a Cloud Compute server or a game server or database of App Deployment. Its size is fixed, so its worst month is known, and what it costs you in a given month depends on what the server does. The Plans card shows three figures for a month at your wholesale rates, in the plan's currency:

Idle
Memory and disk, with the server on all month and no CPU used.
Typical
Idle, plus CPU at 10% of the server's vCPUs.
Most
Idle, plus every vCPU busy all month.

The price of a compute plan can be no lower than its Idle figure. The hint under Price says so, such as Enter a price of at least $3.07, what this plan costs sitting idle all month., and a lower price is refused under its field. A plan whose price was already lower, from before this rule, keeps selling at its price and is marked Below idle cost. You can rename it or retire it, and a new price must clear the floor. Coritan's own organizations have no floor.

On the Usage billing basis, Coritan charges you the wholesale rate for each server's use as it runs, and nothing for the plan itself, so Wholesale is not shown. On the Plans basis the card shows both, because Coritan still charges the plan's wholesale price each time a customer's invoice is paid, and the floor is the higher of the two. Choose how you pay for compute compares them with your own numbers.

The Margin of a monthly plan on the Usage basis is its price less Typical, marked at typical use.

These figures use the rate card and the default wholesale discount as they stand on Oct 11, 2026. The wholesale rates are $0.0018 per GiB-hour of memory, $0.009 per vCPU-hour of CPU used and $0.00003 per GB-hour of disk, in a month of 730 hours. A CX2 server has 2 vCPUs, 2 GiB of memory and 20 GB of disk, and an RX-2 server has the same with 40 GB. The margin is the price less the cost less a platform cut of 3.5%, the rate of a month under $2,000. Your own rates are in the program terms.

Say you sell CX2 at $5.99 and RX-2 at $6.99.

Customer's server Cost to you each month Your margin on the price
CX2, always on, CPU at 2% $3.33 $2.45 on a $5.99 plan
CX2, always on, CPU at 5% $3.72 $2.06 on a $5.99 plan
CX2, always on, CPU at 25% $6.35 −$0.57 on a $5.99 plan
CX2, on a quarter of the time, CPU at 25% while on $1.92 $3.86 on a $5.99 plan
CX2, stopped all month $0.44 $5.34 on a $5.99 plan
RX-2, always on, CPU at 2% $3.77 $2.98 on a $6.99 plan
RX-2, always on, CPU at 10% $4.82 $1.93 on a $6.99 plan
RX-2, stopped all month $0.88 $5.87 on a $6.99 plan

The Idle, Typical and Most figures of the same plans are $3.07, $4.38 and $16.21 for CX2, and $3.50, $4.82 and $16.64 for RX-2. A stopped server still pays for its disk. A server that is asleep and woken by players costs you less than one that runs all month, and a free plan costs you nothing.

  • The wholesale price of a plan is the list price of the linked Coritan product for the same billing cycle, with any priced option the product fixes, less the wholesale discount. The setup fee works the same way from the Coritan product's setup fee.
  • In another currency, the wholesale price is converted from Coritan's list price at the market exchange rate of the day.
  • It is charged each time your customer's invoice for the service is paid, for the period the invoice covers, however it was paid: by card, with account credit, or marked paid by your staff. An invoice for a setup fee is charged at the setup fee's wholesale price. A free order that settles on its own is charged too, since the server runs either way.
  • Coritan deducts the charges from your organization's next hosting payout. Payouts shows the deduction.
  • Object Storage has no plan price to charge against. Coritan charges its wholesale rates for the use itself, as Sell Object Storage explains.
  • Coupons come out of your margin. A coupon can take what your customer pays below what the plan costs you; Coritan still charges for the period.
  • The Plans card shows each plan's Wholesale price and its Margin. A plan priced below the wholesale price, from before this rule or because the list price rose, keeps selling at its price and is marked Below wholesale. You can rename it or retire it, and a new price must clear the floor.
  • A plan with no floor says why under Wholesale: No list price when its billing cycle has no Coritan list price, No exchange rate when its currency cannot be converted today, and Not charged when Coritan charges nothing for it. On the first plan that shows each one, select it for an explanation. With no list price, Coritan charges nothing for the hosting and takes only the platform cut on what your customers pay. With no exchange rate, the price is not checked, and Coritan still charges the wholesale price in US dollars.
  1. Open the product and select Edit product….
  2. Change the Name, Description or Sort order. Lower numbers come first on the storefront.
  3. Clear Available to order to hide the product. A hidden product keeps its services, and they renew as before.
  4. Select Save changes.

Owners and admins can also hide a product, or make it available again, with the switch beside its Status under Details. The kind and the linked product cannot be changed after creation.

Ask for details when a customer orders

Section titled Ask for details when a customer orders

A Standalone product can ask the customer for details with each order, such as their name in your game, so you know whom to give it to. Declare the fields in the product's config_schema with the API, on POST /products or PATCH /products/{product_id} (With the API). The dashboard does not show or change the form.

JSON
{
  "fields": [
    {
      "key": "minecraft_name",
      "label": "Minecraft name",
      "required": true,
      "max_length": 16,
      "pattern": "[A-Za-z0-9_]{3,16}"
    }
  ]
}

Each field takes these settings, and no others:

key
Where the service keeps the answer in its config. It starts with a lowercase letter and holds lowercase letters, digits and underscores, up to 64 characters. Each key appears once, and a key Coritan uses itself, such as termination_date or delivery, is refused.
label
The field's name, up to 100 characters. Every message about the field uses it.
required
true refuses an order without an answer. It defaults to false.
max_length
The longest answer, from 1 to 1000 characters, counted after spaces are trimmed from both ends. A field with a pattern takes at most 128 characters.
pattern
A regular expression the whole answer must match, up to 200 characters. So that every check finishes quickly, it cannot repeat something that itself repeats, such as (a+)+, repeat a group of alternatives, or refer back to a group, such as (a)\1, and it holds at most three repeats of variable length.
options
The only answers allowed: a list of 1 to 100 choices, each up to 200 characters.

A form holds at most 20 fields. Your storefront finds it in the product's config_schema in the Storefront API catalogue, asks the customer for each field, and sends the answers as the order's config.

When the order arrives, we trim each answer, keep only the declared keys, leave out an optional field with no answer, and store the rest on the service. A number is kept as text. You read the answers in the service's config, and the service events your webhooks receive carry them. A Standalone product without fields stores the order's config as it arrives, except the keys Coritan writes itself, such as termination_date and delivery, and keys that start with _, which we drop.

An answer that breaks the form refuses the order with 422 before any invoice is made, and the message names the field by its label:

JSON
{"detail": {"errors": ["Minecraft name is not in the expected format"]}}

The messages are <label> is required, <label> can be at most <n> characters, <label> is not in the expected format, <label> must be one of: <choices> and <label> must be text. Show the message to the customer beside the field.

Important

POST /products and PATCH /products/{product_id} check the form when you save it, and refuse one that breaks the rules above with 422 and a message that names the field, such as Minecraft name: the pattern is not a valid regular expression (…). A form saved before we checked it stops every order of the product with 422 and This product cannot be ordered until the seller fixes its order form. Correct it with PATCH /products/{product_id}.

Product limit reached
Your organization holds as many products as Coritan allows its tier, and New product… is turned off. The API answers Product limit reached (50/50). Hide or reuse a product, or ask support to raise the limit.
Product slug already exists
Another of your products uses the slug. Choose another.
Your organization cannot sell the free plan. Contact support to have it switched on.
Coritan's free plan is only offered to organizations Coritan has allowed to sell it.
Platform product not found
The linked product id does not exist. List the products you can link with GET /platform-products.
A brand cannot sell this product billed by use yet. Only pay as you go Object Storage can be resold.
The linked product id names a product Coritan bills by use that is not pay as you go Object Storage. Link another product.
Object Storage needs rates before a brand can sell it. …
The linked product is pay as you go Object Storage and the request has no object_storage rates. Create the product from Products in the dashboard, or send object_storage with POST /products. The admin console's product form sends none, so create the product from the organization's own Products page.
A brand sells Object Storage on the pay as you go plan only. The plans with a fixed size are no longer sold.
The linked product id names an Object Storage plan with a fixed size. Link the pay as you go plan.
The storage rate cannot be below …
A rate is under the wholesale rate, which the message names with your invoice currency. Raise it to at least that figure.
Enter a price of at least … or This plan's price cannot be below its wholesale price of …
The price or setup fee is under what Coritan charges for the hosting. Raise it to at least the wholesale price in the message.
This product cannot be ordered until the seller fixes its order form.
The product's config_schema has a field that breaks the rules in Ask for details when a customer orders, so every order of it is refused. Correct the form with PATCH /products/{product_id}.

List the Coritan products you can link to. The list is Coritan's active catalogue, with the free plan when Coritan lets your organization sell it:

Shell
curl https://api.coritan.com/api/v1/orgs/acme/platform-products \
  -H "Authorization: Bearer $CORITAN_TOKEN"

Create a product with name, slug, description, product_type (platform_linked or custom_standalone, which is the default in the API), linked_product_id for a linked product, and config_schema for a standalone product's order form:

Shell
curl -X POST https://api.coritan.com/api/v1/orgs/acme/products \
  -H "Authorization: Bearer $CORITAN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Pro Container", "slug": "pro-container", "product_type": "platform_linked", "linked_product_id": 17}'

Give a standalone product its order form, or change it, with PATCH. The config_schema you send replaces the product's whole schema, and null removes the form:

Shell
curl -X PATCH https://api.coritan.com/api/v1/orgs/acme/products/7 \
  -H "Authorization: Bearer $CORITAN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"config_schema": {"fields": [{"key": "minecraft_name", "label": "Minecraft name", "required": true, "max_length": 16, "pattern": "[A-Za-z0-9_]{3,16}"}]}}'

GET /platform-products leaves out Coritan's account plans, their add-ons, the services a plan includes and the products billed by use other than pay as you go Object Storage. A linked_product_id that names an account plan, an add-on or a service a plan includes answers 422 with A brand cannot sell an account plan, an add-on or a service a plan includes. Link a product from the catalogue instead. One that names another product billed by use answers 422 with A brand cannot sell this product billed by use yet. Only pay as you go Object Storage can be resold.

A product linked to pay as you go Object Storage carries its rates. To start from Coritan's list rates and see the least each rate may be, before the product exists, ask for the platform product's terms. Any member may. The answer has configured: false:

Shell
curl https://api.coritan.com/api/v1/orgs/acme/platform-products/43/object-storage \
  -H "Authorization: Bearer $CORITAN_TOKEN"
JSON
{
  "currency": "USD", "configured": false,
  "rates": {"storage_gb_month": "0.0135", "class_a_million": "4.00", "class_b_million": "0.32"},
  "free": {"storage_gb_month": "0", "class_a": 0, "class_b": 0},
  "list_rates": {"storage_gb_month": "0.0135", "class_a_million": "4.00", "class_b_million": "0.32"},
  "wholesale_rates": {"storage_gb_month": "0.0081", "class_a_million": "2.40", "class_b_million": "0.1920"},
  "limited": true, "reason": null, "discount_percent": 40.0,
  "invoice_currency": "USD", "currency_matches": true
}

Create the product with object_storage: rates (storage_gb_month, class_a_million, class_b_million, each up to four decimal places) and free (storage_gb_month in GB-months, class_a and class_b in operations, each per customer per calendar month, default 0). The rates are in your invoice currency. object_storage on any other product answers 422.

Shell
curl -X POST https://api.coritan.com/api/v1/orgs/acme/products \
  -H "Authorization: Bearer $CORITAN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Cloud Storage", "slug": "cloud-storage", "product_type": "platform_linked", "linked_product_id": 43,
       "object_storage": {"rates": {"storage_gb_month": "0.0150", "class_a_million": "4.50", "class_b_million": "0.36"},
                          "free": {"storage_gb_month": "5", "class_a": 500000, "class_b": 5000000}}}'

Read and change the rates of a product with GET and PUT /products/{product_id}/object-storage. PUT takes the same rates and free, and the owner or an admin may send it. The answer is the same as the one above, with configured: true. A rate under the wholesale rate answers 422. The message names the wholesale discount in force when you ask, and the examples on this page use a made up one:

JSON
{"detail": {"code": "below_wholesale_rate", "message": "The storage rate cannot be below 0.0088 USD per GB-month, what Coritan charges you for it (35% below list).", "field": "rates.storage_gb_month", "wholesale_rate": "0.0088", "currency": "USD"}}

Another organization's product, or one that is not linked to pay as you go Object Storage, answers 404. Each save is written to the organization's audit log as object_storage.terms_updated.

Add a plan with name, billing_cycle (hourly, daily, weekly, monthly, quarterly, semi_annually, annually, biennially or one_time), price, setup_fee (default 0) and currency (default USD). The older spellings semiannually and onetime are saved as semi_annually and one_time, and any other cycle answers 422, because a service renews on its plan's cycle:

Shell
curl -X POST https://api.coritan.com/api/v1/orgs/acme/products/5/pricing \
  -H "Authorization: Bearer $CORITAN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Monthly", "billing_cycle": "monthly", "price": "12.99", "currency": "EUR"}'

To know the least a new plan may cost before you add it, ask for the quote POST …/pricing checks it with. Any member may ask:

Shell
curl "https://api.coritan.com/api/v1/orgs/acme/products/5/wholesale?billing_cycle=monthly&currency=EUR" \
  -H "Authorization: Bearer $CORITAN_TOKEN"

It answers list_price, wholesale_price and wholesale_setup_fee (null when there is no floor), discount_percent, limited (whether a lower price is refused) and reason, as a plan's wholesale reads. For a compute plan it also answers compute, the monthly idle, typical and most figures at wholesale with the currency, the size they come from, floor_price (the least a price may be) and floor_kind, idle when the idle figure sets the floor and wholesale when the wholesale price does. On the Usage basis a compute plan has no wholesale_price. A cycle or currency the route does not take answers 422, and another organization's product 404.

For a linked product, a price or setup_fee below the wholesale price answers 422:

JSON
{"detail": {"code": "below_wholesale", "message": "This plan's price cannot be below its wholesale price of 8.44 EUR, what Coritan charges for the hosting (35% below list).", "field": "price", "wholesale_price": 8.44, "wholesale_setup_fee": 0.0, "list_price": 12.99, "currency": "EUR"}}

A compute plan's price below its idle figure answers 422 with the code below_floor and the three figures:

JSON
{"detail": {"code": "below_floor", "message": "This plan's price cannot be below 3.07 USD a month. That is what the plan costs you when a server runs all month and uses no CPU.", "field": "price", "floor_price": 3.07, "idle": 3.07, "typical": 4.38, "most": 16.21, "currency": "USD"}}

A negative price or setup_fee answers 422 on both routes, linked product or not. Change a plan with PATCH /products/{product_id}/pricing/{pricing_id} and any of name, billing_cycle, price, setup_fee, currency and is_active. Only what you send changes. is_active: false retires the plan and true puts it back on sale. The same floor applies: a new price or setup fee, a new cycle or currency, and a plan put back on sale answer 422 with below_wholesale, or below_floor for a compute plan's price, when they are under it. A plan of another product answers 404 with Pricing plan not found.

Shell
curl -X PATCH https://api.coritan.com/api/v1/orgs/acme/products/5/pricing/11 \
  -H "Authorization: Bearer $CORITAN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"price": "13.99"}'

GET /products lists your products that are available to order, and active_only=false adds the hidden ones. Each carries active_plan_count, the number of its plans on sale. GET /products/{product_id}/pricing lists a product's plans on sale in their order, and active_only=false adds the retired ones (is_active: false). PATCH /products/{product_id} changes name, description, is_active, sort_order and config_schema. Each plan in the list, and the plan POST and PATCH return, carries wholesale_price and wholesale_setup_fee in the plan's currency (null when there is no floor), below_wholesale, below_floor (a price under the floor in force, whichever it is), floor_price, and wholesale with list_price, setup_list, discount_percent, reason (null when the floor applies, exempt, not_linked, no_list_price or no_rate when it does not), floor_kind and, for a compute plan, compute with its idle, typical and most figures.

For a product linked to a server plan of App Deployment, the catalogue routes on Browse the software your customers can install list the games and applications a server can run.

API operations on this page

MethodPathWhat it does
GET/api/v1/orgs/{org_slug}/productsList products
POST/api/v1/orgs/{org_slug}/productsCreate a product
PATCH/api/v1/orgs/{org_slug}/products/{product_id}Update product
GET/api/v1/orgs/{org_slug}/products/{product_id}/object-storageGet product object storage
PUT/api/v1/orgs/{org_slug}/products/{product_id}/object-storageSet a product's Object Storage rates and free amounts
GET/api/v1/orgs/{org_slug}/products/{product_id}/pricingA product's plans, in their order
POST/api/v1/orgs/{org_slug}/products/{product_id}/pricingAdd a plan
PATCH/api/v1/orgs/{org_slug}/products/{product_id}/pricing/{pricing_id}Change a plan: only the fields sent (null leaves one as it is)
GET/api/v1/orgs/{org_slug}/products/{product_id}/wholesaleQuote product wholesale
GET/api/v1/orgs/{org_slug}/platform-productsThe platform products this organization may link a product to
GET/api/v1/orgs/{org_slug}/platform-products/{platform_product_id}/object-storageGet platform object storage