API
The console, lc, Terraform and this site all call the API at https://api.logi-ciel.co/v1. A script that holds a token can do everything they do.
Base URL
Every request goes to https://api.logi-ciel.co/v1, and requests and responses are JSON in UTF-8. Times are in UTC, in RFC 3339 format.
The version is part of the path, as v1 in every URL. A change that would break a client goes into a further version, and v1 keeps its shape.
Authentication
Each request carries a token in the Authorization header. A token belongs to one project and acts on that project alone.
- Open the project in the console and choose API tokens.
- Choose Create token, give it a name, and pick read-only or read and write.
- Copy the token straight away, because the console shows it only once.
Send the token as a bearer token in each request:
$ export LC_TOKEN="lcp_9f2c...e71a"
$ curl -s https://api.logi-ciel.co/v1/servers \
-H "Authorization: Bearer $LC_TOKEN"
A request without a valid token gets 401 Unauthorized. A read-only token that tries to change something gets 403 Forbidden.
Keep tokens out of code and out of version control. Delete a token in the console, and every request that uses it fails from then on.
Endpoints
Resources
Each resource has a path of its own, such as /servers. GET lists or reads, POST creates, PATCH changes and DELETE removes.
| Path | What it holds |
|---|---|
/servers | Servers, with their plans, regions, addresses and labels |
/volumes | Volumes and the servers they are attached to |
/networks | Private networks and their address ranges |
/firewalls | Firewalls, their rules and where they apply |
/ssh-keys | The project’s SSH keys |
/actions/{id} | The state of a request that takes time, read with GET |
Published figures
These paths answer only GET requests and hold the figures this site prints. Its price tables, region pages, status page and changelog all read them.
| Path | What it returns |
|---|---|
/prices | Every plan and item, with its hourly rate and its monthly price, before VAT |
/regions | Each region’s code, city and country, with its round trips to the others |
/usage?month=2026-10 | The project’s hours and costs for a month, resource by resource |
/status/incidents | The incidents on the status page, with region, service and duration |
/changelog | The entries of the changelog, latest first, each with its date |
/prices, /regions, /status/incidents and /changelog return the same data to every project, and a read-only token reads them. /usage returns the hours and costs of the token’s own project, as billing shows.
Read the round trips
GET /v1/regions lists every region with its round trips to the others. Each round trip is the median over the private network in the last seven days, in milliseconds:
$ curl -s https://api.logi-ciel.co/v1/regions \
-H "Authorization: Bearer $LC_TOKEN"
The response, cut to its first region, with that region’s round trips nearest first:
{
"regions": [
{
"code": "ee1",
"city": "Tallinn",
"country": "Estonia",
"round_trips_ms": {"lv1": 5, "dk1": 15, "at1": 27, "it1": 33, "pt1": 58}
}
]
}
Create a server
POST /v1/servers takes the same fields as lc server create on the command line:
curl -s -X POST https://api.logi-ciel.co/v1/servers \
-H "Authorization: Bearer $LC_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "web-1",
"plan": "s-2",
"region": "ee1",
"image": "debian-13",
"ssh_keys": ["me"],
"labels": {"role": "web"}
}'
The API answers 201 Created with the server and the action that builds it:
{
"server": {
"id": "srv_7Hq2kd",
"name": "web-1",
"plan": "s-2",
"region": "ee1",
"status": "starting",
"ipv4": "203.0.113.24",
"ipv6": "2001:db8:4c1::/64",
"labels": {"role": "web"}
},
"action": {"id": "act_K29xmP", "status": "running"}
}
The addresses are fixed from the start, so you can add DNS records before the server is up.
Actions
A request that takes time, such as a create or a resize, returns an action. Read the action until its status is success or error:
$ curl -s https://api.logi-ciel.co/v1/actions/act_K29xmP \
-H "Authorization: Bearer $LC_TOKEN"
{"id": "act_K29xmP", "status": "success", "resource": "srv_7Hq2kd"}
To wait without polling, add a webhook under API tokens in the console. It receives each action when the action finishes.
Errors and limits
An error has an HTTP status and a JSON body, with a code for programs and a message for people:
{"error": {"code": "plan_not_in_region", "message": "g-h100 runs in it1 and lv1 only."}}
Lists come in pages: pass page and per_page in the query, and follow meta.next until it is empty.
Too many requests in a short time get 429 Too Many Requests with a Retry-After header. lc and the Terraform provider wait and retry on their own, and your scripts should do the same.