Download a List of Objects
curl --request POST \
--url https://app.speckle.systems/api/getobjects/{projectId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"objects": "[\"object-id-1\", \"object-id-2\"]"
}
'import requests
url = "https://app.speckle.systems/api/getobjects/{projectId}"
payload = { "objects": "[\"object-id-1\", \"object-id-2\"]" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({objects: '["object-id-1", "object-id-2"]'})
};
fetch('https://app.speckle.systems/api/getobjects/{projectId}', 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://app.speckle.systems/api/getobjects/{projectId}",
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([
'objects' => '["object-id-1", "object-id-2"]'
]),
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://app.speckle.systems/api/getobjects/{projectId}"
payload := strings.NewReader("{\n \"objects\": \"[\\\"object-id-1\\\", \\\"object-id-2\\\"]\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.speckle.systems/api/getobjects/{projectId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"objects\": \"[\\\"object-id-1\\\", \\\"object-id-2\\\"]\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.speckle.systems/api/getobjects/{projectId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"objects\": \"[\\\"object-id-1\\\", \\\"object-id-2\\\"]\"\n}"
response = http.request(request)
puts response.read_body[
{
"id": "object-id-1",
"speckle_type": "Base",
"totalChildrenCount": 0
},
{
"id": "object-id-2",
"speckle_type": "Base",
"totalChildrenCount": 0
}
]{
"message": "<string>",
"statusCode": 123
}{
"message": "<string>",
"statusCode": 123
}Objects
Download a List of Objects
deprecated
Download multiple objects by their IDs. This method is useful when optimizing downloads: Get the root object without children, check the children ids in the local cache and then request only the new objects with this method. The response format depends on the Accept header. On Speckle Cloud and Speckle Enterprise Server 2026.9 and later, this endpoint is deprecated: every response carries Deprecation and Warning headers, and it serves object-graph versions only. On the open-source Speckle Server it is current. A bundle reference (bundle.<projectId>.<modelId>.<versionId>) returns 404 with error: "BUNDLE_REFERENCE_NOT_FOUND": read bundle versions with the artifacts endpoints instead.
POST
/
api
/
getobjects
/
{projectId}
Download a List of Objects
curl --request POST \
--url https://app.speckle.systems/api/getobjects/{projectId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"objects": "[\"object-id-1\", \"object-id-2\"]"
}
'import requests
url = "https://app.speckle.systems/api/getobjects/{projectId}"
payload = { "objects": "[\"object-id-1\", \"object-id-2\"]" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({objects: '["object-id-1", "object-id-2"]'})
};
fetch('https://app.speckle.systems/api/getobjects/{projectId}', 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://app.speckle.systems/api/getobjects/{projectId}",
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([
'objects' => '["object-id-1", "object-id-2"]'
]),
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://app.speckle.systems/api/getobjects/{projectId}"
payload := strings.NewReader("{\n \"objects\": \"[\\\"object-id-1\\\", \\\"object-id-2\\\"]\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.speckle.systems/api/getobjects/{projectId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"objects\": \"[\\\"object-id-1\\\", \\\"object-id-2\\\"]\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.speckle.systems/api/getobjects/{projectId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"objects\": \"[\\\"object-id-1\\\", \\\"object-id-2\\\"]\"\n}"
response = http.request(request)
puts response.read_body[
{
"id": "object-id-1",
"speckle_type": "Base",
"totalChildrenCount": 0
},
{
"id": "object-id-2",
"speckle_type": "Base",
"totalChildrenCount": 0
}
]{
"message": "<string>",
"statusCode": 123
}{
"message": "<string>",
"statusCode": 123
}Deprecated on Speckle Cloud and Speckle Enterprise Server 2026.9 and later, where it serves object graphs only. Current on the open-source Speckle Server. To read a bundle version, use the bundle endpoints.
Limits
Recommended max number of objects to download with 1 request:1000
Response Format
- If
Acceptistext/plain, each line of the output contains 1 object in the format:{object_id}\t{object_content} - If
Acceptisapplication/json, the output is a JSON representation of an array of objects.
Authorizations
Headers
Body
application/json