curl --request POST \
--url https://origami.chat/api/v2/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"monthlyCredits": 50000000
}
'import requests
url = "https://origami.chat/api/v2/projects"
payload = {
"name": "<string>",
"monthlyCredits": 50000000
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: '<string>', monthlyCredits: 50000000})
};
fetch('https://origami.chat/api/v2/projects', 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://origami.chat/api/v2/projects",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'monthlyCredits' => 50000000
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://origami.chat/api/v2/projects"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"monthlyCredits\": 50000000\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://origami.chat/api/v2/projects")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"monthlyCredits\": 50000000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://origami.chat/api/v2/projects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"monthlyCredits\": 50000000\n}"
response = http.request(request)
puts response.read_body{
"object": "project",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"monthlyCredits": 50000000.5,
"enforcement": "hard",
"usage": {
"spent": 123,
"reserved": 123
},
"createdAt": "2023-11-07T05:31:56Z"
}Create a project (child org)
Creates a project under the API key’s parent org.
monthlyCredits is the optional per-project budget cap in
credits; null or omitted means uncapped. A child org’s key
cannot create projects (nesting is one level deep) →
400 PARENT_REQUIRED.
curl --request POST \
--url https://origami.chat/api/v2/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"monthlyCredits": 50000000
}
'import requests
url = "https://origami.chat/api/v2/projects"
payload = {
"name": "<string>",
"monthlyCredits": 50000000
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: '<string>', monthlyCredits: 50000000})
};
fetch('https://origami.chat/api/v2/projects', 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://origami.chat/api/v2/projects",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'monthlyCredits' => 50000000
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://origami.chat/api/v2/projects"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"monthlyCredits\": 50000000\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://origami.chat/api/v2/projects")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"monthlyCredits\": 50000000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://origami.chat/api/v2/projects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"monthlyCredits\": 50000000\n}"
response = http.request(request)
puts response.read_body{
"object": "project",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"monthlyCredits": 50000000.5,
"enforcement": "hard",
"usage": {
"spent": 123,
"reserved": 123
},
"createdAt": "2023-11-07T05:31:56Z"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Transport-level replay protection: any v2 POST may send it
(1-255 printable ASCII characters; UUIDs recommended). The first
response for a key is recorded and replayed verbatim for retries
with the same key + method/path/body for 24 hours; replayed
responses carry the Idempotency-Replay: true response header.
Reusing a key with a different request, or retrying while the
original is still in flight, returns 409 IDEMPOTENCY_ERROR.
5xx responses are never recorded (the retry re-executes).
1 - 255^[\x21-\x7e]{1,255}$Body
Response
The created project.
A project is a child org under the parent (agency) org: a
customer's own isolated set of workspaces/tables while credits
and the concurrency pool stay shared at the parent. Select it on
any non-/projects request via the x-origami-project header.
"project"Monthly budget cap in credits, or null when uncapped.
1 <= x <= 100000000How the monthlyCredits cap is enforced - hard blocks new spend once the cap is reached, soft only tracks. null when the project is uncapped (nothing to enforce).
hard, soft This billing period's settled spend plus live in-flight reservations attributed to the project, in credits; the same numbers the in-app Teams page shows.
Show child attributes
Show child attributes