Watch Directory
curl --request POST \
--url https://api.declaw.ai/sandboxes/{sandbox_id}/files/watch \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"path": "<string>"
}
'import requests
url = "https://api.declaw.ai/sandboxes/{sandbox_id}/files/watch"
payload = { "path": "<string>" }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({path: '<string>'})
};
fetch('https://api.declaw.ai/sandboxes/{sandbox_id}/files/watch', 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.declaw.ai/sandboxes/{sandbox_id}/files/watch",
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([
'path' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.declaw.ai/sandboxes/{sandbox_id}/files/watch"
payload := strings.NewReader("{\n \"path\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.declaw.ai/sandboxes/{sandbox_id}/files/watch")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"path\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.declaw.ai/sandboxes/{sandbox_id}/files/watch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"path\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyFilesystem API
Watch Directory
Watch a directory for filesystem changes via Server-Sent Events.
POST
/
sandboxes
/
{sandbox_id}
/
files
/
watch
Watch Directory
curl --request POST \
--url https://api.declaw.ai/sandboxes/{sandbox_id}/files/watch \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"path": "<string>"
}
'import requests
url = "https://api.declaw.ai/sandboxes/{sandbox_id}/files/watch"
payload = { "path": "<string>" }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({path: '<string>'})
};
fetch('https://api.declaw.ai/sandboxes/{sandbox_id}/files/watch', 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.declaw.ai/sandboxes/{sandbox_id}/files/watch",
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([
'path' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.declaw.ai/sandboxes/{sandbox_id}/files/watch"
payload := strings.NewReader("{\n \"path\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.declaw.ai/sandboxes/{sandbox_id}/files/watch")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"path\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.declaw.ai/sandboxes/{sandbox_id}/files/watch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"path\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyRegisters a filesystem watcher on the specified directory and streams change events
to the client using Server-Sent Events (SSE). Events are emitted when files are
created, modified, or deleted under the watched path.
Currently returns
Full SSE streaming for file watch events is in progress. The current release
returns an empty
{} body. The endpoint signature and request format are stable
and will be updated to return a live event stream in an upcoming release.Path Parameters
string
required
The sandbox identifier. Format:
sbx-<8 chars>.Request Body
string
required
Absolute path of the directory to watch inside the sandbox.Example:
"/home/user/output"Response
When streaming is fully implemented, the response will haveContent-Type: text/event-stream and emit events with this format:
event: change
data: {"type":"create","path":"/home/user/output/result.csv"}
event: change
data: {"type":"modify","path":"/home/user/output/result.csv"}
event: change
data: {"type":"delete","path":"/home/user/output/old.csv"}
{}.
Example
curl -X POST https://api.declaw.ai/sandboxes/sbx-a1b2c3d4/files/watch \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{ "path": "/home/user/output" }' \
--no-buffer
from declaw import Sandbox
sbx = Sandbox.connect("sbx-a1b2c3d4", api_key="YOUR_API_KEY", domain="api.declaw.ai")
# watch_dir returns a WatchHandle. Drain buffered events with get_new_events().
handle = sbx.files.watch_dir("/home/user/output")
for event in handle.get_new_events():
print(event.type, event.path)
handle.stop()
import { Sandbox } from "@declaw/sdk";
const sbx = await Sandbox.connect("sbx-a1b2c3d4", {
apiKey: "YOUR_API_KEY",
domain: "api.declaw.ai",
});
const handle = await sbx.files.watchDir("/home/user/output");
for (const event of handle.getNewEvents()) {
console.log(event.type, event.path);
}
handle.stop();
Error Responses
| Status | Cause |
|---|---|
401 | Missing or invalid API key |
404 | Sandbox not found |
503 | Sandbox has no VM |
⌘I