Products
Datacenter proxies from $19/mo Rotating proxies from $25/mo ISP proxies from $33/mo Dedicated proxies from $3.50/mo UDP proxies from $5/mo Try proxies
Use cases
Data & scraping AI services Social media & messaging E-commerce & finance Media & entertainment Marketing & ads Automation & tools All use cases →
Pricing
Full pricing table All locations Money-back guarantee
Resources
Dashboard guide API reference API and MCP Setup guides FAQ Blog For business About us Affiliate program
New dashboard
English
English Русский

Support tickets

4 endpoints · base URL https://papaproxy.net/account_new · authentication

List support tickets

GET/api/v1/customer/tickets
API key required scope tickets:read

List your support tickets, newest first.

Parameters

FieldTypeDescription
offset (query)integerNumber of items to skip.Default: 0
limit (query)integerPage 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

  • 200 Paginated ticket list. · 12 fields
    Example 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
    }
    FieldTypeDescription
    tickets requiredarray of object
    tickets[].id requiredstring (uuid)Unique ID.
    tickets[].customer_id requiredstring (uuid), nullableID of your account.
    tickets[].subject requiredstringTicket subject.
    tickets[].status requiredstringTicket status.One of: open, in_progress, waiting, customer_replied, closed
    tickets[].service_id requiredstring (uuid), nullableID of the service.
    tickets[].last_message_at requiredstring (date-time), nullableWhen the last message was posted (ISO 8601, UTC).
    tickets[].created_at requiredstring (date-time)When it was created (ISO 8601, UTC).
    tickets[].updated_at requiredstring (date-time), nullableWhen it was last changed (ISO 8601, UTC).
    total requiredintegerTotal number of items across all pages.
    offsetintegerNumber of items skipped.Default: 0
    limitintegerPage size.Default: 50
  • 401 The API key is missing, malformed, revoked, or expired, or the account is inactive.
    Example · JSON
    {
      "detail": "Invalid or revoked API key."
    }
  • 403 The API key lacks scope tickets:read.
    Example · JSON
    {
      "detail": "API key is missing required scope: tickets:read"
    }
  • 422 Validation error: a field is missing or has the wrong type or value.
    Example · JSON
    {
      "detail": "Validation error"
    }
  • 429 Too 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/tickets
API key required scope tickets:write

Create a new support ticket.

Request body

FieldTypeDescription
subject requiredstringTicket subject.Min length: 1Max length: 500
message requiredstringMin length: 1Max length: 10000
service_idstring (uuid), nullableID of the service.
attachmentsarray of objectAttached files.Max items: 5
attachments[].filename requiredstringFile name.Min length: 1Max length: 255
attachments[].content_type requiredstringMIME type of the file.Min length: 1Max length: 127
attachments[].data_base64 requiredstringMin 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

  • 201 Ticket with full message history. · 26 fields
    Example 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
        }
      ]
    }
    FieldTypeDescription
    id requiredstring (uuid)Unique ID.
    customer_id requiredstring (uuid), nullableID of your account.
    subject requiredstringTicket subject.
    status requiredstringTicket status.One of: open, in_progress, waiting, customer_replied, closed
    service_id requiredstring (uuid), nullableID of the service.
    last_message_at requiredstring (date-time), nullableWhen the last message was posted (ISO 8601, UTC).
    created_at requiredstring (date-time)When it was created (ISO 8601, UTC).
    updated_at requiredstring (date-time), nullableWhen it was last changed (ISO 8601, UTC).
    messages requiredarray of object
    messages[].id requiredstring (uuid)Unique ID.
    messages[].ticket_id requiredstring (uuid)
    messages[].author_kind requiredstring
    messages[].author_id requiredstring (uuid), nullable
    messages[].message requiredstring
    messages[].created_at requiredstring (date-time)When it was created (ISO 8601, UTC).
    messages[].attachmentsarray of objectAttached files.
    messages[].attachments[].id requiredstring (uuid)Unique ID.
    messages[].attachments[].message_id requiredstring (uuid)
    messages[].attachments[].uploader_type requiredstring
    messages[].attachments[].filename requiredstringFile name.
    messages[].attachments[].content_type requiredstringMIME type of the file.
    messages[].attachments[].size requiredinteger
    messages[].attachments[].created_at requiredstring (date-time)When it was created (ISO 8601, UTC).
    messages[].detected_langstring, nullable
    messages[].translated_bodystring, nullable
    messages[].translation_targetstring, nullable
  • 401 The API key is missing, malformed, revoked, or expired, or the account is inactive.
    Example · JSON
    {
      "detail": "Invalid or revoked API key."
    }
  • 403 The API key lacks scope tickets:write.
    Example · JSON
    {
      "detail": "API key is missing required scope: tickets:write"
    }
  • 422 Validation error: a field is missing or has the wrong type or value.
    Example · JSON
    {
      "detail": "Validation error"
    }
  • 429 Too 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:read

Get a single ticket with its full message history.

Parameters

FieldTypeDescription
ticket_id (path) requiredstring (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

  • 200 Ticket with full message history. · 26 fields
    Example 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
        }
      ]
    }
    FieldTypeDescription
    id requiredstring (uuid)Unique ID.
    customer_id requiredstring (uuid), nullableID of your account.
    subject requiredstringTicket subject.
    status requiredstringTicket status.One of: open, in_progress, waiting, customer_replied, closed
    service_id requiredstring (uuid), nullableID of the service.
    last_message_at requiredstring (date-time), nullableWhen the last message was posted (ISO 8601, UTC).
    created_at requiredstring (date-time)When it was created (ISO 8601, UTC).
    updated_at requiredstring (date-time), nullableWhen it was last changed (ISO 8601, UTC).
    messages requiredarray of object
    messages[].id requiredstring (uuid)Unique ID.
    messages[].ticket_id requiredstring (uuid)
    messages[].author_kind requiredstring
    messages[].author_id requiredstring (uuid), nullable
    messages[].message requiredstring
    messages[].created_at requiredstring (date-time)When it was created (ISO 8601, UTC).
    messages[].attachmentsarray of objectAttached files.
    messages[].attachments[].id requiredstring (uuid)Unique ID.
    messages[].attachments[].message_id requiredstring (uuid)
    messages[].attachments[].uploader_type requiredstring
    messages[].attachments[].filename requiredstringFile name.
    messages[].attachments[].content_type requiredstringMIME type of the file.
    messages[].attachments[].size requiredinteger
    messages[].attachments[].created_at requiredstring (date-time)When it was created (ISO 8601, UTC).
    messages[].detected_langstring, nullable
    messages[].translated_bodystring, nullable
    messages[].translation_targetstring, nullable
  • 401 The API key is missing, malformed, revoked, or expired, or the account is inactive.
    Example · JSON
    {
      "detail": "Invalid or revoked API key."
    }
  • 403 The API key lacks scope tickets:read.
    Example · JSON
    {
      "detail": "API key is missing required scope: tickets:read"
    }
  • 404 Ticket not found, or it doesn't belong to your account. — error format
  • 422 Validation error: a field is missing or has the wrong type or value.
    Example · JSON
    {
      "detail": "Validation error"
    }
  • 429 Too 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}/reply
API key required scope tickets:write

Reply to an existing ticket. Closed tickets can't receive replies: the response is 400 (Cannot reply to a closed ticket. Reopen it first.).

Parameters

FieldTypeDescription
ticket_id (path) requiredstring (uuid)ID of the ticket.

Request body

FieldTypeDescription
message requiredstringMin length: 1Max length: 10000
attachmentsarray of objectAttached files.Max items: 5
attachments[].filename requiredstringFile name.Min length: 1Max length: 255
attachments[].content_type requiredstringMIME type of the file.Min length: 1Max length: 127
attachments[].data_base64 requiredstringMin 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

  • 200 Ticket with full message history. · 26 fields
    Example 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
        }
      ]
    }
    FieldTypeDescription
    id requiredstring (uuid)Unique ID.
    customer_id requiredstring (uuid), nullableID of your account.
    subject requiredstringTicket subject.
    status requiredstringTicket status.One of: open, in_progress, waiting, customer_replied, closed
    service_id requiredstring (uuid), nullableID of the service.
    last_message_at requiredstring (date-time), nullableWhen the last message was posted (ISO 8601, UTC).
    created_at requiredstring (date-time)When it was created (ISO 8601, UTC).
    updated_at requiredstring (date-time), nullableWhen it was last changed (ISO 8601, UTC).
    messages requiredarray of object
    messages[].id requiredstring (uuid)Unique ID.
    messages[].ticket_id requiredstring (uuid)
    messages[].author_kind requiredstring
    messages[].author_id requiredstring (uuid), nullable
    messages[].message requiredstring
    messages[].created_at requiredstring (date-time)When it was created (ISO 8601, UTC).
    messages[].attachmentsarray of objectAttached files.
    messages[].attachments[].id requiredstring (uuid)Unique ID.
    messages[].attachments[].message_id requiredstring (uuid)
    messages[].attachments[].uploader_type requiredstring
    messages[].attachments[].filename requiredstringFile name.
    messages[].attachments[].content_type requiredstringMIME type of the file.
    messages[].attachments[].size requiredinteger
    messages[].attachments[].created_at requiredstring (date-time)When it was created (ISO 8601, UTC).
    messages[].detected_langstring, nullable
    messages[].translated_bodystring, nullable
    messages[].translation_targetstring, nullable
  • 400 The ticket is closed.
    Example · JSON
    {
      "detail": "Cannot reply to a closed ticket. Reopen it first."
    }
  • 401 The API key is missing, malformed, revoked, or expired, or the account is inactive.
    Example · JSON
    {
      "detail": "Invalid or revoked API key."
    }
  • 403 The API key lacks scope tickets:write.
    Example · JSON
    {
      "detail": "API key is missing required scope: tickets:write"
    }
  • 404 Ticket not found, or it doesn't belong to your account. — error format
  • 422 Validation error: a field is missing or has the wrong type or value.
    Example · JSON
    {
      "detail": "Validation error"
    }
  • 429 Too 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.