import { OctosparkClient } from '@octospark/sdk'
const client = new OctosparkClient({
token: process.env.OCTOSPARK_TOKEN
})
const response = await client.social.listPosts({
teamId: process.env.OCTOSPARK_TEAM_ID ?? "teamId",
query: {},
})import os
from octospark_sdk import OctosparkClient
client = OctosparkClient(token=os.environ["OCTOSPARK_TOKEN"])
response = client.social.list_posts(
teamId=os.environ.get("OCTOSPARK_TEAM_ID", "teamId")
)octospark posts list \
--request '{"path":{"teamId":"teamId"}}'use reqwest::Client;
use std::env;
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
let client = Client::new();
let base_url = env::var("OCTOSPARK_API_URL").unwrap_or_else(|_| "https://api.octospark.ai".to_string());
let team_id = env::var("OCTOSPARK_TEAM_ID").unwrap_or_else(|_| "teamId".to_string());
let url = format!("{}/v1/teams/{}/posts", base_url.trim_end_matches('/'), team_id);
let token = env::var("OCTOSPARK_TOKEN").expect("OCTOSPARK_TOKEN");
let mut request = client.get(url).bearer_auth(token);
let response = request.send().await?;
println!("{}", response.text().await?);
Ok(())
}import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
Future<void> main() async {
final baseUrl = Platform.environment['OCTOSPARK_API_URL'] ?? 'https://api.octospark.ai';
final token = Platform.environment['OCTOSPARK_TOKEN'];
final teamId = Platform.environment['OCTOSPARK_TEAM_ID'] ?? 'teamId';
final url = '${baseUrl.replaceFirst(RegExp(r'/$'), '')}/v1/teams/$teamId/posts';
final uri = Uri.parse(url);
final headers = {
'Authorization': 'Bearer $token',
};
final response = await http.get(
uri,
headers: headers,
);
print(response.body);
}curl --request GET \
--url https://api-staging.octospark.ai/v1/teams/{teamId}/posts \
--header 'Authorization: Bearer <token>'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-staging.octospark.ai/v1/teams/{teamId}/posts",
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>"
],
]);
$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://api-staging.octospark.ai/v1/teams/{teamId}/posts"
req, _ := http.NewRequest("GET", url, nil)
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://api-staging.octospark.ai/v1/teams/{teamId}/posts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-staging.octospark.ai/v1/teams/{teamId}/posts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body$headers=@{}
$headers.Add("Authorization", "Bearer <token>")
$response = Invoke-WebRequest -Uri 'https://api-staging.octospark.ai/v1/teams/{teamId}/posts' -Method GET -Headers $headersimport Foundation
let url = URL(string: "https://api-staging.octospark.ai/v1/teams/{teamId}/posts")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.timeoutInterval = 10
request.allHTTPHeaderFields = ["Authorization": "Bearer <token>"]
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self))using RestSharp;
var options = new RestClientOptions("https://api-staging.octospark.ai/v1/teams/{teamId}/posts");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
using RestSharp;
var options = new RestClientOptions("https://api-staging.octospark.ai/v1/teams/{teamId}/posts");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, stdout);
curl_easy_setopt(hnd, CURLOPT_URL, "https://api-staging.octospark.ai/v1/teams/{teamId}/posts");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);
CURLcode ret = curl_easy_perform(hnd);CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, stdout);
curl_easy_setopt(hnd, CURLOPT_URL, "https://api-staging.octospark.ai/v1/teams/{teamId}/posts");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);
CURLcode ret = curl_easy_perform(hnd);val client = OkHttpClient()
val request = Request.Builder()
.url("https://api-staging.octospark.ai/v1/teams/{teamId}/posts")
.get()
.addHeader("Authorization", "Bearer <token>")
.build()
val response = client.newCall(request).execute(){
"data": [
{
"id": "3c9d8e7f-6a5b-4c3d-9e2f-1a0b9c8d7e6f",
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"postType": "text_post",
"artifactKind": "slideshow",
"title": "<string>",
"status": "draft",
"workflowStatusId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"text": "<string>",
"assetIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"media": [
{
"assetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"mimeType": "<string>",
"displayName": "<string>",
"thumbnailPath": "<string>"
}
],
"assetTags": [
"launch",
"product"
],
"userTags": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"colour": "<string>"
}
],
"assignees": [
{
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"email": "<string>"
}
],
"contentPayloadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"latestScheduledPost": {
"id": "7f3a2b10-9c4d-4e5f-8a6b-1c2d3e4f5a6b",
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"contentItemId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"socialAccountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"provider": "x",
"status": "scheduled",
"scheduledAt": "2026-06-15T09:00:00.000Z",
"timezone": "Europe/London",
"platformPostId": "<string>",
"platformSettings": {},
"publishResults": {},
"providerPublishState": {
"provider": "x",
"status": "not_started",
"requiresPolling": true,
"publishId": "<string>",
"platformPostId": "<string>",
"providerStatus": "<string>",
"pollingReason": "<string>",
"uploadProgress": {
"nextByteStart": 123,
"uploadSize": 123
},
"failureCode": "<string>",
"failureCategory": "rate_limited"
},
"errorCode": "<string>",
"errorMessage": "<string>",
"errorCategory": "rate_limited",
"workflowId": "<string>",
"workflowRunId": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>"
},
"scheduledDestinationAccountIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"draftDestinationAccountIds": [
"0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d"
],
"saveDestination": "queue",
"saveMessage": "Saved to Queue",
"createdAt": "<string>",
"updatedAt": "<string>",
"postInput": {
"kind": "atomic",
"text": "<string>",
"attachments": [
{
"kind": "media",
"asset": {
"assetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"mimeType": "<string>",
"byteSize": 123,
"width": 123,
"height": 123,
"durationSeconds": 123,
"thumbnailUrl": "<string>",
"altText": "<string>"
},
"mediaType": "image",
"altText": "<string>"
}
],
"videoVariant": "green_screen_meme"
},
"postPublishActions": {
"firstComment": {
"text": "<string>",
"mediaIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
},
"engagementCommentTrigger": {
"likeThreshold": 2,
"windowHours": 360,
"comment": {
"text": "<string>",
"mediaIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
},
"repostAfter": {
"offsetDays": 15,
"mode": "retweet",
"text": "<string>"
},
"recurrenceIntervalDays": 183,
"recurrenceEndsAt": "<string>"
}
}
],
"total": 123,
"nextCursor": "<string>",
"prevCursor": "<string>"
}{
"issues": [
{
"_tag": "Pointer",
"path": [
"<string>"
],
"message": "<string>"
}
],
"message": "<string>",
"_tag": "HttpApiDecodeError"
}{
"message": "<string>",
"_tag": "Unauthorized"
}{
"message": "<string>",
"_tag": "PaymentRequired"
}{
"message": "<string>",
"_tag": "Forbidden"
}{
"message": "<string>",
"_tag": "NotFound"
}{
"message": "<string>",
"_tag": "Conflict",
"code": "<string>",
"currentRevision": 123
}{
"message": "<string>",
"code": "<string>",
"_tag": "UnprocessableEntity"
}{
"message": "<string>",
"_tag": "TooManyRequests",
"code": "<string>",
"retryAfterSeconds": 123
}{
"message": "<string>",
"_tag": "InternalError"
}List posts
List a team’s posts with cursor pagination, newest first by default. Filter by status, provider, scheduled window, free-text search, and enrichment facets; combine filters to narrow results. Use this to find a post id before scheduling, publishing, updating, or deleting.
import { OctosparkClient } from '@octospark/sdk'
const client = new OctosparkClient({
token: process.env.OCTOSPARK_TOKEN
})
const response = await client.social.listPosts({
teamId: process.env.OCTOSPARK_TEAM_ID ?? "teamId",
query: {},
})import os
from octospark_sdk import OctosparkClient
client = OctosparkClient(token=os.environ["OCTOSPARK_TOKEN"])
response = client.social.list_posts(
teamId=os.environ.get("OCTOSPARK_TEAM_ID", "teamId")
)octospark posts list \
--request '{"path":{"teamId":"teamId"}}'use reqwest::Client;
use std::env;
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
let client = Client::new();
let base_url = env::var("OCTOSPARK_API_URL").unwrap_or_else(|_| "https://api.octospark.ai".to_string());
let team_id = env::var("OCTOSPARK_TEAM_ID").unwrap_or_else(|_| "teamId".to_string());
let url = format!("{}/v1/teams/{}/posts", base_url.trim_end_matches('/'), team_id);
let token = env::var("OCTOSPARK_TOKEN").expect("OCTOSPARK_TOKEN");
let mut request = client.get(url).bearer_auth(token);
let response = request.send().await?;
println!("{}", response.text().await?);
Ok(())
}import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
Future<void> main() async {
final baseUrl = Platform.environment['OCTOSPARK_API_URL'] ?? 'https://api.octospark.ai';
final token = Platform.environment['OCTOSPARK_TOKEN'];
final teamId = Platform.environment['OCTOSPARK_TEAM_ID'] ?? 'teamId';
final url = '${baseUrl.replaceFirst(RegExp(r'/$'), '')}/v1/teams/$teamId/posts';
final uri = Uri.parse(url);
final headers = {
'Authorization': 'Bearer $token',
};
final response = await http.get(
uri,
headers: headers,
);
print(response.body);
}curl --request GET \
--url https://api-staging.octospark.ai/v1/teams/{teamId}/posts \
--header 'Authorization: Bearer <token>'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-staging.octospark.ai/v1/teams/{teamId}/posts",
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>"
],
]);
$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://api-staging.octospark.ai/v1/teams/{teamId}/posts"
req, _ := http.NewRequest("GET", url, nil)
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://api-staging.octospark.ai/v1/teams/{teamId}/posts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-staging.octospark.ai/v1/teams/{teamId}/posts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body$headers=@{}
$headers.Add("Authorization", "Bearer <token>")
$response = Invoke-WebRequest -Uri 'https://api-staging.octospark.ai/v1/teams/{teamId}/posts' -Method GET -Headers $headersimport Foundation
let url = URL(string: "https://api-staging.octospark.ai/v1/teams/{teamId}/posts")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.timeoutInterval = 10
request.allHTTPHeaderFields = ["Authorization": "Bearer <token>"]
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self))using RestSharp;
var options = new RestClientOptions("https://api-staging.octospark.ai/v1/teams/{teamId}/posts");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
using RestSharp;
var options = new RestClientOptions("https://api-staging.octospark.ai/v1/teams/{teamId}/posts");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, stdout);
curl_easy_setopt(hnd, CURLOPT_URL, "https://api-staging.octospark.ai/v1/teams/{teamId}/posts");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);
CURLcode ret = curl_easy_perform(hnd);CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, stdout);
curl_easy_setopt(hnd, CURLOPT_URL, "https://api-staging.octospark.ai/v1/teams/{teamId}/posts");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer <token>");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);
CURLcode ret = curl_easy_perform(hnd);val client = OkHttpClient()
val request = Request.Builder()
.url("https://api-staging.octospark.ai/v1/teams/{teamId}/posts")
.get()
.addHeader("Authorization", "Bearer <token>")
.build()
val response = client.newCall(request).execute(){
"data": [
{
"id": "3c9d8e7f-6a5b-4c3d-9e2f-1a0b9c8d7e6f",
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"postType": "text_post",
"artifactKind": "slideshow",
"title": "<string>",
"status": "draft",
"workflowStatusId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"text": "<string>",
"assetIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"media": [
{
"assetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"mimeType": "<string>",
"displayName": "<string>",
"thumbnailPath": "<string>"
}
],
"assetTags": [
"launch",
"product"
],
"userTags": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"colour": "<string>"
}
],
"assignees": [
{
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"email": "<string>"
}
],
"contentPayloadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"latestScheduledPost": {
"id": "7f3a2b10-9c4d-4e5f-8a6b-1c2d3e4f5a6b",
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"contentItemId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"socialAccountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"provider": "x",
"status": "scheduled",
"scheduledAt": "2026-06-15T09:00:00.000Z",
"timezone": "Europe/London",
"platformPostId": "<string>",
"platformSettings": {},
"publishResults": {},
"providerPublishState": {
"provider": "x",
"status": "not_started",
"requiresPolling": true,
"publishId": "<string>",
"platformPostId": "<string>",
"providerStatus": "<string>",
"pollingReason": "<string>",
"uploadProgress": {
"nextByteStart": 123,
"uploadSize": 123
},
"failureCode": "<string>",
"failureCategory": "rate_limited"
},
"errorCode": "<string>",
"errorMessage": "<string>",
"errorCategory": "rate_limited",
"workflowId": "<string>",
"workflowRunId": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>"
},
"scheduledDestinationAccountIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"draftDestinationAccountIds": [
"0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d"
],
"saveDestination": "queue",
"saveMessage": "Saved to Queue",
"createdAt": "<string>",
"updatedAt": "<string>",
"postInput": {
"kind": "atomic",
"text": "<string>",
"attachments": [
{
"kind": "media",
"asset": {
"assetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"mimeType": "<string>",
"byteSize": 123,
"width": 123,
"height": 123,
"durationSeconds": 123,
"thumbnailUrl": "<string>",
"altText": "<string>"
},
"mediaType": "image",
"altText": "<string>"
}
],
"videoVariant": "green_screen_meme"
},
"postPublishActions": {
"firstComment": {
"text": "<string>",
"mediaIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
},
"engagementCommentTrigger": {
"likeThreshold": 2,
"windowHours": 360,
"comment": {
"text": "<string>",
"mediaIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
},
"repostAfter": {
"offsetDays": 15,
"mode": "retweet",
"text": "<string>"
},
"recurrenceIntervalDays": 183,
"recurrenceEndsAt": "<string>"
}
}
],
"total": 123,
"nextCursor": "<string>",
"prevCursor": "<string>"
}{
"issues": [
{
"_tag": "Pointer",
"path": [
"<string>"
],
"message": "<string>"
}
],
"message": "<string>",
"_tag": "HttpApiDecodeError"
}{
"message": "<string>",
"_tag": "Unauthorized"
}{
"message": "<string>",
"_tag": "PaymentRequired"
}{
"message": "<string>",
"_tag": "Forbidden"
}{
"message": "<string>",
"_tag": "NotFound"
}{
"message": "<string>",
"_tag": "Conflict",
"code": "<string>",
"currentRevision": 123
}{
"message": "<string>",
"code": "<string>",
"_tag": "UnprocessableEntity"
}{
"message": "<string>",
"_tag": "TooManyRequests",
"code": "<string>",
"retryAfterSeconds": 123
}{
"message": "<string>",
"_tag": "InternalError"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Team (workspace) id (UUID). Discover ids via the list teams endpoint or the agent context.
Query Parameters
Opaque pagination cursor from the previous page response (nextCursor/prevCursor); omit to start at the first page.
Page size as a positive integer string; defaults to 25, capped at 100.
"25"
"100"
Field to sort by; each endpoint accepts its own allowlist and defaults to createdAt.
"createdAt"
Sort direction: asc or desc; defaults to desc.
asc, desc Filter to posts with this editorial status.
idea, proposed_render, draft, in_review, approved, rejected, archived, deleted "draft"
Filter to posts assigned to this workspace-defined content workflow status.
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$Filter to posts whose latest scheduled post targets this provider.
x, tiktok, instagram, facebook, youtube, linkedin, threads, pinterest "x"
Only include posts scheduled at or after this ISO 8601 timestamp.
"2026-06-01T00:00:00Z"
Only include posts scheduled at or before this ISO 8601 timestamp.
"2026-06-30T23:59:59Z"
Case-insensitive free-text search over the post title and latest payload text.
"product launch"
Filter to posts of this content format.
text_post, text_image, text_video, carousel "text_image"
Queue/Drafts/Sent tab over the derived latest-scheduled-post status: queue = scheduled/publishing/failed, sent = published, drafts = never scheduled or a draft/cancelled latest scheduled post.
queue, drafts, sent "queue"
CSV of user-tag UUIDs from the post_tags registry; matches posts assigned ANY of these tags. Unknown or foreign ids are ignored.
"4a1f4e93-0d8b-4a6c-9a44-1e8b1f2c3d4e,7b2c5f81-3e9d-4b7a-8c55-2f9c2a3b4c5d"
Assignee quick filter: me = posts assigned to the calling user, unassigned = posts with no assignees.
me, unassigned "me"
Comma-separated AI tags; matches posts whose assets carry any of the listed tags (OR).
"launch,product"
Comma-separated AI content categories; matches posts in any of the listed categories (OR).
"education"
Comma-separated AI purposes; matches posts whose assets carry any of the listed purposes (OR).
"promotion"
Comma-separated AI emotions; matches posts tagged with any of the listed emotions (OR).
"joy"
Comma-separated media types; each value one of: image, video, audio, gif, document.
"image,video"
Comma-separated AI enrichment statuses; each value one of: pending, processing, completed, failed.
"completed"