Create or rotate an event invitation link
Available only for invite-only events. An optional donor binding must be accessible to the caller. Binding an active invitee requires its current version, revokes older links for that invitee and increments its version. Lifetime defaults to 720 hours; null means no expiry.
curl --request POST \
--url https://api.gratona.com/v1/admin/events/{eventId}/invitation-links \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"donor_id": 42,
"email": "jane@example.org",
"expires_in_hours": 720,
"event_invitee_id": 42,
"expected_invitee_version": 1
}
'import requests
url = "https://api.gratona.com/v1/admin/events/{eventId}/invitation-links"
payload = {
"donor_id": 42,
"email": "jane@example.org",
"expires_in_hours": 720,
"event_invitee_id": 42,
"expected_invitee_version": 1
}
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({
donor_id: 42,
email: 'jane@example.org',
expires_in_hours: 720,
event_invitee_id: 42,
expected_invitee_version: 1
})
};
fetch('https://api.gratona.com/v1/admin/events/{eventId}/invitation-links', 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.gratona.com/v1/admin/events/{eventId}/invitation-links",
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([
'donor_id' => 42,
'email' => 'jane@example.org',
'expires_in_hours' => 720,
'event_invitee_id' => 42,
'expected_invitee_version' => 1
]),
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.gratona.com/v1/admin/events/{eventId}/invitation-links"
payload := strings.NewReader("{\n \"donor_id\": 42,\n \"email\": \"jane@example.org\",\n \"expires_in_hours\": 720,\n \"event_invitee_id\": 42,\n \"expected_invitee_version\": 1\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.gratona.com/v1/admin/events/{eventId}/invitation-links")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"donor_id\": 42,\n \"email\": \"jane@example.org\",\n \"expires_in_hours\": 720,\n \"event_invitee_id\": 42,\n \"expected_invitee_version\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/events/{eventId}/invitation-links")
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 \"donor_id\": 42,\n \"email\": \"jane@example.org\",\n \"expires_in_hours\": 720,\n \"event_invitee_id\": 42,\n \"expected_invitee_version\": 1\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 42,
"donor_id": 42,
"event_invitee_id": 42,
"expires_at": "2026-10-20T12:00:00Z",
"last_used_at": "2026-10-20T12:00:00Z",
"revoked_at": "2026-10-20T12:00:00Z",
"created_at": "2026-10-20T12:00:00Z",
"url": "https://app.gratona.com/events/42/annual-gala#invite=issued-token",
"path": "/event-previews/42/preview#preview_token=issued-token"
}
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Not Found",
"status": "error"
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}Authorizations
Passport bearer token authentication for legacy admin sessions.
Path Parameters
Record ID in the authenticated organization.
42
Body
Optional accessible donor in this organization.
42
Optional email binding; defaults to the selected donor email.
255"jane@example.org"
Invitation lifetime in hours; null means no expiry.
24, 168, 720, null 720
Active invitee in this event; optional.
x >= 142
Required with event_invitee_id; must match the current invitee lock version.
x >= 11
Response
Create or rotate an event invitation link completed.
Show child attributes
Show child attributes
curl --request POST \
--url https://api.gratona.com/v1/admin/events/{eventId}/invitation-links \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"donor_id": 42,
"email": "jane@example.org",
"expires_in_hours": 720,
"event_invitee_id": 42,
"expected_invitee_version": 1
}
'import requests
url = "https://api.gratona.com/v1/admin/events/{eventId}/invitation-links"
payload = {
"donor_id": 42,
"email": "jane@example.org",
"expires_in_hours": 720,
"event_invitee_id": 42,
"expected_invitee_version": 1
}
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({
donor_id: 42,
email: 'jane@example.org',
expires_in_hours: 720,
event_invitee_id: 42,
expected_invitee_version: 1
})
};
fetch('https://api.gratona.com/v1/admin/events/{eventId}/invitation-links', 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.gratona.com/v1/admin/events/{eventId}/invitation-links",
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([
'donor_id' => 42,
'email' => 'jane@example.org',
'expires_in_hours' => 720,
'event_invitee_id' => 42,
'expected_invitee_version' => 1
]),
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.gratona.com/v1/admin/events/{eventId}/invitation-links"
payload := strings.NewReader("{\n \"donor_id\": 42,\n \"email\": \"jane@example.org\",\n \"expires_in_hours\": 720,\n \"event_invitee_id\": 42,\n \"expected_invitee_version\": 1\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.gratona.com/v1/admin/events/{eventId}/invitation-links")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"donor_id\": 42,\n \"email\": \"jane@example.org\",\n \"expires_in_hours\": 720,\n \"event_invitee_id\": 42,\n \"expected_invitee_version\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/events/{eventId}/invitation-links")
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 \"donor_id\": 42,\n \"email\": \"jane@example.org\",\n \"expires_in_hours\": 720,\n \"event_invitee_id\": 42,\n \"expected_invitee_version\": 1\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 42,
"donor_id": 42,
"event_invitee_id": 42,
"expires_at": "2026-10-20T12:00:00Z",
"last_used_at": "2026-10-20T12:00:00Z",
"revoked_at": "2026-10-20T12:00:00Z",
"created_at": "2026-10-20T12:00:00Z",
"url": "https://app.gratona.com/events/42/annual-gala#invite=issued-token",
"path": "/event-previews/42/preview#preview_token=issued-token"
}
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Not Found",
"status": "error"
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}