curl --request POST \
--url https://api.skinshark.gg/market/buy/quick \
--header 'Content-Type: application/json' \
--header 'api-key: <api-key>' \
--data '
{
"itemId": "<string>",
"maxPrice": "<string>",
"amount": 100,
"tradeUrl": "<string>",
"externalId": "<string>",
"externalIds": [
"<string>"
]
}
'import requests
url = "https://api.skinshark.gg/market/buy/quick"
payload = {
"itemId": "<string>",
"maxPrice": "<string>",
"amount": 100,
"tradeUrl": "<string>",
"externalId": "<string>",
"externalIds": ["<string>"]
}
headers = {
"api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
itemId: '<string>',
maxPrice: '<string>',
amount: 100,
tradeUrl: '<string>',
externalId: '<string>',
externalIds: ['<string>']
})
};
fetch('https://api.skinshark.gg/market/buy/quick', 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://api.skinshark.gg/market/buy/quick",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'itemId' => '<string>',
'maxPrice' => '<string>',
'amount' => 100,
'tradeUrl' => '<string>',
'externalId' => '<string>',
'externalIds' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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://api.skinshark.gg/market/buy/quick"
payload := strings.NewReader("{\n \"itemId\": \"<string>\",\n \"maxPrice\": \"<string>\",\n \"amount\": 100,\n \"tradeUrl\": \"<string>\",\n \"externalId\": \"<string>\",\n \"externalIds\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("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.post("https://api.skinshark.gg/market/buy/quick")
.header("api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"itemId\": \"<string>\",\n \"maxPrice\": \"<string>\",\n \"amount\": 100,\n \"tradeUrl\": \"<string>\",\n \"externalId\": \"<string>\",\n \"externalIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.skinshark.gg/market/buy/quick")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"itemId\": \"<string>\",\n \"maxPrice\": \"<string>\",\n \"amount\": 100,\n \"tradeUrl\": \"<string>\",\n \"externalId\": \"<string>\",\n \"externalIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"requestId": "<string>",
"success": true,
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "initiated",
"requestedCount": 123,
"itemCount": 123,
"totalPrice": 123,
"createdAt": "<string>"
},
"error": {
"code": 1500,
"key": "INSUFFICIENT_BALANCE",
"message": "Insufficient balance"
}
}{
"requestId": "<string>",
"success": true,
"data": "<unknown>",
"error": {
"code": 1500,
"key": "INSUFFICIENT_BALANCE",
"message": "Insufficient balance"
}
}{
"requestId": "<string>",
"success": true,
"data": "<unknown>",
"error": {
"code": 1500,
"key": "INSUFFICIENT_BALANCE",
"message": "Insufficient balance"
}
}{
"requestId": "<string>",
"success": true,
"data": "<unknown>",
"error": {
"code": 1500,
"key": "INSUFFICIENT_BALANCE",
"message": "Insufficient balance"
}
}{
"requestId": "<string>",
"success": true,
"data": "<unknown>",
"error": {
"code": 1500,
"key": "INSUFFICIENT_BALANCE",
"message": "Insufficient balance"
}
}{
"requestId": "<string>",
"success": true,
"data": "<unknown>",
"error": {
"code": 1500,
"key": "INSUFFICIENT_BALANCE",
"message": "Insufficient balance"
}
}Quick buy
Auth context: sub-user — On-Behalf-Of required. Rate limit: 50/min.
Used for bulk fills. The server selects up to amount listings ≤
maxPrice for the given itemId and creates one Trade. itemCount in
the response is the actual purchased count (may be less than
requestedCount if supply ran out at the cap).
Returns 503 SERVICE_DISABLED when admin has paused trading.
curl --request POST \
--url https://api.skinshark.gg/market/buy/quick \
--header 'Content-Type: application/json' \
--header 'api-key: <api-key>' \
--data '
{
"itemId": "<string>",
"maxPrice": "<string>",
"amount": 100,
"tradeUrl": "<string>",
"externalId": "<string>",
"externalIds": [
"<string>"
]
}
'import requests
url = "https://api.skinshark.gg/market/buy/quick"
payload = {
"itemId": "<string>",
"maxPrice": "<string>",
"amount": 100,
"tradeUrl": "<string>",
"externalId": "<string>",
"externalIds": ["<string>"]
}
headers = {
"api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
itemId: '<string>',
maxPrice: '<string>',
amount: 100,
tradeUrl: '<string>',
externalId: '<string>',
externalIds: ['<string>']
})
};
fetch('https://api.skinshark.gg/market/buy/quick', 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://api.skinshark.gg/market/buy/quick",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'itemId' => '<string>',
'maxPrice' => '<string>',
'amount' => 100,
'tradeUrl' => '<string>',
'externalId' => '<string>',
'externalIds' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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://api.skinshark.gg/market/buy/quick"
payload := strings.NewReader("{\n \"itemId\": \"<string>\",\n \"maxPrice\": \"<string>\",\n \"amount\": 100,\n \"tradeUrl\": \"<string>\",\n \"externalId\": \"<string>\",\n \"externalIds\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("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.post("https://api.skinshark.gg/market/buy/quick")
.header("api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"itemId\": \"<string>\",\n \"maxPrice\": \"<string>\",\n \"amount\": 100,\n \"tradeUrl\": \"<string>\",\n \"externalId\": \"<string>\",\n \"externalIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.skinshark.gg/market/buy/quick")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"itemId\": \"<string>\",\n \"maxPrice\": \"<string>\",\n \"amount\": 100,\n \"tradeUrl\": \"<string>\",\n \"externalId\": \"<string>\",\n \"externalIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"requestId": "<string>",
"success": true,
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "initiated",
"requestedCount": 123,
"itemCount": 123,
"totalPrice": 123,
"createdAt": "<string>"
},
"error": {
"code": 1500,
"key": "INSUFFICIENT_BALANCE",
"message": "Insufficient balance"
}
}{
"requestId": "<string>",
"success": true,
"data": "<unknown>",
"error": {
"code": 1500,
"key": "INSUFFICIENT_BALANCE",
"message": "Insufficient balance"
}
}{
"requestId": "<string>",
"success": true,
"data": "<unknown>",
"error": {
"code": 1500,
"key": "INSUFFICIENT_BALANCE",
"message": "Insufficient balance"
}
}{
"requestId": "<string>",
"success": true,
"data": "<unknown>",
"error": {
"code": 1500,
"key": "INSUFFICIENT_BALANCE",
"message": "Insufficient balance"
}
}{
"requestId": "<string>",
"success": true,
"data": "<unknown>",
"error": {
"code": 1500,
"key": "INSUFFICIENT_BALANCE",
"message": "Insufficient balance"
}
}{
"requestId": "<string>",
"success": true,
"data": "<unknown>",
"error": {
"code": 1500,
"key": "INSUFFICIENT_BALANCE",
"message": "Insufficient balance"
}
}Authorizations
Your raw API key. Generate, rotate, and revoke keys from the merchant
dashboard. Keys can optionally be bound to one or more allowed source
IPs — requests from any other IP are rejected with API_KEY_IP_DENIED.
Headers
Sub-user UUID or the merchant's externalId for that sub-user.
Required for sub-user-context routes; rejected (via requireMerchant)
on merchant-context routes.
1 - 128Body
Item id from catalog (SearchResultItem.id or ItemDetail.id).
Max acceptable unit price (decimal).
^\d+(\.\d{1,2})?$Requested unit count. The server picks the cheapest matching listings.
1 <= x <= 200standard, instant Doppler phase to buy. Priced against the phase floor and allocated across the markets that carry it, cheapest first. Combines with either delivery mode; an instant phase order is filled only from the markets that list that phase for instant delivery.
Phase 1, Phase 2, Phase 3, Phase 4, Ruby, Sapphire, Black Pearl, Emerald 128Your own reference for each requested unit, applied in order. Must contain exactly amount entries, all distinct. Fills arrive over time and in no fixed order, so this is what lets you tell your units apart afterwards and cancel a specific one.
2001 - 128