Lock a member site
Locks a member’s site so only company admins open it. Its owner, the members it is shared with and any guest are refused, every bridge call through it is refused, and it leaves every member’s menu but its owner’s. The site’s visibility, shares, pages and files are not changed, and the owner can still edit, share and publish it. Records when and which admin. Locking a locked site changes nothing and keeps the first time and admin. Its branches are locked with it. Needs application_themes.update and a signed-in admin. Answers 409 when the site changed while it was being locked; read it again and retry.
curl --request POST \
--url https://api.fluid.app/api/company/v2026-10/member-sites/{id}/lock \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/member-sites/{id}/lock"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/company/v2026-10/member-sites/{id}/lock', 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/company/v2026-10/member-sites/{id}/lock",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/company/v2026-10/member-sites/{id}/lock"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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/company/v2026-10/member-sites/{id}/lock")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/member-sites/{id}/lock")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"member_site": {
"id": "019a2c4d-5e6f-7a7b-8c9d-0e1f2a3b4c5d",
"handle": "riley-shop",
"name": "Riley's Shop",
"owner_kind": "member",
"owner_member": {
"id": "019a1111-2222-7333-8444-555566667777",
"display_name": "Riley Rep"
},
"copied_from_id": null,
"access": {
"declared": false,
"uses": []
},
"visibility": "public",
"status": "published",
"taken_down_at": null,
"company_lock": "made_private",
"made_private_at": "2026-11-04T15:00:00Z",
"made_private_by_user_id": 1069114610,
"required": false,
"position": 0,
"featured": false,
"feature_position": null,
"layout_name": null,
"settings": {},
"content_version": "019a2c4d-6f7a-7b8c-9d0e-1f2a3b4c5d6e",
"lock_version": 3,
"created_at": "2026-10-14T11:00:00Z",
"updated_at": "2026-10-23T14:05:12Z"
},
"status": 200,
"meta": {
"request_uuid": "3b8f1d27-6c4e-4a91-8e5d-2f7c9a1b0e64",
"timestamp": "2026-10-23T14:05:12Z"
}
}{}{}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
A company admin credential for your company, or a droplet installation token with the website scope for reads, except on the share routes, which refuse a droplet token.
Path Parameters
The site's id.
curl --request POST \
--url https://api.fluid.app/api/company/v2026-10/member-sites/{id}/lock \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/member-sites/{id}/lock"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/company/v2026-10/member-sites/{id}/lock', 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/company/v2026-10/member-sites/{id}/lock",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/company/v2026-10/member-sites/{id}/lock"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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/company/v2026-10/member-sites/{id}/lock")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/member-sites/{id}/lock")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"member_site": {
"id": "019a2c4d-5e6f-7a7b-8c9d-0e1f2a3b4c5d",
"handle": "riley-shop",
"name": "Riley's Shop",
"owner_kind": "member",
"owner_member": {
"id": "019a1111-2222-7333-8444-555566667777",
"display_name": "Riley Rep"
},
"copied_from_id": null,
"access": {
"declared": false,
"uses": []
},
"visibility": "public",
"status": "published",
"taken_down_at": null,
"company_lock": "made_private",
"made_private_at": "2026-11-04T15:00:00Z",
"made_private_by_user_id": 1069114610,
"required": false,
"position": 0,
"featured": false,
"feature_position": null,
"layout_name": null,
"settings": {},
"content_version": "019a2c4d-6f7a-7b8c-9d0e-1f2a3b4c5d6e",
"lock_version": 3,
"created_at": "2026-10-14T11:00:00Z",
"updated_at": "2026-10-23T14:05:12Z"
},
"status": 200,
"meta": {
"request_uuid": "3b8f1d27-6c4e-4a91-8e5d-2f7c9a1b0e64",
"timestamp": "2026-10-23T14:05:12Z"
}
}{}{}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}