Customers
Connect a single-key tool for a customer
Submits a customer’s credential directly, for connectors that authenticate with one API key (Cal.com, Calendly) rather than OAuth. Use this when you already hold the key and do not want to send the customer through the hosted flow.
POST
/
customers
/
{id}
/
connections
/
api-key
Connect a single-key tool for a customer
curl --request POST \
--url https://api.vocobase.com/api/v2/customers/{id}/connections/api-key \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tool_slug": "calcom",
"api_key": "cal_live_..."
}
'import requests
url = "https://api.vocobase.com/api/v2/customers/{id}/connections/api-key"
payload = {
"tool_slug": "calcom",
"api_key": "cal_live_..."
}
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({tool_slug: 'calcom', api_key: 'cal_live_...'})
};
fetch('https://api.vocobase.com/api/v2/customers/{id}/connections/api-key', 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.vocobase.com/api/v2/customers/{id}/connections/api-key",
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([
'tool_slug' => 'calcom',
'api_key' => 'cal_live_...'
]),
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.vocobase.com/api/v2/customers/{id}/connections/api-key"
payload := strings.NewReader("{\n \"tool_slug\": \"calcom\",\n \"api_key\": \"cal_live_...\"\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.vocobase.com/api/v2/customers/{id}/connections/api-key")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tool_slug\": \"calcom\",\n \"api_key\": \"cal_live_...\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vocobase.com/api/v2/customers/{id}/connections/api-key")
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 \"tool_slug\": \"calcom\",\n \"api_key\": \"cal_live_...\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"connection_id": "uc_b4c5d6e7-f809-1223-3445-566778899aab",
"tool_slug": "calcom"
}
}{
"success": false,
"error": {
"code": "TOOL_NOT_API_KEY",
"message": "tool \"cal_com\" does not accept direct API keys"
}
}{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or missing API key"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found"
}
}{
"success": false,
"error": {
"code": "CUSTOMER_NOT_ACTIVE",
"message": "Customer is not active"
}
}{
"success": false,
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 60 seconds."
}
}{
"success": false,
"error": {
"code": "INTERNAL_ERROR",
"message": "An unexpected error occurred"
}
}Authorizations
API key in format: rg_live_xxxx. Pass as a Bearer token in the Authorization header.
Path Parameters
Customer ID.
Body
application/json
⌘I
Connect a single-key tool for a customer
curl --request POST \
--url https://api.vocobase.com/api/v2/customers/{id}/connections/api-key \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tool_slug": "calcom",
"api_key": "cal_live_..."
}
'import requests
url = "https://api.vocobase.com/api/v2/customers/{id}/connections/api-key"
payload = {
"tool_slug": "calcom",
"api_key": "cal_live_..."
}
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({tool_slug: 'calcom', api_key: 'cal_live_...'})
};
fetch('https://api.vocobase.com/api/v2/customers/{id}/connections/api-key', 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.vocobase.com/api/v2/customers/{id}/connections/api-key",
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([
'tool_slug' => 'calcom',
'api_key' => 'cal_live_...'
]),
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.vocobase.com/api/v2/customers/{id}/connections/api-key"
payload := strings.NewReader("{\n \"tool_slug\": \"calcom\",\n \"api_key\": \"cal_live_...\"\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.vocobase.com/api/v2/customers/{id}/connections/api-key")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tool_slug\": \"calcom\",\n \"api_key\": \"cal_live_...\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vocobase.com/api/v2/customers/{id}/connections/api-key")
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 \"tool_slug\": \"calcom\",\n \"api_key\": \"cal_live_...\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"connection_id": "uc_b4c5d6e7-f809-1223-3445-566778899aab",
"tool_slug": "calcom"
}
}{
"success": false,
"error": {
"code": "TOOL_NOT_API_KEY",
"message": "tool \"cal_com\" does not accept direct API keys"
}
}{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or missing API key"
}
}{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found"
}
}{
"success": false,
"error": {
"code": "CUSTOMER_NOT_ACTIVE",
"message": "Customer is not active"
}
}{
"success": false,
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded. Retry after 60 seconds."
}
}{
"success": false,
"error": {
"code": "INTERNAL_ERROR",
"message": "An unexpected error occurred"
}
}