Provision a new Mist
Creates a Mist app for the current company. The request creates
the app’s GitHub repository, Postgres database, API tokens, and
deployment project with its public domain, then returns 201 with
state: "provisioning" and the final public_url. The first
deployment runs in the background; the Mist moves to live when
it finishes. Poll GET /api/v202604/mists/{id} to watch the state.
If any provisioning step fails, the steps that already completed
are rolled back and the response is 422 naming the failing step.
The app is created standalone. Attaching it to the Fluid surfaces it plugs into, such as a droplet, a drop zone, or a mobile embed, happens separately after creation.
Requires a company admin token with the mist.create permission.
Creating a Mist allocates billable infrastructure, so it can be
refused with 402 before anything is allocated.
curl --request POST \
--url https://api.fluid.app/api/v202604/mists \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"mist": {
"name": "Loyalty rewards",
"kind": "next_app",
"template": "rewards-starter"
}
}
'import requests
url = "https://api.fluid.app/api/v202604/mists"
payload = { "mist": {
"name": "Loyalty rewards",
"kind": "next_app",
"template": "rewards-starter"
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({mist: {name: 'Loyalty rewards', kind: 'next_app', template: 'rewards-starter'}})
};
fetch('https://api.fluid.app/api/v202604/mists', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/v202604/mists",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'mist' => [
'name' => 'Loyalty rewards',
'kind' => 'next_app',
'template' => 'rewards-starter'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/v202604/mists"
payload := strings.NewReader("{\n \"mist\": {\n \"name\": \"Loyalty rewards\",\n \"kind\": \"next_app\",\n \"template\": \"rewards-starter\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fluid.app/api/v202604/mists")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"mist\": {\n \"name\": \"Loyalty rewards\",\n \"kind\": \"next_app\",\n \"template\": \"rewards-starter\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/mists")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"mist\": {\n \"name\": \"Loyalty rewards\",\n \"kind\": \"next_app\",\n \"template\": \"rewards-starter\"\n }\n}"
response = http.request(request)
puts response.read_body{
"mist": {
"id": "0192f4c1-7a3e-7d52-9b61-3bed85a41c07",
"slug": "3bed85",
"state": "provisioning",
"kind": "next_app",
"name": "Loyalty rewards",
"public_url": "https://dunder-mifflin-3bed85.mist.fluid.app",
"provisioned_at": null,
"scheduled_destroy_at": null,
"template": "rewards-starter",
"created_at": "2026-04-14T16:21:58Z",
"updated_at": "2026-04-14T16:22:04Z"
},
"status": 201,
"meta": {
"request_id": "6f1c2a9e-4b7d-4e8a-9c3f-2d5b8a1e7f40",
"timestamp": "2026-04-14T16:22:04Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
Bearer token authentication. Accepts company admin tokens with
the matching mist.* permission:
mist.viewto list and show Mistsmist.createto create and rename Mistsmist.destroyto delete and restore Mistsmist.codefor deployments and logsmist.env_varsto read and manage environment variables Droplet installation tokens are refused.
Body
Show child attributes
Show child attributes
curl --request POST \
--url https://api.fluid.app/api/v202604/mists \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"mist": {
"name": "Loyalty rewards",
"kind": "next_app",
"template": "rewards-starter"
}
}
'import requests
url = "https://api.fluid.app/api/v202604/mists"
payload = { "mist": {
"name": "Loyalty rewards",
"kind": "next_app",
"template": "rewards-starter"
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({mist: {name: 'Loyalty rewards', kind: 'next_app', template: 'rewards-starter'}})
};
fetch('https://api.fluid.app/api/v202604/mists', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/v202604/mists",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'mist' => [
'name' => 'Loyalty rewards',
'kind' => 'next_app',
'template' => 'rewards-starter'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/v202604/mists"
payload := strings.NewReader("{\n \"mist\": {\n \"name\": \"Loyalty rewards\",\n \"kind\": \"next_app\",\n \"template\": \"rewards-starter\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fluid.app/api/v202604/mists")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"mist\": {\n \"name\": \"Loyalty rewards\",\n \"kind\": \"next_app\",\n \"template\": \"rewards-starter\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/mists")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"mist\": {\n \"name\": \"Loyalty rewards\",\n \"kind\": \"next_app\",\n \"template\": \"rewards-starter\"\n }\n}"
response = http.request(request)
puts response.read_body{
"mist": {
"id": "0192f4c1-7a3e-7d52-9b61-3bed85a41c07",
"slug": "3bed85",
"state": "provisioning",
"kind": "next_app",
"name": "Loyalty rewards",
"public_url": "https://dunder-mifflin-3bed85.mist.fluid.app",
"provisioned_at": null,
"scheduled_destroy_at": null,
"template": "rewards-starter",
"created_at": "2026-04-14T16:21:58Z",
"updated_at": "2026-04-14T16:22:04Z"
},
"status": 201,
"meta": {
"request_id": "6f1c2a9e-4b7d-4e8a-9c3f-2d5b8a1e7f40",
"timestamp": "2026-04-14T16:22:04Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}