Health check
Smoke-test endpoint. Returns the project and livemode pair behind the Bearer key, useful for verifying that auth works without touching any resource.
Authorization
AuthorizationRequiredBearer <token>Send your API key in the Authorization header on every request:
Authorization: Bearer sk_live_.... Keys are created in the admin UI under
Settings → API Keys and are project-scoped.
In: header
Response Body
OK
TypeScript Definitions
Use the response body type in TypeScript.
objectRequiredstring"ping"project_idRequiredintegerproject_namestringlivemodeRequiredbooleanrequest_idRequiredstringMissing or invalid API key.
TypeScript Definitions
Use the response body type in TypeScript.
errorRequiredobjectAPI key is valid but access is refused (e.g. the account has been disabled).
TypeScript Definitions
Use the response body type in TypeScript.
errorRequiredobjectcurl -X GET "https://api.meetdolores.ai/v1/ping" \
-H "Authorization: Bearer <token>"fetch("https://api.meetdolores.ai/v1/ping", {
headers: {
"Authorization": "Bearer <token>"
}
})package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
url := "https://api.meetdolores.ai/v1/ping"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
fmt.Println(res)
fmt.Println(string(body))
}import requests
url = "https://api.meetdolores.ai/v1/ping"
response = requests.request("GET", url, headers = {
"Authorization": "Bearer <token>"
})
print(response.text)require 'net/http'
require 'json'
require 'uri'
uri = URI('https://api.meetdolores.ai/v1/ping')
req = Net::HTTP::Get.new(uri, {
'Authorization' => "Bearer #{ENV['DOLORES_API_KEY']}",
})
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
puts res.body<?php
$ch = curl_init('https://api.meetdolores.ai/v1/ping');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('DOLORES_API_KEY'),
],
]);
echo curl_exec($ch);{
"object": "ping",
"project_id": 42,
"project_name": "Acme Production",
"livemode": false,
"request_id": "req_01HXY7P3K9ABCDEFGHJKMNPQRS"
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "API key is invalid or has been revoked.",
"request_id": "req_01HXY7P3K9ABCDEFGHJKMNPQRS"
}
}{
"error": {
"type": "permission_error",
"code": "account_disabled",
"message": "This account has been disabled. Contact support.",
"request_id": "req_01HXY7P3K9ABCDEFGHJKMNPQRS"
}
}Call a customer now
Places a one-shot outbound call to the customer's phone number immediately. Unlike trigger-field outbound dialing configured on a workflow, this call is **never retried** — if the customer doesn't pick up, the attempt simply ends. The call is recorded as an outbound session under this customer's phone. Track its outcome via `GET /v1/sessions/{session_id}` — the session's `call_status` field moves from `dialing` to a terminal `completed` / `no_answer` / `failed` / `invalid_number` once the carrier reports the result — or list the customer's calls with `GET /v1/sessions?customer_phone=...&direction=outbound`. On a WhatsApp business number, Meta requires the customer's call consent before dialing; when consent isn't on file yet this endpoint returns `202` with `status: consent_pending` and the call is placed automatically once the customer accepts. Returns `400` when the customer has no phone number on record (`customer_no_phone`) or the stored number is not a dialable E.164 phone number (`customer_invalid_phone`).
Appointments
Book, reschedule, and cancel appointments.