curl --request POST \
--url https://app.famulor.io/api/v1/tools/magicline \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"studio_id": "<string>",
"api_key": "<string>",
"name": "magicline",
"api_base_url": "<string>",
"studio_ids": [
"<string>"
]
}
'import requests
url = "https://app.famulor.io/api/v1/tools/magicline"
payload = {
"studio_id": "<string>",
"api_key": "<string>",
"name": "magicline",
"api_base_url": "<string>",
"studio_ids": ["<string>"]
}
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({
studio_id: '<string>',
api_key: '<string>',
name: 'magicline',
api_base_url: '<string>',
studio_ids: ['<string>']
})
};
fetch('https://app.famulor.io/api/v1/tools/magicline', 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://app.famulor.io/api/v1/tools/magicline",
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([
'studio_id' => '<string>',
'api_key' => '<string>',
'name' => 'magicline',
'api_base_url' => '<string>',
'studio_ids' => [
'<string>'
]
]),
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://app.famulor.io/api/v1/tools/magicline"
payload := strings.NewReader("{\n \"studio_id\": \"<string>\",\n \"api_key\": \"<string>\",\n \"name\": \"magicline\",\n \"api_base_url\": \"<string>\",\n \"studio_ids\": [\n \"<string>\"\n ]\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://app.famulor.io/api/v1/tools/magicline")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"studio_id\": \"<string>\",\n \"api_key\": \"<string>\",\n \"name\": \"magicline\",\n \"api_base_url\": \"<string>\",\n \"studio_ids\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/tools/magicline")
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 \"studio_id\": \"<string>\",\n \"api_key\": \"<string>\",\n \"name\": \"magicline\",\n \"api_base_url\": \"<string>\",\n \"studio_ids\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"description": "<string>",
"type": "mcp",
"config": {},
"is_active": true,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"nativeIntegration": "shopify"
}
}Connect Magicline Open API
Validate studio access and create a reusable Magicline MCP connection with six read functions and distinct tool names per studio. Supply the official Open API URL and matching studio key. Omitting the URL selects the existing AI-Fitness proxy. Additional reads depend on provider access; writes are unavailable. Use updateTool for selection and the assistant tools endpoint for assignment. Required scope: assistants:write. Requires an admin-level credential.
curl --request POST \
--url https://app.famulor.io/api/v1/tools/magicline \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"studio_id": "<string>",
"api_key": "<string>",
"name": "magicline",
"api_base_url": "<string>",
"studio_ids": [
"<string>"
]
}
'import requests
url = "https://app.famulor.io/api/v1/tools/magicline"
payload = {
"studio_id": "<string>",
"api_key": "<string>",
"name": "magicline",
"api_base_url": "<string>",
"studio_ids": ["<string>"]
}
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({
studio_id: '<string>',
api_key: '<string>',
name: 'magicline',
api_base_url: '<string>',
studio_ids: ['<string>']
})
};
fetch('https://app.famulor.io/api/v1/tools/magicline', 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://app.famulor.io/api/v1/tools/magicline",
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([
'studio_id' => '<string>',
'api_key' => '<string>',
'name' => 'magicline',
'api_base_url' => '<string>',
'studio_ids' => [
'<string>'
]
]),
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://app.famulor.io/api/v1/tools/magicline"
payload := strings.NewReader("{\n \"studio_id\": \"<string>\",\n \"api_key\": \"<string>\",\n \"name\": \"magicline\",\n \"api_base_url\": \"<string>\",\n \"studio_ids\": [\n \"<string>\"\n ]\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://app.famulor.io/api/v1/tools/magicline")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"studio_id\": \"<string>\",\n \"api_key\": \"<string>\",\n \"name\": \"magicline\",\n \"api_base_url\": \"<string>\",\n \"studio_ids\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/tools/magicline")
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 \"studio_id\": \"<string>\",\n \"api_key\": \"<string>\",\n \"name\": \"magicline\",\n \"api_base_url\": \"<string>\",\n \"studio_ids\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"description": "<string>",
"type": "mcp",
"config": {},
"is_active": true,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"nativeIntegration": "shopify"
}
}Authorizations
API key (fam_..., created under Settings → API Keys) or an OAuth 2.0 access token (fam_at_...). REST operations also require API Access for the credential's workspace. Keys can be restricted to scopes such as assistants:read, calls:write, campaigns:write, automations:read, dashboards:read, dashboards:write, leads:write, segments:write, loop:read, loop:write, phone_numbers:write, sip_trunks:write, knowledge:write, voices:read, billing:read, billing:write, settings:write, platform:read, platform:write; a *:write scope implies the matching *:read. Automation and dashboard endpoints also accept the legacy calls:* scope. Keys without scope restrictions have full access within the workspace's available capabilities.
Body
Numeric studio ID provided by your fitness operator.
^[1-9][0-9]{0,18}$Studio-scoped Magicline Open API key, or an AI-Fitness proxy key when no API URL is supplied. Never returned.
Unique tool name, using letters, numbers and underscores.
Official https://.open-api.magicline.com/v1 URL from the Magicline activation email. Omit only for an AI-Fitness proxy key.
Optional enabled studio IDs. Includes studio_id automatically. Use discovered IDs. Open API multi-studio mode requires a shared proxy key; native per-studio keys remain separate.
500^[1-9][0-9]{0,18}$Response
Created. Secret values are masked.
A reusable tool of the account. Secret values inside config (auth values, header values) are always masked as •••.
Show child attributes
Show child attributes