curl --request POST \
--url https://api.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"reason": "<string>"
}
'import requests
url = "https://api.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel"
payload = { "reason": "<string>" }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({reason: '<string>'})
};
fetch('https://api.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel', 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.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel",
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([
'reason' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel"
payload := strings.NewReader("{\n \"reason\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"error": "<unknown>",
"payload": {
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "cancelled"
}
}
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}Cancel Meeting Agent
Cancels a booking owned by the API key user and requests that active bot workflows stop. Does not cancel the provider meeting for other participants. A successful response confirms cancellation and acceptance of applicable stop requests, not that the bot has already disconnected. No request body is required to cancel your own booking. To cancel a booking owned by another user (compliance viewers), send a reason; without one the API returns 422. Terminal bookings (cancelled, success, failed, expired) return 409. After a timeout or 5xx, fetch the booking status before retrying. Repeated cancellation cannot issue another refund.
curl --request POST \
--url https://api.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"reason": "<string>"
}
'import requests
url = "https://api.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel"
payload = { "reason": "<string>" }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({reason: '<string>'})
};
fetch('https://api.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel', 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.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel",
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([
'reason' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel"
payload := strings.NewReader("{\n \"reason\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.eu.linqalpha.com/v1/meetings/{meeting_id}/cancel")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"error": "<unknown>",
"payload": {
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "cancelled"
}
}
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}{
"error": {
"code": "INVALID_REQUEST_BODY",
"msg": "query is required and must be a string",
"message": "query is required and must be a string"
},
"payload": "<unknown>"
}curl --request POST \
'https://api.eu.linqalpha.com/v1/meetings/<meeting_id>/cancel' \
--header 'x-api-key: <your-api-key>'
{
"error": null,
"payload": {
"data": {
"id": "6f1a0f6e-8e0c-4c7e-9d2b-3c9c6f5a1b2c",
"status": "cancelled"
}
}
}
404 MEETING_NOT_FOUND.
To cancel a booking owned by another user, send a reason in the request body (up to
1,000 characters). It is recorded in the meeting’s audit trail and is not shown to the
booking’s owner. Without one, the API returns 422 MEETING_CANCEL_REASON_REQUIRED and
the booking is left as it was. A reason is optional when cancelling your own booking.
curl --request POST \
'https://api.eu.linqalpha.com/v1/meetings/<meeting_id>/cancel' \
--header 'x-api-key: <your-api-key>' \
--header 'content-type: application/json' \
--data '{"reason": "Not an approved meeting type"}'
cancelled, success, failed, or expired status return
409 MEETING_NOT_CANCELABLE. Repeating a successful cancellation does not issue
another refund. Existing booking rules restore usage before recording; cancellation
after the booking enters recording does not restore usage.
If the response is lost, or the API returns 503 MEETING_CANCEL_UNAVAILABLE or
502 MEETING_CANCEL_FAIL, fetch the booking using GET /v1/meetings/{meeting_id}
before retrying. If it is already cancelled, no further request is needed. If it is
still cancellable, retry with backoff. Stop failures do not report a successful
cancellation. Organization rate limits also apply (429).
For platform API keys, supply the same organization_id, user_id, and user_email
identity selectors used when booking, as query parameters. user_id is your external
customer user identifier, not LinqAlpha’s internal user UUID.Authorizations
Path Parameters
Booking UUID returned by the Meeting Agent API, not the provider join ID.
Query Parameters
Platform keys: organization selected when booking.
Platform keys: external customer user identifier selected when booking (not an internal UUID).
Platform keys: email for the selected customer user.
Body
Why the booking is cancelled. Required when cancelling a booking owned by another user; optional for your own. Recorded in the meeting's audit trail and not shown to the booking's owner.
1000