Change a project file
curl --request PATCH \
--url https://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"description": "Treatment prices from 1 November",
"read_contents": true
}
'import requests
url = "https://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id}"
payload = {
"description": "Treatment prices from 1 November",
"read_contents": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({description: 'Treatment prices from 1 November', read_contents: true})
};
fetch('https://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id}', 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://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'description' => 'Treatment prices from 1 November',
'read_contents' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id}"
payload := strings.NewReader("{\n \"description\": \"Treatment prices from 1 November\",\n \"read_contents\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"Treatment prices from 1 November\",\n \"read_contents\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"Treatment prices from 1 November\",\n \"read_contents\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "f19d4c70-2b8e-4a35-9d6c-07e3a5b81c42",
"project_id": "e57b2a93-0d6c-4f18-9a41-83c1d7e0b2f4",
"task_id": null,
"name": "clinic-price-list.pdf",
"description": "Treatment prices from 1 November",
"file_url": "https://jobbit-s3.ams3.digitaloceanspaces.com/p/e57b2a93/clinic-price-list.pdf",
"file_type": "document",
"content_type": "application/pdf",
"thumbnail_url": null,
"size_bytes": 204800,
"content_state": "requested",
"created_by": "7b0e2c4a-1d3f-4c8e-9a52-6f1d0e8b3a77",
"author": null,
"updated_by": null,
"editor": null,
"created_at": "2026-10-13T10:00:00",
"updated_at": null
}{
"error": {
"code": "invalid_key",
"message": "the API key is missing or invalid",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "insufficient_scope",
"message": "this key does not have the deploy:write permission",
"details": {
"required": "deploy:write"
},
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "not_found",
"message": "no such project or item",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "invalid_request",
"message": "the request is not valid",
"details": [
{
"location": [
"body",
"name"
],
"message": "String should match pattern '^[a-z0-9][a-z0-9-]*$'",
"type": "string_pattern_mismatch"
}
],
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "rate_limited",
"message": "too many read requests, retry in 4 s",
"details": {
"group": "read",
"limit": 120,
"window_seconds": 60
},
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}Change a project file
Changes a file’s description, or asks for its contents to be read (or forgotten) after the upload.
Requires the projects:write permission.
PATCH
/
v1
/
projects
/
{project_id}
/
files
/
{file_id}
Change a project file
curl --request PATCH \
--url https://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"description": "Treatment prices from 1 November",
"read_contents": true
}
'import requests
url = "https://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id}"
payload = {
"description": "Treatment prices from 1 November",
"read_contents": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({description: 'Treatment prices from 1 November', read_contents: true})
};
fetch('https://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id}', 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://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'description' => 'Treatment prices from 1 November',
'read_contents' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id}"
payload := strings.NewReader("{\n \"description\": \"Treatment prices from 1 November\",\n \"read_contents\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"Treatment prices from 1 November\",\n \"read_contents\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.jobbit.uk/v1/projects/{project_id}/files/{file_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"Treatment prices from 1 November\",\n \"read_contents\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "f19d4c70-2b8e-4a35-9d6c-07e3a5b81c42",
"project_id": "e57b2a93-0d6c-4f18-9a41-83c1d7e0b2f4",
"task_id": null,
"name": "clinic-price-list.pdf",
"description": "Treatment prices from 1 November",
"file_url": "https://jobbit-s3.ams3.digitaloceanspaces.com/p/e57b2a93/clinic-price-list.pdf",
"file_type": "document",
"content_type": "application/pdf",
"thumbnail_url": null,
"size_bytes": 204800,
"content_state": "requested",
"created_by": "7b0e2c4a-1d3f-4c8e-9a52-6f1d0e8b3a77",
"author": null,
"updated_by": null,
"editor": null,
"created_at": "2026-10-13T10:00:00",
"updated_at": null
}{
"error": {
"code": "invalid_key",
"message": "the API key is missing or invalid",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "insufficient_scope",
"message": "this key does not have the deploy:write permission",
"details": {
"required": "deploy:write"
},
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "not_found",
"message": "no such project or item",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "invalid_request",
"message": "the request is not valid",
"details": [
{
"location": [
"body",
"name"
],
"message": "String should match pattern '^[a-z0-9][a-z0-9-]*$'",
"type": "string_pattern_mismatch"
}
],
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}{
"error": {
"code": "rate_limited",
"message": "too many read requests, retry in 4 s",
"details": {
"group": "read",
"limit": 120,
"window_seconds": 60
},
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}Authorizations
An API key from Settings → API keys, sent as Authorization: Bearer jb_live_…
Body
application/json
Response
The file.
The file id.
The project.
The file name.
A link to the file.
image, media or document.
The task it came from.
A description.
The media type.
A preview image.
Size in bytes.
Whether the agent has read inside it: none, requested, indexed or another progress state.
Who added it.
Show child attributes
Show child attributes
Who changed it last.
Show child attributes
Show child attributes
When it was added.
When it last changed.
⌘I