curl --request POST \
--url https://api.recoupable.dev/api/organizations/professionals \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"mode": "new",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"roles": [],
"confirmed": true,
"roster_intent": "add",
"professional_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://api.recoupable.dev/api/organizations/professionals"
payload = {
"mode": "new",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"roles": [],
"confirmed": True,
"roster_intent": "add",
"professional_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
mode: 'new',
organization_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
idempotency_key: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
name: '<string>',
roles: [],
confirmed: true,
roster_intent: 'add',
professional_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://api.recoupable.dev/api/organizations/professionals', 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://api.recoupable.dev/api/organizations/professionals",
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([
'mode' => 'new',
'organization_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'idempotency_key' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'name' => '<string>',
'roles' => [
],
'confirmed' => true,
'roster_intent' => 'add',
'professional_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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://api.recoupable.dev/api/organizations/professionals"
payload := strings.NewReader("{\n \"mode\": \"new\",\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"idempotency_key\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"roles\": [],\n \"confirmed\": true,\n \"roster_intent\": \"add\",\n \"professional_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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://api.recoupable.dev/api/organizations/professionals")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"mode\": \"new\",\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"idempotency_key\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"roles\": [],\n \"confirmed\": true,\n \"roster_intent\": \"add\",\n \"professional_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.recoupable.dev/api/organizations/professionals")
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 \"mode\": \"new\",\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"idempotency_key\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"roles\": [],\n \"confirmed\": true,\n \"roster_intent\": \"add\",\n \"professional_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"professional": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"roles": [
"songwriter"
],
"confirmed_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"confirmation_basis": "operator_confirmed",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"created": true
}{
"professional": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"roles": [
"songwriter"
],
"confirmed_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"confirmation_basis": "operator_confirmed",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"created": true
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Confirm Professional Roster Addition
Requires explicit operator identity confirmation and organization roster intent. Use new only after confirming a distinct professional, including resolving same-name candidates; never infer identity from a name. Use existing with a professional_id from this organization to add roles without renaming. Both songwriter and producer can belong to one record. This operation creates no login account, shared canonical identity, catalog rights, enrichment job, or cross-workspace context. Research/name intake alone never calls this operation. Membership is rechecked before idempotency replay. Legacy MCP equivalent (API key or Privy token): confirm_professional_roster. Not exposed through delegated OAuth MCP. Returns the original saved response on retry, including its created flag and original status (201 for a new record, 200 for an existing record).
curl --request POST \
--url https://api.recoupable.dev/api/organizations/professionals \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"mode": "new",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"roles": [],
"confirmed": true,
"roster_intent": "add",
"professional_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://api.recoupable.dev/api/organizations/professionals"
payload = {
"mode": "new",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"roles": [],
"confirmed": True,
"roster_intent": "add",
"professional_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
mode: 'new',
organization_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
idempotency_key: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
name: '<string>',
roles: [],
confirmed: true,
roster_intent: 'add',
professional_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://api.recoupable.dev/api/organizations/professionals', 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://api.recoupable.dev/api/organizations/professionals",
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([
'mode' => 'new',
'organization_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'idempotency_key' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'name' => '<string>',
'roles' => [
],
'confirmed' => true,
'roster_intent' => 'add',
'professional_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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://api.recoupable.dev/api/organizations/professionals"
payload := strings.NewReader("{\n \"mode\": \"new\",\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"idempotency_key\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"roles\": [],\n \"confirmed\": true,\n \"roster_intent\": \"add\",\n \"professional_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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://api.recoupable.dev/api/organizations/professionals")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"mode\": \"new\",\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"idempotency_key\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"roles\": [],\n \"confirmed\": true,\n \"roster_intent\": \"add\",\n \"professional_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.recoupable.dev/api/organizations/professionals")
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 \"mode\": \"new\",\n \"organization_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"idempotency_key\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"name\": \"<string>\",\n \"roles\": [],\n \"confirmed\": true,\n \"roster_intent\": \"add\",\n \"professional_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"professional": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"roles": [
"songwriter"
],
"confirmed_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"confirmation_basis": "operator_confirmed",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"created": true
}{
"professional": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"roles": [
"songwriter"
],
"confirmed_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"confirmation_basis": "operator_confirmed",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"created": true
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
- Option 1
- Option 2
new Generate once per deliberate operation. Persist and reuse after a timeout or lost response. Scoped to the organization and actor. Different input with the same key is rejected.
2 - 2001 - 2 elementssongwriter, producer true add Was this page helpful?
