Start here
Ask to join a project
POST
/v1/studio/access-requestson https://api.auray.ai/v1Ask to join a project, or for a higher role in it.
Ask to join a project, or for a higher role in it. The project is named in the body, and the answer is received alike whether it exists, whether you may see it, and whether you may ask for that role there — a project id is never a way to learn that a private project is there. The members who decide see a real request and are told; you hear back only if it is approved. Takes a key holding studio:write — Account offers it unticked — or the desktop's own session key. Spends nothing.
#Authentication
Authorization: Bearer auray_sk_… — a key with the scope the route names.
#Request
#Body
application/json, required.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
project_id | string | yes | — | |
role | string | yes | — | One of "admin", "collaborator", "viewer". |
message | string | no | — | 0 to 300 characters. May be null. |
#Example request
curl -X POST https://api.auray.ai/v1/studio/access-requests \
-H "Authorization: Bearer $AURAY_API_KEY" \
-H "content-type: application/json" \
-d '{
"project_id": "3f0c8a52-6a1d-4e8b-9c2d-7e5f4a3b2c1d",
"role": "viewer",
"message": "Cutting the trailer, and need the clips."
}'const res = await fetch("https://api.auray.ai/v1/studio/access-requests", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AURAY_API_KEY}`,
"content-type": "application/json",
},
body: JSON.stringify({
"project_id": "3f0c8a52-6a1d-4e8b-9c2d-7e5f4a3b2c1d",
"role": "viewer",
"message": "Cutting the trailer, and need the clips."
}),
});
console.log(await res.json());import os, requests
r = requests.post(
"https://api.auray.ai/v1/studio/access-requests",
headers={"Authorization": f"Bearer {os.environ['AURAY_API_KEY']}"},
json={
"project_id": "3f0c8a52-6a1d-4e8b-9c2d-7e5f4a3b2c1d",
"role": "viewer",
"message": "Cutting the trailer, and need the clips."
},
)
r.raise_for_status()
print(r.json())package main
import (
"bytes"
"fmt"
"io"
"net/http"
"os"
)
func main() {
body := []byte(`{
"project_id": "3f0c8a52-6a1d-4e8b-9c2d-7e5f4a3b2c1d",
"role": "viewer",
"message": "Cutting the trailer, and need the clips."
}`)
req, err := http.NewRequest("POST", "https://api.auray.ai/v1/studio/access-requests", bytes.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("AURAY_API_KEY"))
req.Header.Set("Content-Type", "application/json")
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/access-requests");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("AURAY_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"project_id" => "3f0c8a52-6a1d-4e8b-9c2d-7e5f4a3b2c1d",
"role" => "viewer",
"message" => "Cutting the trailer, and need the clips.",
], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), " ", $response, PHP_EOL;require "net/http"
require "json"
uri = URI("https://api.auray.ai/v1/studio/access-requests")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("AURAY_API_KEY")}"
req["Content-Type"] = "application/json"
req.body = {
"project_id" => "3f0c8a52-6a1d-4e8b-9c2d-7e5f4a3b2c1d",
"role" => "viewer",
"message" => "Cutting the trailer, and need the clips."
}.to_json
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 {
String body = """
{
"project_id": "3f0c8a52-6a1d-4e8b-9c2d-7e5f4a3b2c1d",
"role": "viewer",
"message": "Cutting the trailer, and need the clips."
}""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.auray.ai/v1/studio/access-requests"))
.header("Authorization", "Bearer " + System.getenv("AURAY_API_KEY"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("AURAY_API_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.auray.ai/v1/studio/access-requests");
var body = """
{
"project_id": "3f0c8a52-6a1d-4e8b-9c2d-7e5f4a3b2c1d",
"role": "viewer",
"message": "Cutting the trailer, and need the clips."
}
""";
request.Content = new StringContent(body, Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");#Responses
#201 Created
Created.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
object | string | yes | — | One of "access_request". |
received | boolean | yes | — | One of true. |
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 |
#400 Bad Request
#401 Unauthorized
#403 Forbidden
#409 Conflict
#413 Payload Too Large
#429 Too Many Requests
#500 Internal Server Error
#503 Service Unavailable
#Status codes
| Status | Meaning |
|---|---|
201 | Created. |
400 | Bad Request |
401 | Unauthorized |
403 | Forbidden |
409 | Conflict |
413 | Payload Too Large |
429 | Too Many Requests |
500 | Internal Server Error |
503 | Service Unavailable |
Every refusal names its code, and every code is explained at Errors.