List a site's files
The files of one company-owned site, as metadata (path, kind, content type, size, version and time), sorted by path, without their content. It lists each layout, section and snippet, each page whose template the site owns, each asset, config/menus.json, config/pages.json and config/settings.json; a company site never lists config/access.json. Each entry’s version is the one to send back when writing or removing the file. Read a file’s content with GET /member-sites/{id}/files/{path}. The list is paged by cursor; follow meta.pagination.next_cursor until it is null to read every file. A member’s site is refused with 403. Needs application_themes.view and a signed-in admin.
curl --request GET \
--url https://api.fluid.app/api/company/v2026-10/member-sites/{id}/files \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/member-sites/{id}/files"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/company/v2026-10/member-sites/{id}/files', 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}/files",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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}/files"
req, _ := http.NewRequest("GET", 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.get("https://api.fluid.app/api/company/v2026-10/member-sites/{id}/files")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/member-sites/{id}/files")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"member_site_files": [
{
"path": "assets/site.css",
"kind": "asset",
"content_type": "text/css",
"byte_size": 19,
"lock_version": null,
"version": "3e67b4a9505b24600272f1ce6b6776c4ae2ebde88f76559d4a2a51f602d800c4",
"updated_at": "2026-10-23T14:02:11.482913Z"
},
{
"path": "config/menus.json",
"kind": "menus",
"content_type": "application/json",
"byte_size": 13,
"lock_version": null,
"version": "83c16a26a7e791cacf1b6ab0d4daf34278b1d82815989a437cf2415a523d2e7d",
"updated_at": null
},
{
"path": "config/pages.json",
"kind": "pages",
"content_type": "application/json",
"byte_size": 35,
"lock_version": null,
"version": "f8aba6e163e6c6def5318179c27235af899675da39b7b9bcc1f6bcad2164cd22",
"updated_at": null
},
{
"path": "config/settings.json",
"kind": "settings",
"content_type": "application/json",
"byte_size": 2,
"lock_version": 3,
"version": "3",
"updated_at": "2026-10-23T14:00:03.120044Z"
}
],
"status": 200,
"meta": {
"request_uuid": "3b8f1d27-6c4e-4a91-8e5d-2f7c9a1b0e64",
"timestamp": "2026-10-23T14:05:12Z",
"pagination": {
"next_cursor": null
}
}
}{}{}{
"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.
Query Parameters
Opaque cursor from meta.pagination.next_cursor, valid only for the same site. A malformed, tampered or mismatched cursor is refused with 422. Do not construct or decode it.
Files per page. Default 25, maximum 100.
1 <= x <= 100curl --request GET \
--url https://api.fluid.app/api/company/v2026-10/member-sites/{id}/files \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/member-sites/{id}/files"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/company/v2026-10/member-sites/{id}/files', 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}/files",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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}/files"
req, _ := http.NewRequest("GET", 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.get("https://api.fluid.app/api/company/v2026-10/member-sites/{id}/files")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/member-sites/{id}/files")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"member_site_files": [
{
"path": "assets/site.css",
"kind": "asset",
"content_type": "text/css",
"byte_size": 19,
"lock_version": null,
"version": "3e67b4a9505b24600272f1ce6b6776c4ae2ebde88f76559d4a2a51f602d800c4",
"updated_at": "2026-10-23T14:02:11.482913Z"
},
{
"path": "config/menus.json",
"kind": "menus",
"content_type": "application/json",
"byte_size": 13,
"lock_version": null,
"version": "83c16a26a7e791cacf1b6ab0d4daf34278b1d82815989a437cf2415a523d2e7d",
"updated_at": null
},
{
"path": "config/pages.json",
"kind": "pages",
"content_type": "application/json",
"byte_size": 35,
"lock_version": null,
"version": "f8aba6e163e6c6def5318179c27235af899675da39b7b9bcc1f6bcad2164cd22",
"updated_at": null
},
{
"path": "config/settings.json",
"kind": "settings",
"content_type": "application/json",
"byte_size": 2,
"lock_version": 3,
"version": "3",
"updated_at": "2026-10-23T14:00:03.120044Z"
}
],
"status": 200,
"meta": {
"request_uuid": "3b8f1d27-6c4e-4a91-8e5d-2f7c9a1b0e64",
"timestamp": "2026-10-23T14:05:12Z",
"pagination": {
"next_cursor": null
}
}
}{}{}{
"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"
}
}