Update a trip fundraising milestone
Milestones compare trip fundraising progress with an amount or a percentage of the trip goal. At least one target must be nonzero after saving; update validates that condition after persisting the submitted values.
curl --request PUT \
--url https://api.gratona.com/v1/admin/trips/{tripId}/milestones/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Follow up with trip participants",
"due_date": "2026-10-20T09:00:00Z",
"target_amount": 40,
"target_percent": 40
}
'import requests
url = "https://api.gratona.com/v1/admin/trips/{tripId}/milestones/{id}"
payload = {
"name": "Follow up with trip participants",
"due_date": "2026-10-20T09:00:00Z",
"target_amount": 40,
"target_percent": 40
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Follow up with trip participants',
due_date: '2026-10-20T09:00:00Z',
target_amount: 40,
target_percent: 40
})
};
fetch('https://api.gratona.com/v1/admin/trips/{tripId}/milestones/{id}', 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}/milestones/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Follow up with trip participants',
'due_date' => '2026-10-20T09:00:00Z',
'target_amount' => 40,
'target_percent' => 40
]),
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}/milestones/{id}"
payload := strings.NewReader("{\n \"name\": \"Follow up with trip participants\",\n \"due_date\": \"2026-10-20T09:00:00Z\",\n \"target_amount\": 40,\n \"target_percent\": 40\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.gratona.com/v1/admin/trips/{tripId}/milestones/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Follow up with trip participants\",\n \"due_date\": \"2026-10-20T09:00:00Z\",\n \"target_amount\": 40,\n \"target_percent\": 40\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/trips/{tripId}/milestones/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Follow up with trip participants\",\n \"due_date\": \"2026-10-20T09:00:00Z\",\n \"target_amount\": 40,\n \"target_percent\": 40\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 123,
"trip_id": 123,
"name": "<string>",
"due_date": "2023-12-25",
"target_amount": 123,
"target_percent": 123,
"resolved_target_amount": 123,
"total_raised": 123,
"progress_percent": 123,
"status": "<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
Passport bearer token authentication for legacy admin sessions.
Path Parameters
Trip ID belonging to the authenticated organization.
Record ID within the organization and any parent resource in this route.
Body
Request fields accepted by this operation. Omitted optional properties retain the behavior described above.
Validation: required|string|max:255.
255"Follow up with trip participants"
Validation: nullable|date.
"2026-10-20T09:00:00Z"
Validation: nullable|numeric|min:0.
x >= 040
Validation: nullable|numeric|min:0|max:100.
0 <= x <= 10040
Response
Update a trip fundraising milestone response.
Show child attributes
Show child attributes
curl --request PUT \
--url https://api.gratona.com/v1/admin/trips/{tripId}/milestones/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Follow up with trip participants",
"due_date": "2026-10-20T09:00:00Z",
"target_amount": 40,
"target_percent": 40
}
'import requests
url = "https://api.gratona.com/v1/admin/trips/{tripId}/milestones/{id}"
payload = {
"name": "Follow up with trip participants",
"due_date": "2026-10-20T09:00:00Z",
"target_amount": 40,
"target_percent": 40
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Follow up with trip participants',
due_date: '2026-10-20T09:00:00Z',
target_amount: 40,
target_percent: 40
})
};
fetch('https://api.gratona.com/v1/admin/trips/{tripId}/milestones/{id}', 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}/milestones/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Follow up with trip participants',
'due_date' => '2026-10-20T09:00:00Z',
'target_amount' => 40,
'target_percent' => 40
]),
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}/milestones/{id}"
payload := strings.NewReader("{\n \"name\": \"Follow up with trip participants\",\n \"due_date\": \"2026-10-20T09:00:00Z\",\n \"target_amount\": 40,\n \"target_percent\": 40\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.gratona.com/v1/admin/trips/{tripId}/milestones/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Follow up with trip participants\",\n \"due_date\": \"2026-10-20T09:00:00Z\",\n \"target_amount\": 40,\n \"target_percent\": 40\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/trips/{tripId}/milestones/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Follow up with trip participants\",\n \"due_date\": \"2026-10-20T09:00:00Z\",\n \"target_amount\": 40,\n \"target_percent\": 40\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 123,
"trip_id": 123,
"name": "<string>",
"due_date": "2023-12-25",
"target_amount": 123,
"target_percent": 123,
"resolved_target_amount": 123,
"total_raised": 123,
"progress_percent": 123,
"status": "<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."
}