List a site's files
The files of one of the member’s sites 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, and config/access.json when the site has a draft access declaration. Each entry’s version is the one to send back when writing or removing the file. Read a file’s content with GET /sites/{site_id}/files/{path}. The list is paged by cursor; follow meta.pagination.next_cursor until it is null to read every file. It is not cached (max-age=0) and can be revalidated with an ETag.
curl --request GET \
--url https://api.fluid.app/api/member/v2026-10/sites/{site_id}/files \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/member/v2026-10/sites/{site_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/member/v2026-10/sites/{site_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/member/v2026-10/sites/{site_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/member/v2026-10/sites/{site_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/member/v2026-10/sites/{site_id}/files")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/sites/{site_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{
"status": 200,
"data": [
{
"path": "assets/site.css",
"kind": "asset",
"content_type": "text/css",
"byte_size": 19,
"lock_version": null,
"version": "3e67b4a9505b24600272f1ce6b6776c4ae2ebde88f76559d4a2a51f602d800c4",
"updated_at": "2026-09-30T15: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": 28,
"lock_version": 0,
"version": "0",
"updated_at": "2026-09-30T15:00:03.120044Z"
},
{
"path": "layouts/site.liquid",
"kind": "layout",
"content_type": "text/x-liquid",
"byte_size": 24,
"lock_version": null,
"version": "4c4127c0f28a648e32ccb71b3b6d1c7cf4c8c8cf8d4459c25a14dfab782049de",
"updated_at": "2026-09-30T15:01:47.903318Z"
}
],
"meta": {
"request_uuid": "0192f4c8-5b6c-7d74-a3e8-0f1a2b3c4d5e",
"timestamp": "2026-09-30T15:08:21Z",
"pagination": {
"next_cursor": null
}
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
A member credential in the Authorization: Bearer header: a member
session JWT, a portal JWT whose login is linked to a membership in
that company, an opaque member token, or a verified One Auth identity
access token. The credential alone identifies the member and company.
Member session and portal JWTs are read-only and are refused with 403
on every write.
Headers
ETag from a previous response.
Path Parameters
Public id of one of the member's sites.
Query Parameters
Opaque cursor from meta.pagination.next_cursor, valid only for the same site. A malformed, tampered or mismatched cursor returns 400.
Page size. Defaults to 25, at most 100.
1 <= x <= 100Response
A page of the site's files.
curl --request GET \
--url https://api.fluid.app/api/member/v2026-10/sites/{site_id}/files \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/member/v2026-10/sites/{site_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/member/v2026-10/sites/{site_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/member/v2026-10/sites/{site_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/member/v2026-10/sites/{site_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/member/v2026-10/sites/{site_id}/files")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/sites/{site_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{
"status": 200,
"data": [
{
"path": "assets/site.css",
"kind": "asset",
"content_type": "text/css",
"byte_size": 19,
"lock_version": null,
"version": "3e67b4a9505b24600272f1ce6b6776c4ae2ebde88f76559d4a2a51f602d800c4",
"updated_at": "2026-09-30T15: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": 28,
"lock_version": 0,
"version": "0",
"updated_at": "2026-09-30T15:00:03.120044Z"
},
{
"path": "layouts/site.liquid",
"kind": "layout",
"content_type": "text/x-liquid",
"byte_size": 24,
"lock_version": null,
"version": "4c4127c0f28a648e32ccb71b3b6d1c7cf4c8c8cf8d4459c25a14dfab782049de",
"updated_at": "2026-09-30T15:01:47.903318Z"
}
],
"meta": {
"request_uuid": "0192f4c8-5b6c-7d74-a3e8-0f1a2b3c4d5e",
"timestamp": "2026-09-30T15:08:21Z",
"pagination": {
"next_cursor": null
}
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}