cURL
curl --request POST \
--url https://api.teamfollowup.ai/api/v2/projects/native \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"businessName": "Riverside Dental",
"timezone": "America/New_York"
}'import requests
url = "https://api.teamfollowup.ai/api/v2/projects/native"
payload = {
"businessName": "Riverside Dental",
"timezone": "America/New_York"
}
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({businessName: 'Riverside Dental', timezone: 'America/New_York'})
};
fetch('https://api.teamfollowup.ai/api/v2/projects/native', 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.teamfollowup.ai/api/v2/projects/native",
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([
'businessName' => 'Riverside Dental',
'timezone' => 'America/New_York'
]),
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.teamfollowup.ai/api/v2/projects/native"
payload := strings.NewReader("{\n \"businessName\": \"Riverside Dental\",\n \"timezone\": \"America/New_York\"\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.teamfollowup.ai/api/v2/projects/native")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"businessName\": \"Riverside Dental\",\n \"timezone\": \"America/New_York\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/v2/projects/native")
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 \"businessName\": \"Riverside Dental\",\n \"timezone\": \"America/New_York\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"locationId": "nat_example",
"businessName": "Riverside Dental",
"crm": "native",
"agencyTag": "Acme Agency"
}
}{
"success": false,
"error": "VALIDATION",
"message": "businessName is required."
}{
"success": false,
"error": "Unauthorized",
"message": "Authentication required."
}{
"success": false,
"error": "Forbidden",
"message": "You do not have permission to access this resource."
}{
"success": false,
"error": "TooManyRequests",
"message": "Too many requests, please try again later."
}{
"success": false,
"error": "InternalError",
"message": "Unexpected server error."
}Create native sub-account
Create a sub-account without connecting an external CRM. Requires projects:write and an agency admin. Ownership and plan limits are enforced. Use the returned data.locationId to create an agent and its campaign. This does not create an agent or start calls. List projects first to reuse a suitable existing sub-account. If a response is lost, list projects before retrying; this operation is not idempotent.
Required API key scope: projects:write.
POST
/
api
/
v2
/
projects
/
native
cURL
curl --request POST \
--url https://api.teamfollowup.ai/api/v2/projects/native \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"businessName": "Riverside Dental",
"timezone": "America/New_York"
}'import requests
url = "https://api.teamfollowup.ai/api/v2/projects/native"
payload = {
"businessName": "Riverside Dental",
"timezone": "America/New_York"
}
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({businessName: 'Riverside Dental', timezone: 'America/New_York'})
};
fetch('https://api.teamfollowup.ai/api/v2/projects/native', 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.teamfollowup.ai/api/v2/projects/native",
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([
'businessName' => 'Riverside Dental',
'timezone' => 'America/New_York'
]),
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.teamfollowup.ai/api/v2/projects/native"
payload := strings.NewReader("{\n \"businessName\": \"Riverside Dental\",\n \"timezone\": \"America/New_York\"\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.teamfollowup.ai/api/v2/projects/native")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"businessName\": \"Riverside Dental\",\n \"timezone\": \"America/New_York\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.teamfollowup.ai/api/v2/projects/native")
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 \"businessName\": \"Riverside Dental\",\n \"timezone\": \"America/New_York\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"locationId": "nat_example",
"businessName": "Riverside Dental",
"crm": "native",
"agencyTag": "Acme Agency"
}
}{
"success": false,
"error": "VALIDATION",
"message": "businessName is required."
}{
"success": false,
"error": "Unauthorized",
"message": "Authentication required."
}{
"success": false,
"error": "Forbidden",
"message": "You do not have permission to access this resource."
}{
"success": false,
"error": "TooManyRequests",
"message": "Too many requests, please try again later."
}{
"success": false,
"error": "InternalError",
"message": "Unexpected server error."
}Authorizations
Send your API key as Authorization: Bearer YOUR_API_KEY.
Body
application/json
Business name and timezone for the new native sub-account.
Name of the business this sub-account serves.
Minimum string length:
1IANA timezone, for example America/New_York.
Minimum string length:
1Required for staff creating for a named agency. Agency admins always create within their own agency.
Minimum string length:
1⌘I
