Trips
Invite active trip participants
Uses the authenticated organization and the selected trip to resolve participants. Withdrawal changes status instead of deleting the record. Invitation sends are best effort and exclude sample trips; donor search respects donor-form access.
POST
/
admin
/
trips
/
{tripId}
/
participants
/
invite
Invite active trip participants
curl --request POST \
--url https://api.gratona.com/v1/admin/trips/{tripId}/participants/invite \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"participant_ids": [
123
],
"invite_expires_at": "2026-10-20T09:00:00Z"
}
'import requests
url = "https://api.gratona.com/v1/admin/trips/{tripId}/participants/invite"
payload = {
"participant_ids": [123],
"invite_expires_at": "2026-10-20T09:00:00Z"
}
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({participant_ids: [123], invite_expires_at: '2026-10-20T09:00:00Z'})
};
fetch('https://api.gratona.com/v1/admin/trips/{tripId}/participants/invite', 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/trips/{tripId}/participants/invite",
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([
'participant_ids' => [
123
],
'invite_expires_at' => '2026-10-20T09:00:00Z'
]),
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/trips/{tripId}/participants/invite"
payload := strings.NewReader("{\n \"participant_ids\": [\n 123\n ],\n \"invite_expires_at\": \"2026-10-20T09:00:00Z\"\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/trips/{tripId}/participants/invite")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"participant_ids\": [\n 123\n ],\n \"invite_expires_at\": \"2026-10-20T09:00:00Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/trips/{tripId}/participants/invite")
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 \"participant_ids\": [\n 123\n ],\n \"invite_expires_at\": \"2026-10-20T09:00:00Z\"\n}"
response = http.request(request)
puts response.read_body{
"message": "<string>",
"sent": 123,
"total": 123
}{
"message": "Unauthorized",
"status": "error"
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}Authorizations
bearerAuthapiKeyAuth
Passport bearer token authentication for legacy admin sessions.
Path Parameters
Trip ID belonging to the authenticated organization.
Body
application/json
Request fields accepted by this operation. Omitted optional properties retain the behavior described above.
⌘I
Invite active trip participants
curl --request POST \
--url https://api.gratona.com/v1/admin/trips/{tripId}/participants/invite \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"participant_ids": [
123
],
"invite_expires_at": "2026-10-20T09:00:00Z"
}
'import requests
url = "https://api.gratona.com/v1/admin/trips/{tripId}/participants/invite"
payload = {
"participant_ids": [123],
"invite_expires_at": "2026-10-20T09:00:00Z"
}
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({participant_ids: [123], invite_expires_at: '2026-10-20T09:00:00Z'})
};
fetch('https://api.gratona.com/v1/admin/trips/{tripId}/participants/invite', 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/trips/{tripId}/participants/invite",
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([
'participant_ids' => [
123
],
'invite_expires_at' => '2026-10-20T09:00:00Z'
]),
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/trips/{tripId}/participants/invite"
payload := strings.NewReader("{\n \"participant_ids\": [\n 123\n ],\n \"invite_expires_at\": \"2026-10-20T09:00:00Z\"\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/trips/{tripId}/participants/invite")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"participant_ids\": [\n 123\n ],\n \"invite_expires_at\": \"2026-10-20T09:00:00Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/trips/{tripId}/participants/invite")
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 \"participant_ids\": [\n 123\n ],\n \"invite_expires_at\": \"2026-10-20T09:00:00Z\"\n}"
response = http.request(request)
puts response.read_body{
"message": "<string>",
"sent": 123,
"total": 123
}{
"message": "Unauthorized",
"status": "error"
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}