import Shoply from "@shoplygg/node";
const shoply = new Shoply({ apiKey: process.env.SHOPLY_API_KEY });
const result = await shoply.teams.create({
name: "Support",
permissions: ["orders.view","orders.deliver","customers.view","tickets.view","tickets.reply"],
});
<?php
require 'vendor/autoload.php';
$shoply = new Shoply\Client(['apiKey' => getenv('SHOPLY_API_KEY')]);
$result = $shoply->teams->create([
'name' => 'Support',
'permissions' => ['orders.view', 'orders.deliver', 'customers.view', 'tickets.view', 'tickets.reply'],
]);
import shoply
client = shoply.Client() # reads SHOPLY_API_KEY
result = client.teams.create(
name="Support",
permissions=["orders.view", "orders.deliver", "customers.view", "tickets.view", "tickets.reply"],
)
curl --request POST \
--url https://api.shoply.gg/v1/stores/{storeId}/teams \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Support",
"permissions": [
"orders.view",
"orders.deliver",
"customers.view",
"tickets.view",
"tickets.reply"
]
}
'package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.shoply.gg/v1/stores/{storeId}/teams"
payload := strings.NewReader("{\n \"name\": \"Support\",\n \"permissions\": [\n \"orders.view\",\n \"orders.deliver\",\n \"customers.view\",\n \"tickets.view\",\n \"tickets.reply\"\n ]\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}/teams")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Support\",\n \"permissions\": [\n \"orders.view\",\n \"orders.deliver\",\n \"customers.view\",\n \"tickets.view\",\n \"tickets.reply\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoply.gg/v1/stores/{storeId}/teams")
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 \"name\": \"Support\",\n \"permissions\": [\n \"orders.view\",\n \"orders.deliver\",\n \"customers.view\",\n \"tickets.view\",\n \"tickets.reply\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": null,
"code": null,
"data": {
"id": "76da1aed-1f2d-4fc5-8b6c-d2ec8235f7de",
"name": "Support",
"permissions": [
"orders.view",
"customers.view"
],
"sensitive": 0,
"reach": [
"Orders",
"Audience"
],
"people": [],
"waiting": 0,
"createdAt": "2026-10-24T16:33:36Z",
"updatedAt": "2026-10-24T16:33:36Z"
}
}{
"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": {}
}Create a team
A store holds up to 10 teams. A permission marked sensitive that the team did not hold before cannot be given with a key: give it on the dashboard, which asks the person to confirm it is them.
Needs the team.write permission (Manage the Team).
import Shoply from "@shoplygg/node";
const shoply = new Shoply({ apiKey: process.env.SHOPLY_API_KEY });
const result = await shoply.teams.create({
name: "Support",
permissions: ["orders.view","orders.deliver","customers.view","tickets.view","tickets.reply"],
});
<?php
require 'vendor/autoload.php';
$shoply = new Shoply\Client(['apiKey' => getenv('SHOPLY_API_KEY')]);
$result = $shoply->teams->create([
'name' => 'Support',
'permissions' => ['orders.view', 'orders.deliver', 'customers.view', 'tickets.view', 'tickets.reply'],
]);
import shoply
client = shoply.Client() # reads SHOPLY_API_KEY
result = client.teams.create(
name="Support",
permissions=["orders.view", "orders.deliver", "customers.view", "tickets.view", "tickets.reply"],
)
curl --request POST \
--url https://api.shoply.gg/v1/stores/{storeId}/teams \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Support",
"permissions": [
"orders.view",
"orders.deliver",
"customers.view",
"tickets.view",
"tickets.reply"
]
}
'package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.shoply.gg/v1/stores/{storeId}/teams"
payload := strings.NewReader("{\n \"name\": \"Support\",\n \"permissions\": [\n \"orders.view\",\n \"orders.deliver\",\n \"customers.view\",\n \"tickets.view\",\n \"tickets.reply\"\n ]\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}/teams")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Support\",\n \"permissions\": [\n \"orders.view\",\n \"orders.deliver\",\n \"customers.view\",\n \"tickets.view\",\n \"tickets.reply\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.shoply.gg/v1/stores/{storeId}/teams")
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 \"name\": \"Support\",\n \"permissions\": [\n \"orders.view\",\n \"orders.deliver\",\n \"customers.view\",\n \"tickets.view\",\n \"tickets.reply\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": null,
"code": null,
"data": {
"id": "76da1aed-1f2d-4fc5-8b6c-d2ec8235f7de",
"name": "Support",
"permissions": [
"orders.view",
"customers.view"
],
"sensitive": 0,
"reach": [
"Orders",
"Audience"
],
"people": [],
"waiting": 0,
"createdAt": "2026-10-24T16:33:36Z",
"updatedAt": "2026-10-24T16:33:36Z"
}
}{
"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 secret API key, made under Developers in the dashboard: Authorization: Bearer shoply_sk_...
Headers
A word of your own for this one change, up to 180 letters, digits, dots, dashes, underscores and colons. Sent again with the same key, the request is not carried out twice: the first answer comes back, with Idempotent-Replay: true.
Path Parameters
The store's ID. A key reaches the store it was made in: GET /key answers which.
Body
What the team is called, up to 40 characters, once a store.
"Support"
What its people may do, by name (List the team answers every permission in permissions). What a permission leans on is added with it: stock.edit brings stock.view and products.view.
[
"orders.view",
"orders.deliver",
"customers.view",
"tickets.view",
"tickets.reply"
]

