curl --request GET \
--url https://app.timelines.ai/partner/api/v1/workspaces/{workspace_id} \
--header 'Authorization: Bearer <token>' \
--header 'X-TL-Partner-Id: <x-tl-partner-id>'import requests
url = "https://app.timelines.ai/partner/api/v1/workspaces/{workspace_id}"
headers = {
"X-TL-Partner-Id": "<x-tl-partner-id>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-TL-Partner-Id': '<x-tl-partner-id>', Authorization: 'Bearer <token>'}
};
fetch('https://app.timelines.ai/partner/api/v1/workspaces/{workspace_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://app.timelines.ai/partner/api/v1/workspaces/{workspace_id}",
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>",
"X-TL-Partner-Id: <x-tl-partner-id>"
],
]);
$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://app.timelines.ai/partner/api/v1/workspaces/{workspace_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-TL-Partner-Id", "<x-tl-partner-id>")
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://app.timelines.ai/partner/api/v1/workspaces/{workspace_id}")
.header("X-TL-Partner-Id", "<x-tl-partner-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.timelines.ai/partner/api/v1/workspaces/{workspace_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-TL-Partner-Id"] = '<x-tl-partner-id>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"workspace_id": "ws_1234567890abcdef",
"display_name": "my-first-workspace",
"seats": {
"total": 10,
"used": 7,
"period_start": "2024-01-01T00:00:00Z",
"period_end": "2024-12-31T23:59:59Z"
},
"messages_quota": {
"total": 10,
"used": 7,
"period_start": "2024-01-01T00:00:00Z",
"period_end": "2024-12-31T23:59:59Z"
},
"api_calls_quota": {
"total": 10,
"used": 7,
"period_start": "2024-01-01T00:00:00Z",
"period_end": "2024-12-31T23:59:59Z"
},
"non_recurring_quota": {
"remaining_balance": 50,
"last_updated_at": "2024-01-10T12:00:00Z"
},
"users": [
{
"user_id": 42,
"display_name": "John Doe",
"email": "admin@timelines.ai",
"status": "active",
"created_at": "2024-01-01T10:00:00Z",
"role": "owner"
}
],
"whatsapp_accounts": [
{
"connected": true,
"whatsapp_account_id": 987654321,
"phone_number_e164": "+1234567890",
"connection_status": "connected",
"user_id": "wa_abcdef123456",
"connected_at": "2024-01-15T10:00:00Z"
}
],
"qr_links": [
{
"qr_link": "https://timelines.ai/qr/abcdef123456",
"user_id": 42,
"expires_at": "2024-01-02T10:00:00Z"
}
]
}{
"error": "<string>",
"status": 123,
"description": "<string>"
}Get workspace details
Returns a consolidated, read-only summary of a partner-managed workspace. The payload includes basic workspace identity (workspace_id, display_name), seat allocation and utilization, messaging and API quotas, any non-recurring quota balance, the list of users in the workspace, WhatsApp accounts associated with the workspace, and currently active QR-code links. Only workspaces that are owned by the calling partner and are not -billing managed are eligible. If the workspace does not exist or is not linked to the partner, a 404 error is returned.
curl --request GET \
--url https://app.timelines.ai/partner/api/v1/workspaces/{workspace_id} \
--header 'Authorization: Bearer <token>' \
--header 'X-TL-Partner-Id: <x-tl-partner-id>'import requests
url = "https://app.timelines.ai/partner/api/v1/workspaces/{workspace_id}"
headers = {
"X-TL-Partner-Id": "<x-tl-partner-id>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-TL-Partner-Id': '<x-tl-partner-id>', Authorization: 'Bearer <token>'}
};
fetch('https://app.timelines.ai/partner/api/v1/workspaces/{workspace_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://app.timelines.ai/partner/api/v1/workspaces/{workspace_id}",
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>",
"X-TL-Partner-Id: <x-tl-partner-id>"
],
]);
$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://app.timelines.ai/partner/api/v1/workspaces/{workspace_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-TL-Partner-Id", "<x-tl-partner-id>")
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://app.timelines.ai/partner/api/v1/workspaces/{workspace_id}")
.header("X-TL-Partner-Id", "<x-tl-partner-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.timelines.ai/partner/api/v1/workspaces/{workspace_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-TL-Partner-Id"] = '<x-tl-partner-id>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"workspace_id": "ws_1234567890abcdef",
"display_name": "my-first-workspace",
"seats": {
"total": 10,
"used": 7,
"period_start": "2024-01-01T00:00:00Z",
"period_end": "2024-12-31T23:59:59Z"
},
"messages_quota": {
"total": 10,
"used": 7,
"period_start": "2024-01-01T00:00:00Z",
"period_end": "2024-12-31T23:59:59Z"
},
"api_calls_quota": {
"total": 10,
"used": 7,
"period_start": "2024-01-01T00:00:00Z",
"period_end": "2024-12-31T23:59:59Z"
},
"non_recurring_quota": {
"remaining_balance": 50,
"last_updated_at": "2024-01-10T12:00:00Z"
},
"users": [
{
"user_id": 42,
"display_name": "John Doe",
"email": "admin@timelines.ai",
"status": "active",
"created_at": "2024-01-01T10:00:00Z",
"role": "owner"
}
],
"whatsapp_accounts": [
{
"connected": true,
"whatsapp_account_id": 987654321,
"phone_number_e164": "+1234567890",
"connection_status": "connected",
"user_id": "wa_abcdef123456",
"connected_at": "2024-01-15T10:00:00Z"
}
],
"qr_links": [
{
"qr_link": "https://timelines.ai/qr/abcdef123456",
"user_id": 42,
"expires_at": "2024-01-02T10:00:00Z"
}
]
}{
"error": "<string>",
"status": 123,
"description": "<string>"
}Authorizations
JWT bearer authentication. The token payload must include partner_id, nbf (not-before) and exp (expiry) claims. All Partner API requests must be authenticated with Authorization: Bearer .
Headers
The unique identifier for the partner.
Path Parameters
The unique identifier for the workspace.
Response
Workspace details
Detailed summary of a partner-managed workspace. Combines core workspace identity with seat usage, messaging and Public API quotas, non-recurring quota balances, the list of users, WhatsApp accounts associated with the workspace, and active QR links. Used by partners to monitor utilization and operational health of a workspace in a single call.
Unique identifier for the workspace
"ws_1234567890abcdef"
Workspace display name
"my-first-workspace"
Workspace quota details
Show child attributes
Show child attributes
Workspace quota details
Show child attributes
Show child attributes
Workspace quota details
Show child attributes
Show child attributes
Non-recurring quota information for a workspace. Represents an additional, non-recurring balance (for example, one-off purchased message packs) with the remaining_balance and the timestamp when it was last updated.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes

