Trips
Import 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
/
import
Import trip participants
curl --request POST \
--url https://api.gratona.com/v1/admin/trips/{tripId}/participants/import \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"csv_data": [
{
"email": "alex@example.org",
"first_name": "<string>",
"last_name": "<string>",
"phone": "<string>",
"individual_goal": 40,
"role": "participant"
}
]
}
'import requests
url = "https://api.gratona.com/v1/admin/trips/{tripId}/participants/import"
payload = { "csv_data": [
{
"email": "alex@example.org",
"first_name": "<string>",
"last_name": "<string>",
"phone": "<string>",
"individual_goal": 40,
"role": "participant"
}
] }
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({
csv_data: [
{
email: 'alex@example.org',
first_name: '<string>',
last_name: '<string>',
phone: '<string>',
individual_goal: 40,
role: 'participant'
}
]
})
};
fetch('https://api.gratona.com/v1/admin/trips/{tripId}/participants/import', 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/import",
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([
'csv_data' => [
[
'email' => 'alex@example.org',
'first_name' => '<string>',
'last_name' => '<string>',
'phone' => '<string>',
'individual_goal' => 40,
'role' => 'participant'
]
]
]),
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/import"
payload := strings.NewReader("{\n \"csv_data\": [\n {\n \"email\": \"alex@example.org\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"phone\": \"<string>\",\n \"individual_goal\": 40,\n \"role\": \"participant\"\n }\n ]\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/import")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"csv_data\": [\n {\n \"email\": \"alex@example.org\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"phone\": \"<string>\",\n \"individual_goal\": 40,\n \"role\": \"participant\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/trips/{tripId}/participants/import")
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 \"csv_data\": [\n {\n \"email\": \"alex@example.org\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"phone\": \"<string>\",\n \"individual_goal\": 40,\n \"role\": \"participant\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "Import completed",
"results": {
"success": 123,
"failed": 123,
"errors": [
{
"row": 123,
"email": "<string>",
"error": "<string>"
}
]
}
}{
"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.
Show child attributes
Show child attributes
⌘I
Import trip participants
curl --request POST \
--url https://api.gratona.com/v1/admin/trips/{tripId}/participants/import \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"csv_data": [
{
"email": "alex@example.org",
"first_name": "<string>",
"last_name": "<string>",
"phone": "<string>",
"individual_goal": 40,
"role": "participant"
}
]
}
'import requests
url = "https://api.gratona.com/v1/admin/trips/{tripId}/participants/import"
payload = { "csv_data": [
{
"email": "alex@example.org",
"first_name": "<string>",
"last_name": "<string>",
"phone": "<string>",
"individual_goal": 40,
"role": "participant"
}
] }
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({
csv_data: [
{
email: 'alex@example.org',
first_name: '<string>',
last_name: '<string>',
phone: '<string>',
individual_goal: 40,
role: 'participant'
}
]
})
};
fetch('https://api.gratona.com/v1/admin/trips/{tripId}/participants/import', 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/import",
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([
'csv_data' => [
[
'email' => 'alex@example.org',
'first_name' => '<string>',
'last_name' => '<string>',
'phone' => '<string>',
'individual_goal' => 40,
'role' => 'participant'
]
]
]),
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/import"
payload := strings.NewReader("{\n \"csv_data\": [\n {\n \"email\": \"alex@example.org\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"phone\": \"<string>\",\n \"individual_goal\": 40,\n \"role\": \"participant\"\n }\n ]\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/import")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"csv_data\": [\n {\n \"email\": \"alex@example.org\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"phone\": \"<string>\",\n \"individual_goal\": 40,\n \"role\": \"participant\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/trips/{tripId}/participants/import")
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 \"csv_data\": [\n {\n \"email\": \"alex@example.org\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"phone\": \"<string>\",\n \"individual_goal\": 40,\n \"role\": \"participant\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"message": "Import completed",
"results": {
"success": 123,
"failed": 123,
"errors": [
{
"row": 123,
"email": "<string>",
"error": "<string>"
}
]
}
}{
"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."
}