curl -X GET \
"https://bouncer.nunu.ai/file-storage/my-project/project?include_metadata=true" \
-H "X-Api-Key: YOUR_API_TOKEN"
const projectId = "my-project";
const response = await fetch(
`https://bouncer.nunu.ai/file-storage/${projectId}/project?include_metadata=true`,
{
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
},
}
);
const data = await response.json();
import requests
import os
project_id = "my-project"
response = requests.get(
f"https://bouncer.nunu.ai/file-storage/{project_id}/project",
headers={"X-Api-Key": os.environ["NUNU_API_TOKEN"]},
params={"include_metadata": True},
)
data = response.json()
{
"projectId": "my-project",
"scope": "project",
"count": 2,
"files": [
{
"filename": "game-design.md",
"path": "game-design.md",
"size": 4096,
"uploaded": "2026-04-12T10:30:00.000Z",
"etag": "9a3b4c5d6e7f8090a1b2c3d4e5f60718",
"metadata": {
"description": "High-level design overview",
"summary": "Mechanics, levels, and progression",
"keywords": ["design", "gameplay"]
}
},
{
"filename": "rules.txt",
"path": "subdir/rules.txt",
"size": 1234,
"uploaded": "2026-04-12T10:31:00.000Z",
"etag": "0a1b2c3d4e5f60718a3b4c5d6e7f8090"
}
]
}
Knowledge
List Project-Scope Knowledge
List the knowledge files stored under the project’s project/ prefix only. These files are visible to every run in the project.
GET
/
file-storage
/
{projectId}
/
project
curl -X GET \
"https://bouncer.nunu.ai/file-storage/my-project/project?include_metadata=true" \
-H "X-Api-Key: YOUR_API_TOKEN"
const projectId = "my-project";
const response = await fetch(
`https://bouncer.nunu.ai/file-storage/${projectId}/project?include_metadata=true`,
{
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
},
}
);
const data = await response.json();
import requests
import os
project_id = "my-project"
response = requests.get(
f"https://bouncer.nunu.ai/file-storage/{project_id}/project",
headers={"X-Api-Key": os.environ["NUNU_API_TOKEN"]},
params={"include_metadata": True},
)
data = response.json()
{
"projectId": "my-project",
"scope": "project",
"count": 2,
"files": [
{
"filename": "game-design.md",
"path": "game-design.md",
"size": 4096,
"uploaded": "2026-04-12T10:30:00.000Z",
"etag": "9a3b4c5d6e7f8090a1b2c3d4e5f60718",
"metadata": {
"description": "High-level design overview",
"summary": "Mechanics, levels, and progression",
"keywords": ["design", "gameplay"]
}
},
{
"filename": "rules.txt",
"path": "subdir/rules.txt",
"size": 1234,
"uploaded": "2026-04-12T10:31:00.000Z",
"etag": "0a1b2c3d4e5f60718a3b4c5d6e7f8090"
}
]
}
Permission Required: any API key scoped to the requested project
Knowledge endpoints are served by the bouncer service at
https://bouncer.nunu.ai, not the main nunu.ai/api/v1 host. Use the same
X-Api-Key header for authentication.project/ prefix. These are
the files that every run in the project sees regardless of which agent or test
case it executes.
If you instead want a single response that combines project files with
agent- or test-case-scoped files, use
List Knowledge Files.
Path Parameters
string
required
The nunu.ai project ID. Must match the project the API key is scoped to.
Query Parameters
boolean
default:"false"
When
true, attach parsed metadata (description, summary, keywords)
for each file from its .{name}.meta.json sidecar.Response
string
required
Echo of the path parameter.
string
required
Always
"project" for this endpoint.integer
required
Number of files returned.
File[]
required
Files in the project scope.
Show File properties
Show File properties
string
Basename of the file.
string
Path relative to the scope root (may include subdirectories).
integer
Size in bytes.
string
ISO 8601 timestamp when the file was last written.
string
Object ETag.
object
Only present when
include_metadata=true and a sidecar metadata file
exists. Contains description, summary, and keywords.curl -X GET \
"https://bouncer.nunu.ai/file-storage/my-project/project?include_metadata=true" \
-H "X-Api-Key: YOUR_API_TOKEN"
const projectId = "my-project";
const response = await fetch(
`https://bouncer.nunu.ai/file-storage/${projectId}/project?include_metadata=true`,
{
headers: {
"X-Api-Key": process.env.NUNU_API_TOKEN,
},
}
);
const data = await response.json();
import requests
import os
project_id = "my-project"
response = requests.get(
f"https://bouncer.nunu.ai/file-storage/{project_id}/project",
headers={"X-Api-Key": os.environ["NUNU_API_TOKEN"]},
params={"include_metadata": True},
)
data = response.json()
{
"projectId": "my-project",
"scope": "project",
"count": 2,
"files": [
{
"filename": "game-design.md",
"path": "game-design.md",
"size": 4096,
"uploaded": "2026-04-12T10:30:00.000Z",
"etag": "9a3b4c5d6e7f8090a1b2c3d4e5f60718",
"metadata": {
"description": "High-level design overview",
"summary": "Mechanics, levels, and progression",
"keywords": ["design", "gameplay"]
}
},
{
"filename": "rules.txt",
"path": "subdir/rules.txt",
"size": 1234,
"uploaded": "2026-04-12T10:31:00.000Z",
"etag": "0a1b2c3d4e5f60718a3b4c5d6e7f8090"
}
]
}
Authorizations
API key for authentication
Path Parameters
The nunu.ai project ID. Must match the project the API key is scoped to.
Query Parameters
When true, attach parsed metadata (description, summary, keywords) for each file from its .{name}.meta.json sidecar.