curl --request POST \
--url https://app.famulor.io/api/v1/tools/magicline-connect \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"studio_id": "<string>",
"connect_api_base_url": "<string>",
"name": "magicline_connect",
"trainer_mode": "studio_default",
"studio_ids": [
"<string>"
]
}
'import requests
url = "https://app.famulor.io/api/v1/tools/magicline-connect"
payload = {
"studio_id": "<string>",
"connect_api_base_url": "<string>",
"name": "magicline_connect",
"trainer_mode": "studio_default",
"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>',
connect_api_base_url: '<string>',
name: 'magicline_connect',
trainer_mode: 'studio_default',
studio_ids: ['<string>']
})
};
fetch('https://app.famulor.io/api/v1/tools/magicline-connect', 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-connect",
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>',
'connect_api_base_url' => '<string>',
'name' => 'magicline_connect',
'trainer_mode' => 'studio_default',
'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-connect"
payload := strings.NewReader("{\n \"studio_id\": \"<string>\",\n \"connect_api_base_url\": \"<string>\",\n \"name\": \"magicline_connect\",\n \"trainer_mode\": \"studio_default\",\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-connect")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"studio_id\": \"<string>\",\n \"connect_api_base_url\": \"<string>\",\n \"name\": \"magicline_connect\",\n \"trainer_mode\": \"studio_default\",\n \"studio_ids\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/tools/magicline-connect")
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 \"connect_api_base_url\": \"<string>\",\n \"name\": \"magicline_connect\",\n \"trainer_mode\": \"studio_default\",\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 Connect API
Create a studio-specific Magicline Connect API connection with five tools: studio search, studio information, required fields, free trial session slots and confirmed booking. Select one or multiple enabled studios. No Magicline API key is required. Connect API must be enabled for the studio. Caller confirmation is required before booking. Existing Open API and proxy connections are independent. Required scope: assistants:write. Requires an admin-level credential.
curl --request POST \
--url https://app.famulor.io/api/v1/tools/magicline-connect \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"studio_id": "<string>",
"connect_api_base_url": "<string>",
"name": "magicline_connect",
"trainer_mode": "studio_default",
"studio_ids": [
"<string>"
]
}
'import requests
url = "https://app.famulor.io/api/v1/tools/magicline-connect"
payload = {
"studio_id": "<string>",
"connect_api_base_url": "<string>",
"name": "magicline_connect",
"trainer_mode": "studio_default",
"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>',
connect_api_base_url: '<string>',
name: 'magicline_connect',
trainer_mode: 'studio_default',
studio_ids: ['<string>']
})
};
fetch('https://app.famulor.io/api/v1/tools/magicline-connect', 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-connect",
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>',
'connect_api_base_url' => '<string>',
'name' => 'magicline_connect',
'trainer_mode' => 'studio_default',
'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-connect"
payload := strings.NewReader("{\n \"studio_id\": \"<string>\",\n \"connect_api_base_url\": \"<string>\",\n \"name\": \"magicline_connect\",\n \"trainer_mode\": \"studio_default\",\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-connect")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"studio_id\": \"<string>\",\n \"connect_api_base_url\": \"<string>\",\n \"name\": \"magicline_connect\",\n \"trainer_mode\": \"studio_default\",\n \"studio_ids\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.famulor.io/api/v1/tools/magicline-connect")
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 \"connect_api_base_url\": \"<string>\",\n \"name\": \"magicline_connect\",\n \"trainer_mode\": \"studio_default\",\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 supplied by your studio operator.
^[1-9][0-9]{0,18}$Official https://.api.magicline.com/connect/v1 URL. No API key is needed.
Unique tool name, using letters, numbers and underscores.
Trainer preference. Studio default follows studio rules and permits the caller to choose only when allowed. Without a trainer requires studio permission.
studio_default, with_trainer, without_trainer 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