Start here
Read a published project
/v1/community/profiles/{handle}/projects/{slug}on https://api.auray.ai/v1A published Cinema Studio project's page, under its author's profile: its cover and film, its words, its info card (views, generations, credits spent while its author shows them, size, dates), its …
A published Cinema Studio project's page, under its author's profile: its cover and film, its words, its info card (views, generations, credits spent while its author shows them, size, dates), its Stack, its folders, and its canvases while its author shows them — read-only, as a reader may see them. Shown once published, whether or not our team approved it for the feeds; a hidden, withdrawn or removed one answers 404 except to its author. A handle its creator replaced within the hold still leads here, with moved_from. Takes no key. A key that holds community:write reads as its account — its likes filled in, and its author told where it stands in mine — and any other key reads what a stranger reads; either way a request with a key is answered for itself alone and kept in no shared cache. An answer without a key is the same for every reader, its request_id included — which names the request that filled the edge's copy — and carries no RateLimit-* headers, since they would describe that request's sender. Cached at the edge for thirty seconds with two minutes of stale service.
#Authentication
No key needed — this document is public.
#Request
#Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
handle | string | yes | The author's handle, with or without its @. |
slug | string | yes | 0 to 60 characters. |
#Example request
curl https://api.auray.ai/v1/community/profiles/ada/projects/…import { createClient } from "@auray/client";
const auray = createClient(); // this route needs no key
const answer = await auray.platform.community.projects.get("ada", "…");
console.dir(answer, { depth: null });from auray_client import Client
auray = Client() # this route needs no key
answer = auray.platform.community.projects.get("ada", "…")
print(answer)const res = await fetch("https://api.auray.ai/v1/community/profiles/ada/projects/…", {
method: "GET",
});
console.log(await res.json());import requests
r = requests.get(
"https://api.auray.ai/v1/community/profiles/ada/projects/…",
)
r.raise_for_status()
print(r.json())package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.auray.ai/v1/community/profiles/ada/projects/…", nil)
if err != nil {
panic(err)
}
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/community/profiles/ada/projects/…");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), " ", $response, PHP_EOL;require "net/http"
uri = URI("https://api.auray.ai/v1/community/profiles/ada/projects/…")
req = Net::HTTP::Get.new(uri)
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/community/profiles/ada/projects/…"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Get, "https://api.auray.ai/v1/community/profiles/ada/projects/…");
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 "project_page". |
publication_id | string | yes | — | The work it is: like, comment, report and count a view by this id. |
slug | string | yes | — | |
title | string | yes | — | |
description | string | yes | — | May be null. |
category | string | yes | — | One of "film", "short", "series", "trailer", "commercial", "music_video", "animation", "documentary", "fashion", "game", "worldbuilding", "experimental", "other". |
author | object or null | yes | — | |
cover | object[] | yes | — | The cover's files. |
cover[].role | string | yes | — | primary is the work as it was made; the rest are what the feeds draw: an image's thumbnail, a video's or a model's poster and thumbnail, a song's waveform (JSON: {version, peaks}). One of "primary", "poster", "preview", "thumbnail", "waveform". |
cover[].position | integer | yes | — | |
cover[].url | string | yes | — | Where to load it. Kept until its author unpublishes the work. A URL. |
cover[].content_type | string | yes | — | |
cover[].width | integer | yes | — | May be null. |
cover[].height | integer | yes | — | May be null. |
cover[].duration_ms | integer | yes | — | May be null. |
cover[].supplied | boolean | yes | — | True for a poster, or its thumbnail, that the work's author supplied rather than one our services made: it is not what the model made, and the work's ai_generated does not describe it. |
film | object[] or null | yes | — | The film its player shows: the cover when it is a clip — and, once the project shows an exported film, only that film. A film withheld is never replaced by another clip: the page is then drawn by its cover as a picture. |
folders | object[] | yes | — | |
folders[].id | string | yes | — | all, generations, uploads, or a member's folder's public id: the folder its assets are read by. |
folders[].name | string | yes | — | May be null. |
folders[].system | string | yes | — | One of "all", "generations", "uploads", null. May be null. |
folders[].count | integer | yes | — | 0 to …. |
counts | object | yes | — | |
counts.likes | integer | yes | — | |
counts.views | integer | yes | — | Counted once a day per visitor. |
counts.comments | integer | yes | — | |
counts.remixes | integer | yes | — | |
liked | boolean | yes | — | May be null. |
info | object | yes | — | |
info.views | integer | yes | — | 0 to …. |
info.generations | integer | yes | — | 0 to …. |
info.credits_spent | integer | yes | — | What its generations cost in credits. Always null for now: a published work's cost is not shown. May be null. |
info.bytes | integer | yes | — | 0 to …. |
info.created_at | string | yes | — | When the project was made. |
info.published_at | string | yes | — | |
info.updated_at | string | yes | — | When it was last published again. May be null. |
stack | object[] | yes | — | |
stack[].model | object | yes | — | |
stack[].model.address | string | yes | — | The model address it was made with, as GET /v1/models lists it: the path a job is submitted to, such as auray-ai/krea-2-turbo/text-to-image. May be null. |
stack[].model.id | string | yes | — | The same model's id, as GET /v1/models lists it: the catalogue slug, such as krea2. May be null. |
stack[].model.label | string | yes | — | The model's name, as a person reads it. May be null. |
stack[].tenths | integer | yes | — | Its share in tenths of a percent; the bands of one Stack add up to exactly 1000. 0 to 1000. |
stack[].percent | number | yes | — | tenths / 10, for display only. |
stack[].count | integer | yes | — | 0 to …. |
stack[].color | string | yes | — | |
stack[].other | boolean | yes | — | The band that gathers every model past the top ones. |
powered_by | string | yes | — | One of "cinema_studio". |
show_prompts | boolean | yes | — | |
show_canvas | boolean | yes | — | |
canvases | object[] or null | yes | — | Only while its author shows canvases. |
listed | boolean | yes | — | The public feeds hold it: published, approved, discoverable. |
snapshot_id | string | yes | — | The snapshot "View full project" opens, read-only. |
licence_version | string | yes | — | May be null. |
published_at | string | yes | — | |
url | string | yes | — | A URL. |
moved_from | string | no | — | The handle asked for, when its creator replaced it within the hold. |
mine | object | no | — | Where an author's own work stands and why. Only ever answered to its author. |
mine.state | string | yes | — | published is shown on the profile and at its link; hidden while a severe report is reviewed; withdrawn unpublished while a report held it; removed taken down by our team; staging while its files are copied. One of "staging", "published", "hidden", "withdrawn", "removed". |
mine.state_reason | string | yes | — | Why our team hid or removed it. May be null. |
mine.approval | string | yes | — | Whether it is in the public feeds and search. Approval gates the feeds only — never the profile or the link. One of "pending", "approved", "rejected". |
mine.approval_reason | string | yes | — | Why our team declined it for the feeds. May be null. |
mine.discoverable | boolean | yes | — | The author lets it into the public feeds once approved. |
mine.profile_pinned | boolean | yes | — | |
mine.held | boolean | yes | — | An open report holds it: it is kept until the report is decided. |
mine.licence_version | string | no | — | The Terms version whose display and remix licences were granted. |
mine.created_at | string | yes | — | |
request_id | string | no | — |
Headers:
| Header | Description |
|---|---|
Cache-Control | public, s-maxage=30, stale-while-revalidate=120 with no key; private, no-store with one. |
Vary | Authorization. |
RateLimit-Limit | Burst capacity, per key, on an answer to a key. An answer without one is cached at the edge and carries none of the RateLimit-* headers; a refusal without one, which is never cached, carries its address's. |
RateLimit-Remaining | |
RateLimit-Reset | Seconds until refill. |
X-Request-Id |
#401 Unauthorized
#403 Forbidden
#404 Not Found
#429 Too Many Requests
#503 Service Unavailable
#Status codes
| Status | Meaning |
|---|---|
200 | OK. |
401 | Unauthorized |
403 | Forbidden |
404 | Not Found |
429 | Too Many Requests |
503 | Service Unavailable |
Every refusal names its code, and every code is explained at Errors.