import { ShoplyCustomer } from "@shoplygg/node";
const buyer = new ShoplyCustomer({ storeId: "YOUR_STORE_ID", token });
const result = await buyer.tickets.create({
subject: "Key not working",
message: "...",
});
<?php
require 'vendor/autoload.php';
$buyer = new Shoply\Customer(['storeId' => 'YOUR_STORE_ID', 'token' => $token]);
$result = $buyer->tickets->create([
'subject' => 'Key not working',
'message' => '...',
]);
import shoply
buyer = shoply.Customer("YOUR_STORE_ID", token=token)
result = buyer.tickets.create(subject="Key not working", message="...")
curl --request POST \
--url https://api.shoply.gg/v1/stores/{storeId}/customer/tickets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"subject": "Key not working",
"message": "<string>",
"order": "<string>"
}
'package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.shoply.gg/v1/stores/{storeId}/customer/tickets"
payload := strings.NewReader("{\n \"subject\": \"Key not working\",\n \"message\": \"<string>\",\n \"order\": \"<string>\"\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.shoply.gg/v1/stores/{storeId}/customer/tickets")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"subject\": \"Key not working\",\n \"message\": \"<string>\",\n \"order\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoply.gg/v1/stores/{storeId}/customer/tickets")
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 \"subject\": \"Key not working\",\n \"message\": \"<string>\",\n \"order\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": null,
"code": null,
"data": {
"id": "8e243e4e-58e7-4d63-a9c3-ef057672a8fd",
"orderId": "bc44febe-0f25-4076-92eb-03a5045a57e7",
"subject": "Key says it is already in use",
"status": "open",
"messages": 1,
"pictures": 0,
"lastMessageAt": "2026-10-22T16:20:19Z",
"lastFrom": "buyer",
"lastLine": "I bought Northwind Pro this morning and the key says it is already in use.",
"firstReplyAt": null,
"answeredAt": null,
"resolvedAt": null,
"resolvedBy": null,
"createdAt": "2026-10-22T16:20:19Z",
"updatedAt": "2026-10-22T16:20:19Z",
"conversation": [
{
"id": "cc08e8db-7064-4c32-9883-fe156fbe07f1",
"from": "buyer",
"body": "I bought Northwind Pro this morning and the key says it is already in use.",
"html": "<p>I bought Northwind Pro this morning and the key says it is already in use.</p>",
"pictures": [],
"createdAt": "2026-10-22T16:20:19Z"
}
],
"canReopenUntil": null,
"limits": {
"body": 500,
"subject": 100,
"picturesPerMessage": 3,
"picturesPerTicket": 25,
"pictureBytes": 5242880
},
"orderLabel": "Northwind Pro · Order bc44febe-0f25-4076-92eb-03a5045a57e7",
"orderProducts": [
"Northwind Pro"
],
"orderMore": 0
},
"meta": {
"on": true,
"tickets": [
{
"id": "8e243e4e-58e7-4d63-a9c3-ef057672a8fd",
"orderId": "bc44febe-0f25-4076-92eb-03a5045a57e7",
"subject": "Key says it is already in use",
"status": "open",
"messages": 1,
"pictures": 0,
"lastMessageAt": "2026-10-22T16:20:19Z",
"lastFrom": "buyer",
"lastLine": "I bought Northwind Pro this morning and the key says it is already in use.",
"firstReplyAt": null,
"answeredAt": null,
"resolvedAt": null,
"resolvedBy": null,
"createdAt": "2026-10-22T16:20:19Z",
"updatedAt": "2026-10-22T16:20:19Z"
}
],
"orders": [
{
"id": "e9ae5h0p1ye-cd7fded3be6-1006662",
"label": "Northwind Pro · Order e9ae5h0p1ye-cd7fded3be6-1006662",
"products": [
"Northwind Pro"
],
"more": 0
},
{
"id": "bc44febe-0f25-4076-92eb-03a5045a57e7",
"label": "Northwind Pro · Order bc44febe-0f25-4076-92eb-03a5045a57e7",
"products": [
"Northwind Pro"
],
"more": 0
}
],
"canOpen": false,
"limits": {
"body": 500,
"subject": 100,
"picturesPerMessage": 3,
"picturesPerTicket": 25,
"pictureBytes": 5242880
}
}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}Open a support ticket
Opens a ticket with its first message, which the store is told of. One open ticket a buyer at a time (ticket_open), 250 open at a store (store_full), and 100 messages a day a buyer (daily_limit). Refused with tickets_off where the store takes none. Pictures are sent from the customer panel. Answers the ticket as Get a support ticket does, and the list in meta.
Needs the buyer’s token: Authorization: Bearer shoply_ct_..., from Sign in with the code.
It is counted for the buyer’s token: 30 changes in ten minutes.
import { ShoplyCustomer } from "@shoplygg/node";
const buyer = new ShoplyCustomer({ storeId: "YOUR_STORE_ID", token });
const result = await buyer.tickets.create({
subject: "Key not working",
message: "...",
});
<?php
require 'vendor/autoload.php';
$buyer = new Shoply\Customer(['storeId' => 'YOUR_STORE_ID', 'token' => $token]);
$result = $buyer->tickets->create([
'subject' => 'Key not working',
'message' => '...',
]);
import shoply
buyer = shoply.Customer("YOUR_STORE_ID", token=token)
result = buyer.tickets.create(subject="Key not working", message="...")
curl --request POST \
--url https://api.shoply.gg/v1/stores/{storeId}/customer/tickets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"subject": "Key not working",
"message": "<string>",
"order": "<string>"
}
'package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.shoply.gg/v1/stores/{storeId}/customer/tickets"
payload := strings.NewReader("{\n \"subject\": \"Key not working\",\n \"message\": \"<string>\",\n \"order\": \"<string>\"\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.shoply.gg/v1/stores/{storeId}/customer/tickets")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"subject\": \"Key not working\",\n \"message\": \"<string>\",\n \"order\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoply.gg/v1/stores/{storeId}/customer/tickets")
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 \"subject\": \"Key not working\",\n \"message\": \"<string>\",\n \"order\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": null,
"code": null,
"data": {
"id": "8e243e4e-58e7-4d63-a9c3-ef057672a8fd",
"orderId": "bc44febe-0f25-4076-92eb-03a5045a57e7",
"subject": "Key says it is already in use",
"status": "open",
"messages": 1,
"pictures": 0,
"lastMessageAt": "2026-10-22T16:20:19Z",
"lastFrom": "buyer",
"lastLine": "I bought Northwind Pro this morning and the key says it is already in use.",
"firstReplyAt": null,
"answeredAt": null,
"resolvedAt": null,
"resolvedBy": null,
"createdAt": "2026-10-22T16:20:19Z",
"updatedAt": "2026-10-22T16:20:19Z",
"conversation": [
{
"id": "cc08e8db-7064-4c32-9883-fe156fbe07f1",
"from": "buyer",
"body": "I bought Northwind Pro this morning and the key says it is already in use.",
"html": "<p>I bought Northwind Pro this morning and the key says it is already in use.</p>",
"pictures": [],
"createdAt": "2026-10-22T16:20:19Z"
}
],
"canReopenUntil": null,
"limits": {
"body": 500,
"subject": 100,
"picturesPerMessage": 3,
"picturesPerTicket": 25,
"pictureBytes": 5242880
},
"orderLabel": "Northwind Pro · Order bc44febe-0f25-4076-92eb-03a5045a57e7",
"orderProducts": [
"Northwind Pro"
],
"orderMore": 0
},
"meta": {
"on": true,
"tickets": [
{
"id": "8e243e4e-58e7-4d63-a9c3-ef057672a8fd",
"orderId": "bc44febe-0f25-4076-92eb-03a5045a57e7",
"subject": "Key says it is already in use",
"status": "open",
"messages": 1,
"pictures": 0,
"lastMessageAt": "2026-10-22T16:20:19Z",
"lastFrom": "buyer",
"lastLine": "I bought Northwind Pro this morning and the key says it is already in use.",
"firstReplyAt": null,
"answeredAt": null,
"resolvedAt": null,
"resolvedBy": null,
"createdAt": "2026-10-22T16:20:19Z",
"updatedAt": "2026-10-22T16:20:19Z"
}
],
"orders": [
{
"id": "e9ae5h0p1ye-cd7fded3be6-1006662",
"label": "Northwind Pro · Order e9ae5h0p1ye-cd7fded3be6-1006662",
"products": [
"Northwind Pro"
],
"more": 0
},
{
"id": "bc44febe-0f25-4076-92eb-03a5045a57e7",
"label": "Northwind Pro · Order bc44febe-0f25-4076-92eb-03a5045a57e7",
"products": [
"Northwind Pro"
],
"more": 0
}
],
"canOpen": false,
"limits": {
"body": 500,
"subject": 100,
"picturesPerMessage": 3,
"picturesPerTicket": 25,
"pictureBytes": 5242880
}
}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}{
"success": false,
"message": "<string>",
"code": "<string>",
"data": null,
"errors": {}
}Authorizations
A buyer's token, from Sign in with the code: Authorization: Bearer shoply_ct_.... It reaches that buyer's own orders at one store, and no route that takes a key.
Path Parameters
The store's ID, from Settings, General in its dashboard. It is not a secret: a page may show it.

