curl --request PUT \
--url https://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '{
"amount": 10
}'import requests
url = "https://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund"
payload = { "amount": 10 }
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({amount: 10})
};
fetch('https://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund', 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://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund",
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([
'amount' => 10
]),
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://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund"
payload := strings.NewReader("{\n \"amount\": 10\n}")
req, _ := http.NewRequest("PUT", 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.put("https://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 10\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 10\n}"
response = http.request(request)
puts response.read_body{
"data": {
"_id": "<string>",
"event_id": "<string>",
"ticket_rate_id": "<string>",
"status": "<string>",
"price": {
"_id": "<string>",
"name": "<string>",
"price": 123,
"fee_type": "fixed",
"fee_quantity": 123,
"includes": "<string>",
"additional_info": "<string>",
"quantity": 123,
"valid_until": "<string>",
"used": 123
},
"payment_currency": "<string>",
"channel_id": "<string>",
"supplements": [
{
"_id": "<string>",
"supplementId": "<string>",
"label": "<string>",
"price": 123,
"has_fake_price": true,
"fake_price": 123,
"description": "<string>",
"total_price": 123,
"supplement_units": 123,
"product_quantity": 123,
"redemption_deadline_value": 123
}
],
"refunds": [
{
"channel_id": "<string>",
"amount": 123,
"at": "<string>"
}
],
"total_supplements": 123,
"total_fees": 123,
"total_price": 123,
"qr_code": "<string>",
"fees": {
"organization": 123,
"discocil": 123
},
"full_name": "<string>",
"phone": "<string>",
"email": "<string>",
"gender": "<string>",
"birthday": "<string>",
"address": "<string>",
"postal_code": "<string>",
"country_code": "<string>",
"personal_document_type": "<string>",
"personal_document_number": "<string>",
"answers": [
{
"questionId": "<string>",
"answer": "<string>"
}
],
"refunded": 123,
"refunded_at": "<string>",
"for": 123,
"enter": 123,
"entry_time": "<string>",
"activation_date": "<string>",
"payment_id": "<string>",
"supplements_service_charge_total": 123,
"discount_code": {
"id": "<string>",
"code": "<string>",
"amount": 123
},
"remaining_breakdown": {
"price": 123,
"warranty": 123,
"suplements": 123,
"ggdd": 123,
"surcharge": 123,
"suplements_upselling": 123,
"ggdd_upselling": 123
},
"ticket_original": {
"total_price": 123,
"price": 123
},
"surcharge": {
"amount": 123
},
"warranty": {
"total": 123,
"hours": 123,
"cost": 123
},
"payment": {
"status": "<string>",
"rate_id": "<string>",
"organization_id": "<string>",
"event_id": "<string>",
"resource_type": "<string>",
"resource_ids": [
"<string>"
],
"total": {
"amount": 123,
"fees": 123
},
"currency": "<string>",
"sale_type": "<string>",
"paid_at": "<string>",
"expires_at": "<string>",
"gateway_account_id": "<string>",
"is_channel_manager": true,
"total_discount": 123,
"_id": "<string>",
"metadata": "<unknown>",
"send_resources": true
}
},
"success": true
}Refund Ticket
Void ticket and mark the amount of money refunded. It can be partial or total and it can be done multiple times until the ticket is fully refunded. However, the first time it is done, the ticket is marked as voided.
curl --request PUT \
--url https://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '{
"amount": 10
}'import requests
url = "https://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund"
payload = { "amount": 10 }
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({amount: 10})
};
fetch('https://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund', 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://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund",
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([
'amount' => 10
]),
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://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund"
payload := strings.NewReader("{\n \"amount\": 10\n}")
req, _ := http.NewRequest("PUT", 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.put("https://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 10\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://channels-service-alpha.fourvenues.com/tickets/{ticketId}/refund")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 10\n}"
response = http.request(request)
puts response.read_body{
"data": {
"_id": "<string>",
"event_id": "<string>",
"ticket_rate_id": "<string>",
"status": "<string>",
"price": {
"_id": "<string>",
"name": "<string>",
"price": 123,
"fee_type": "fixed",
"fee_quantity": 123,
"includes": "<string>",
"additional_info": "<string>",
"quantity": 123,
"valid_until": "<string>",
"used": 123
},
"payment_currency": "<string>",
"channel_id": "<string>",
"supplements": [
{
"_id": "<string>",
"supplementId": "<string>",
"label": "<string>",
"price": 123,
"has_fake_price": true,
"fake_price": 123,
"description": "<string>",
"total_price": 123,
"supplement_units": 123,
"product_quantity": 123,
"redemption_deadline_value": 123
}
],
"refunds": [
{
"channel_id": "<string>",
"amount": 123,
"at": "<string>"
}
],
"total_supplements": 123,
"total_fees": 123,
"total_price": 123,
"qr_code": "<string>",
"fees": {
"organization": 123,
"discocil": 123
},
"full_name": "<string>",
"phone": "<string>",
"email": "<string>",
"gender": "<string>",
"birthday": "<string>",
"address": "<string>",
"postal_code": "<string>",
"country_code": "<string>",
"personal_document_type": "<string>",
"personal_document_number": "<string>",
"answers": [
{
"questionId": "<string>",
"answer": "<string>"
}
],
"refunded": 123,
"refunded_at": "<string>",
"for": 123,
"enter": 123,
"entry_time": "<string>",
"activation_date": "<string>",
"payment_id": "<string>",
"supplements_service_charge_total": 123,
"discount_code": {
"id": "<string>",
"code": "<string>",
"amount": 123
},
"remaining_breakdown": {
"price": 123,
"warranty": 123,
"suplements": 123,
"ggdd": 123,
"surcharge": 123,
"suplements_upselling": 123,
"ggdd_upselling": 123
},
"ticket_original": {
"total_price": 123,
"price": 123
},
"surcharge": {
"amount": 123
},
"warranty": {
"total": 123,
"hours": 123,
"cost": 123
},
"payment": {
"status": "<string>",
"rate_id": "<string>",
"organization_id": "<string>",
"event_id": "<string>",
"resource_type": "<string>",
"resource_ids": [
"<string>"
],
"total": {
"amount": 123,
"fees": 123
},
"currency": "<string>",
"sale_type": "<string>",
"paid_at": "<string>",
"expires_at": "<string>",
"gateway_account_id": "<string>",
"is_channel_manager": true,
"total_discount": 123,
"_id": "<string>",
"metadata": "<unknown>",
"send_resources": true
}
},
"success": true
}Authorizations
Path Parameters
Ticket id
Body
Amount to refund.
10
Response
OK
The wire contract for a ticket, AT THE LATEST VERSION.
This is the single source of truth: toTicketResponse is annotated to
return it (so the code cannot drift from it without a compile error), and the
OpenAPI spec + docs + breaking-change gate are all generated from it.
Dates are ISO-8601 strings — the real wire form res.json produces from the
underlying Moment values.
Nested relations now carry precise types derived from the mappers: price
reuses the shared TicketRatePrice contract, payment reuses Payment,
refunds references RefundTicket, and the remaining nested objects
(fees, supplements, answers, discount_code, remaining_breakdown,
ticket_original, surcharge, warranty) are typed inline to match the exact
shapes emitted by toTicketResponse.
Show child attributes
Show child attributes