Support tickets
4 endpoints · base URL https://papaproxy.net/account_new · authentication
List support tickets
GET
/api/v1/customer/ticketsAPI key required scope
tickets:readList your support tickets, newest first.
Parameters
| Field | Type | Description |
|---|---|---|
offset (query) | integer | Number of items to skip.Default: 0 |
limit (query) | integer | Page size.Default: 50 |
Request example Try it in the Dashboard
cURL
curl -X GET "https://papaproxy.net/account_new/api/v1/customer/tickets" \ -H "Authorization: Bearer $PAPAPROXY_API_KEY"
Python
import os
import requests
resp = requests.get(
"https://papaproxy.net/account_new/api/v1/customer/tickets",
headers={"Authorization": f"Bearer {os.environ['PAPAPROXY_API_KEY']}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())Node.js
const resp = await fetch("https://papaproxy.net/account_new/api/v1/customer/tickets", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.PAPAPROXY_API_KEY}`,
},
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
console.log(await resp.json());PHP
<?php
$ch = curl_init('https://papaproxy.net/account_new/api/v1/customer/tickets');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('PAPAPROXY_API_KEY'),
],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
var_dump($status, json_decode($response, true));Go
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://papaproxy.net/account_new/api/v1/customer/tickets", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("PAPAPROXY_API_KEY"))
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(resp.Status, string(data))
}Responses
200Paginated ticket list. · 12 fieldsExample response · JSON{ "tickets": [ { "id": "25d98664-5d50-59ee-974a-d7dd4773bde9", "customer_id": "8218fbc6-d67b-52fd-a639-cca399215d31", "subject": "Proxy question", "status": "closed", "service_id": null, "last_message_at": "2026-11-07T14:09:52.876903Z", "created_at": "2026-11-07T14:09:52.876903Z", "updated_at": "2026-11-07T14:24:19.868992Z" } ], "total": 11, "offset": 0, "limit": 1 }Field Type Description ticketsrequiredarray of object tickets[].idrequiredstring (uuid) Unique ID. tickets[].customer_idrequiredstring (uuid), nullable ID of your account. tickets[].subjectrequiredstring Ticket subject. tickets[].statusrequiredstring Ticket status.One of: open,in_progress,waiting,customer_replied,closedtickets[].service_idrequiredstring (uuid), nullable ID of the service. tickets[].last_message_atrequiredstring (date-time), nullable When the last message was posted (ISO 8601, UTC). tickets[].created_atrequiredstring (date-time) When it was created (ISO 8601, UTC). tickets[].updated_atrequiredstring (date-time), nullable When it was last changed (ISO 8601, UTC). totalrequiredinteger Total number of items across all pages. offsetinteger Number of items skipped.Default: 0limitinteger Page size.Default: 50401The API key is missing, malformed, revoked, or expired, or the account is inactive.Example · JSON{ "detail": "Invalid or revoked API key." }403The API key lacks scopetickets:read.Example · JSON{ "detail": "API key is missing required scope: tickets:read" }422Validation error: a field is missing or has the wrong type or value.Example · JSON{ "detail": "Validation error" }429Too many requests: the per-account limit is 60 requests per minute, shared by all keys and the MCP server. Retry with exponential backoff.Example · JSON{ "detail": "Too Many Requests" }
Open a support ticket
POST
/api/v1/customer/ticketsAPI key required scope
tickets:writeCreate a new support ticket.
Request body
| Field | Type | Description |
|---|---|---|
subject required | string | Ticket subject.Min length: 1Max length: 500 |
message required | string | Min length: 1Max length: 10000 |
service_id | string (uuid), nullable | ID of the service. |
attachments | array of object | Attached files.Max items: 5 |
attachments[].filename required | string | File name.Min length: 1Max length: 255 |
attachments[].content_type required | string | MIME type of the file.Min length: 1Max length: 127 |
attachments[].data_base64 required | string | Min length: 1Max length: 28000000 |
Request example Try it in the Dashboard
cURL
curl -X POST "https://papaproxy.net/account_new/api/v1/customer/tickets" \
-H "Authorization: Bearer $PAPAPROXY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"subject": "Proxy question", "message": "Two IPs in my US package time out on HTTPS. Could you check them?"}'Python
import os
import requests
resp = requests.post(
"https://papaproxy.net/account_new/api/v1/customer/tickets",
headers={"Authorization": f"Bearer {os.environ['PAPAPROXY_API_KEY']}"},
json={
"subject": "Proxy question",
"message": "Two IPs in my US package time out on HTTPS. Could you check them?"
},
timeout=30,
)
resp.raise_for_status()
print(resp.json())Node.js
const resp = await fetch("https://papaproxy.net/account_new/api/v1/customer/tickets", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PAPAPROXY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"subject": "Proxy question",
"message": "Two IPs in my US package time out on HTTPS. Could you check them?"
}),
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
console.log(await resp.json());PHP
<?php
$ch = curl_init('https://papaproxy.net/account_new/api/v1/customer/tickets');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('PAPAPROXY_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'subject' => 'Proxy question',
'message' => 'Two IPs in my US package time out on HTTPS. Could you check them?'
]),
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
var_dump($status, json_decode($response, true));Go
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
req, err := http.NewRequest("POST", "https://papaproxy.net/account_new/api/v1/customer/tickets", strings.NewReader(`{"subject": "Proxy question", "message": "Two IPs in my US package time out on HTTPS. Could you check them?"}`))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("PAPAPROXY_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(resp.Status, string(data))
}Responses
201Ticket with full message history. · 26 fieldsExample response · JSON{ "id": "25d98664-5d50-59ee-974a-d7dd4773bde9", "customer_id": "8218fbc6-d67b-52fd-a639-cca399215d31", "subject": "Proxy question", "status": "closed", "service_id": null, "last_message_at": "2026-11-07T14:09:52.876903Z", "created_at": "2026-11-07T14:09:52.876903Z", "updated_at": "2026-11-07T14:24:19.868992Z", "messages": [ { "id": "101deaaa-d993-5b5a-8826-13a213959f27", "ticket_id": "25d98664-5d50-59ee-974a-d7dd4773bde9", "author_kind": "customer", "author_id": "8218fbc6-d67b-52fd-a639-cca399215d31", "message": "Hi! Two IPs in my US package time out on HTTPS. Could you check them?", "created_at": "2026-11-07T14:09:52.876903Z", "attachments": [], "detected_lang": null, "translated_body": null, "translation_target": null } ] }Field Type Description idrequiredstring (uuid) Unique ID. customer_idrequiredstring (uuid), nullable ID of your account. subjectrequiredstring Ticket subject. statusrequiredstring Ticket status.One of: open,in_progress,waiting,customer_replied,closedservice_idrequiredstring (uuid), nullable ID of the service. last_message_atrequiredstring (date-time), nullable When the last message was posted (ISO 8601, UTC). created_atrequiredstring (date-time) When it was created (ISO 8601, UTC). updated_atrequiredstring (date-time), nullable When it was last changed (ISO 8601, UTC). messagesrequiredarray of object messages[].idrequiredstring (uuid) Unique ID. messages[].ticket_idrequiredstring (uuid) messages[].author_kindrequiredstring messages[].author_idrequiredstring (uuid), nullable messages[].messagerequiredstring messages[].created_atrequiredstring (date-time) When it was created (ISO 8601, UTC). messages[].attachmentsarray of object Attached files. messages[].attachments[].idrequiredstring (uuid) Unique ID. messages[].attachments[].message_idrequiredstring (uuid) messages[].attachments[].uploader_typerequiredstring messages[].attachments[].filenamerequiredstring File name. messages[].attachments[].content_typerequiredstring MIME type of the file. messages[].attachments[].sizerequiredinteger messages[].attachments[].created_atrequiredstring (date-time) When it was created (ISO 8601, UTC). messages[].detected_langstring, nullable messages[].translated_bodystring, nullable messages[].translation_targetstring, nullable 401The API key is missing, malformed, revoked, or expired, or the account is inactive.Example · JSON{ "detail": "Invalid or revoked API key." }403The API key lacks scopetickets:write.Example · JSON{ "detail": "API key is missing required scope: tickets:write" }422Validation error: a field is missing or has the wrong type or value.Example · JSON{ "detail": "Validation error" }429Too many requests: the per-account limit is 60 requests per minute, shared by all keys and the MCP server. Retry with exponential backoff.Example · JSON{ "detail": "Too Many Requests" }
Get a support ticket
GET
/api/v1/customer/tickets/{ticket_id}API key required scope
tickets:readGet a single ticket with its full message history.
Parameters
| Field | Type | Description |
|---|---|---|
ticket_id (path) required | string (uuid) | ID of the ticket. |
Request example Try it in the Dashboard
cURL
curl -X GET "https://papaproxy.net/account_new/api/v1/customer/tickets/3fa85f64-5717-4562-b3fc-2c963f66afa6" \ -H "Authorization: Bearer $PAPAPROXY_API_KEY"
Python
import os
import requests
resp = requests.get(
"https://papaproxy.net/account_new/api/v1/customer/tickets/3fa85f64-5717-4562-b3fc-2c963f66afa6",
headers={"Authorization": f"Bearer {os.environ['PAPAPROXY_API_KEY']}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())Node.js
const resp = await fetch("https://papaproxy.net/account_new/api/v1/customer/tickets/3fa85f64-5717-4562-b3fc-2c963f66afa6", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.PAPAPROXY_API_KEY}`,
},
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
console.log(await resp.json());PHP
<?php
$ch = curl_init('https://papaproxy.net/account_new/api/v1/customer/tickets/3fa85f64-5717-4562-b3fc-2c963f66afa6');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('PAPAPROXY_API_KEY'),
],
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
var_dump($status, json_decode($response, true));Go
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://papaproxy.net/account_new/api/v1/customer/tickets/3fa85f64-5717-4562-b3fc-2c963f66afa6", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("PAPAPROXY_API_KEY"))
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(resp.Status, string(data))
}Responses
200Ticket with full message history. · 26 fieldsExample response · JSON{ "id": "25d98664-5d50-59ee-974a-d7dd4773bde9", "customer_id": "8218fbc6-d67b-52fd-a639-cca399215d31", "subject": "Proxy question", "status": "closed", "service_id": null, "last_message_at": "2026-11-07T14:09:52.876903Z", "created_at": "2026-11-07T14:09:52.876903Z", "updated_at": "2026-11-07T14:24:19.868992Z", "messages": [ { "id": "101deaaa-d993-5b5a-8826-13a213959f27", "ticket_id": "25d98664-5d50-59ee-974a-d7dd4773bde9", "author_kind": "customer", "author_id": "8218fbc6-d67b-52fd-a639-cca399215d31", "message": "Hi! Two IPs in my US package time out on HTTPS. Could you check them?", "created_at": "2026-11-07T14:09:52.876903Z", "attachments": [], "detected_lang": null, "translated_body": null, "translation_target": null } ] }Field Type Description idrequiredstring (uuid) Unique ID. customer_idrequiredstring (uuid), nullable ID of your account. subjectrequiredstring Ticket subject. statusrequiredstring Ticket status.One of: open,in_progress,waiting,customer_replied,closedservice_idrequiredstring (uuid), nullable ID of the service. last_message_atrequiredstring (date-time), nullable When the last message was posted (ISO 8601, UTC). created_atrequiredstring (date-time) When it was created (ISO 8601, UTC). updated_atrequiredstring (date-time), nullable When it was last changed (ISO 8601, UTC). messagesrequiredarray of object messages[].idrequiredstring (uuid) Unique ID. messages[].ticket_idrequiredstring (uuid) messages[].author_kindrequiredstring messages[].author_idrequiredstring (uuid), nullable messages[].messagerequiredstring messages[].created_atrequiredstring (date-time) When it was created (ISO 8601, UTC). messages[].attachmentsarray of object Attached files. messages[].attachments[].idrequiredstring (uuid) Unique ID. messages[].attachments[].message_idrequiredstring (uuid) messages[].attachments[].uploader_typerequiredstring messages[].attachments[].filenamerequiredstring File name. messages[].attachments[].content_typerequiredstring MIME type of the file. messages[].attachments[].sizerequiredinteger messages[].attachments[].created_atrequiredstring (date-time) When it was created (ISO 8601, UTC). messages[].detected_langstring, nullable messages[].translated_bodystring, nullable messages[].translation_targetstring, nullable 401The API key is missing, malformed, revoked, or expired, or the account is inactive.Example · JSON{ "detail": "Invalid or revoked API key." }403The API key lacks scopetickets:read.Example · JSON{ "detail": "API key is missing required scope: tickets:read" }404Ticket not found, or it doesn't belong to your account. — error format422Validation error: a field is missing or has the wrong type or value.Example · JSON{ "detail": "Validation error" }429Too many requests: the per-account limit is 60 requests per minute, shared by all keys and the MCP server. Retry with exponential backoff.Example · JSON{ "detail": "Too Many Requests" }
Reply to a support ticket
POST
/api/v1/customer/tickets/{ticket_id}/replyAPI key required scope
tickets:writeReply to an existing ticket. Closed tickets can't receive replies: the response is 400 (Cannot reply to a closed ticket. Reopen it first.).
Parameters
| Field | Type | Description |
|---|---|---|
ticket_id (path) required | string (uuid) | ID of the ticket. |
Request body
| Field | Type | Description |
|---|---|---|
message required | string | Min length: 1Max length: 10000 |
attachments | array of object | Attached files.Max items: 5 |
attachments[].filename required | string | File name.Min length: 1Max length: 255 |
attachments[].content_type required | string | MIME type of the file.Min length: 1Max length: 127 |
attachments[].data_base64 required | string | Min length: 1Max length: 28000000 |
Request example Try it in the Dashboard
cURL
curl -X POST "https://papaproxy.net/account_new/api/v1/customer/tickets/3fa85f64-5717-4562-b3fc-2c963f66afa6/reply" \
-H "Authorization: Bearer $PAPAPROXY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"message": "Thanks, both IPs work now."}'Python
import os
import requests
resp = requests.post(
"https://papaproxy.net/account_new/api/v1/customer/tickets/3fa85f64-5717-4562-b3fc-2c963f66afa6/reply",
headers={"Authorization": f"Bearer {os.environ['PAPAPROXY_API_KEY']}"},
json={
"message": "Thanks, both IPs work now."
},
timeout=30,
)
resp.raise_for_status()
print(resp.json())Node.js
const resp = await fetch("https://papaproxy.net/account_new/api/v1/customer/tickets/3fa85f64-5717-4562-b3fc-2c963f66afa6/reply", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PAPAPROXY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"message": "Thanks, both IPs work now."
}),
});
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
console.log(await resp.json());PHP
<?php
$ch = curl_init('https://papaproxy.net/account_new/api/v1/customer/tickets/3fa85f64-5717-4562-b3fc-2c963f66afa6/reply');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('PAPAPROXY_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'message' => 'Thanks, both IPs work now.'
]),
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
var_dump($status, json_decode($response, true));Go
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
req, err := http.NewRequest("POST", "https://papaproxy.net/account_new/api/v1/customer/tickets/3fa85f64-5717-4562-b3fc-2c963f66afa6/reply", strings.NewReader(`{"message": "Thanks, both IPs work now."}`))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("PAPAPROXY_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(resp.Status, string(data))
}Responses
200Ticket with full message history. · 26 fieldsExample response · JSON{ "id": "25d98664-5d50-59ee-974a-d7dd4773bde9", "customer_id": "8218fbc6-d67b-52fd-a639-cca399215d31", "subject": "Proxy question", "status": "closed", "service_id": null, "last_message_at": "2026-11-07T14:09:52.876903Z", "created_at": "2026-11-07T14:09:52.876903Z", "updated_at": "2026-11-07T14:24:19.868992Z", "messages": [ { "id": "101deaaa-d993-5b5a-8826-13a213959f27", "ticket_id": "25d98664-5d50-59ee-974a-d7dd4773bde9", "author_kind": "customer", "author_id": "8218fbc6-d67b-52fd-a639-cca399215d31", "message": "Hi! Two IPs in my US package time out on HTTPS. Could you check them?", "created_at": "2026-11-07T14:09:52.876903Z", "attachments": [], "detected_lang": null, "translated_body": null, "translation_target": null } ] }Field Type Description idrequiredstring (uuid) Unique ID. customer_idrequiredstring (uuid), nullable ID of your account. subjectrequiredstring Ticket subject. statusrequiredstring Ticket status.One of: open,in_progress,waiting,customer_replied,closedservice_idrequiredstring (uuid), nullable ID of the service. last_message_atrequiredstring (date-time), nullable When the last message was posted (ISO 8601, UTC). created_atrequiredstring (date-time) When it was created (ISO 8601, UTC). updated_atrequiredstring (date-time), nullable When it was last changed (ISO 8601, UTC). messagesrequiredarray of object messages[].idrequiredstring (uuid) Unique ID. messages[].ticket_idrequiredstring (uuid) messages[].author_kindrequiredstring messages[].author_idrequiredstring (uuid), nullable messages[].messagerequiredstring messages[].created_atrequiredstring (date-time) When it was created (ISO 8601, UTC). messages[].attachmentsarray of object Attached files. messages[].attachments[].idrequiredstring (uuid) Unique ID. messages[].attachments[].message_idrequiredstring (uuid) messages[].attachments[].uploader_typerequiredstring messages[].attachments[].filenamerequiredstring File name. messages[].attachments[].content_typerequiredstring MIME type of the file. messages[].attachments[].sizerequiredinteger messages[].attachments[].created_atrequiredstring (date-time) When it was created (ISO 8601, UTC). messages[].detected_langstring, nullable messages[].translated_bodystring, nullable messages[].translation_targetstring, nullable 400The ticket is closed.Example · JSON{ "detail": "Cannot reply to a closed ticket. Reopen it first." }401The API key is missing, malformed, revoked, or expired, or the account is inactive.Example · JSON{ "detail": "Invalid or revoked API key." }403The API key lacks scopetickets:write.Example · JSON{ "detail": "API key is missing required scope: tickets:write" }404Ticket not found, or it doesn't belong to your account. — error format422Validation error: a field is missing or has the wrong type or value.Example · JSON{ "detail": "Validation error" }429Too many requests: the per-account limit is 60 requests per minute, shared by all keys and the MCP server. Retry with exponential backoff.Example · JSON{ "detail": "Too Many Requests" }
Last updated: November 9, 2026. Generated from the OpenAPI 3.1 specification (API version 0.1.0). Markdown version for AI agents.