Start here
Read what your plan gives you in Cinema Studio
/v1/studio/planon https://api.auray.ai/v1What your own plan gives you in Cinema Studio, as it is in force now — whether it includes Cinema Studio at all, calls in your projects and publishing them, and its five quotas — how much of them y…
What your own plan gives you in Cinema Studio, as it is in force now — whether it includes Cinema Studio at all, calls in your projects and publishing them, and its five quotas — how much of them you hold, and your three fullest projects measured against them. Only about you: a project someone shares with you is held to its owner's plan, which the project's own plan and limits tell you as far as they bind you, and no other account's plan is ever named. Read it to draw a lock or a count before the press, never to decide one: every write is decided by the plan in force when it is made, and answers studio_not_in_plan or studio_limit_reached (with whose) in its own words. Takes a key holding studio:read (or studio:write, which reads too) — Account offers both unticked — or the desktop's own session key. Spends nothing.
#Authentication
Authorization: Bearer auray_sk_… — a key with the scope the route names.
#Example request
curl https://api.auray.ai/v1/studio/plan \
-H "Authorization: Bearer $AURAY_API_KEY"const res = await fetch("https://api.auray.ai/v1/studio/plan", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.AURAY_API_KEY}` },
});
console.log(await res.json());import os, requests
r = requests.get(
"https://api.auray.ai/v1/studio/plan",
headers={"Authorization": f"Bearer {os.environ['AURAY_API_KEY']}"},
)
r.raise_for_status()
print(r.json())package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://api.auray.ai/v1/studio/plan", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("AURAY_API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}<?php
$ch = curl_init("https://api.auray.ai/v1/studio/plan");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("AURAY_API_KEY"),
],
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), " ", $response, PHP_EOL;require "net/http"
uri = URI("https://api.auray.ai/v1/studio/plan")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("AURAY_API_KEY")}"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
puts res.code, res.bodyimport java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.auray.ai/v1/studio/plan"))
.header("Authorization", "Bearer " + System.getenv("AURAY_API_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}using System.Net.Http.Headers;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("AURAY_API_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Get, "https://api.auray.ai/v1/studio/plan");
using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");#Responses
#200 OK
OK.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
object | string | yes | — | One of "studio_plan". |
figures | object | yes | — | Your plan's eight Cinema Studio figures in force — the plan's own, or an override of ours — the ones GET /v1/plans prints for every plan as limits.studio.*. |
figures.enabled | boolean | yes | — | Whether your plan includes Cinema Studio (studio.enabled). False, you can own nothing new in it — no project, element or preset, no upload for an element (in a project or outside one), and no project handed over to you — and every project you own is read-only; projects others share with you still open, held to their owner's plan. |
figures.calls | boolean | yes | — | Whether a project you own may hold a call (studio.calls). A call there also needs Cinema Studio on your plan and room for two people or more; the project's own plan.calls says all three at once. |
figures.publish | boolean | yes | — | Whether you may publish your projects to the Community, or update a publication (studio.publish). Publishing also needs Cinema Studio on your plan (enabled); the project's own plan.publish says both at once. Withdrawing one never asks. |
figures.max_projects | integer | yes | — | Projects you may own, counted when one is started or taken over (studio.max_projects). 1 to …. |
figures.max_items | integer | yes | — | Items each project you own may hold, the Trash counted (studio.max_items). 1 to …. |
figures.max_elements | integer | yes | — | Elements you may own, every version counted (studio.max_elements). 1 to …. |
figures.max_canvases | integer | yes | — | Canvases each project you own may hold (studio.max_canvases). 1 to …. |
figures.max_members | integer | yes | — | People each project you own may seat, you counted (studio.max_members); 1 is a project for you alone. 1 to …. |
held | object | yes | — | What you hold against your figures, counted as the writes that refuse count. A count above its figure is what a plan moved lower kept: all of it stays and still works, and only what would be new past the figure is refused. |
held.projects | integer | yes | — | Projects you own. 0 to …. |
held.elements | integer | yes | — | Elements you own, every version counted. 0 to …. |
held.read_only | integer | yes | — | How many of your projects are read-only: every one of them while figures.enabled is false, else none. Nothing in them was deleted, and they can still be opened, downloaded, emptied, deleted or handed over. 0 to …. |
fullest | object[] | yes | — | Your three fullest projects by items, the fullest first; empty when you own none. |
fullest[].id | string | yes | — | |
fullest[].name | string | yes | — | |
fullest[].items | integer | yes | — | Items it holds, the Trash counted — measured against figures.max_items. 0 to …. |
fullest[].canvases | integer | yes | — | Canvases it holds — measured against figures.max_canvases. 0 to …. |
fullest[].members | integer | yes | — | People it seats, you counted — measured against figures.max_members. 0 to …. |
request_id | string | no | — | Mirrored in the X-Request-Id header. |
Headers:
| Header | Description |
|---|---|
RateLimit-Limit | Burst capacity. |
RateLimit-Remaining | |
RateLimit-Reset | Seconds until refill. |
X-RateLimit-Limit | |
X-RateLimit-Remaining | |
X-RateLimit-Reset | Unix seconds. The X- spelling is what client libraries read. |
X-Request-Id |
#401 Unauthorized
#403 Forbidden
#429 Too Many Requests
#500 Internal Server Error
#503 Service Unavailable
#Status codes
| Status | Meaning |
|---|---|
200 | OK. |
401 | Unauthorized |
403 | Forbidden |
429 | Too Many Requests |
500 | Internal Server Error |
503 | Service Unavailable |
Every refusal names its code, and every code is explained at Errors.