Skin deposit API for CS2, Dota 2 and Rust
Take CS2, Dota 2 and Rust skins with a few REST calls. Hosted checkout when you want speed, direct payments when you want your own UI.
Everything the integration covers
Hosted payments
POST /payments returns a pay_url and an embed_url. Redirect, pop up or iframe.
Direct payments
GET /inventory gives the customer's items with prices; POST /payments/direct sends the trade.
Signed webhooks
HMAC-SHA256 over timestamp and body, 5-minute tolerance, retries for about two days.
Test mode
sk_test_ keys, simulated trades, POST /test/payments/{id}/simulate for every outcome.
OpenAPI 3.1
Import /api/openapi.json into Postman, Insomnia or your code generator.
Two-header auth
X-Project-Key + X-Project-Secret, optional IP allow-list, secrets stored hashed.
How it works
Get keys
Sign up and submit a project; test keys work at once.
Create a payment
One POST with your order id.
Handle the webhook
Verify the signature, re-read the payment, credit your user.
Create a payment
One call returns the checkout link. Full reference with every endpoint: API reference.
curl -X POST 'https://skinplata.com/api/v1/payments' \
-H 'X-Project-Key: pk_your_key' \
-H 'X-Project-Secret: sk_test_your_secret' \
-H 'Content-Type: application/json' \
-d '{"order_id":"inv-1042","game":"cs2","currency":"usd","min_amount":5,"metadata":{"user_id":"8812"}}'<?php
$ch = curl_init('https://skinplata.com/api/v1/payments');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'X-Project-Key: pk_your_key',
'X-Project-Secret: sk_test_your_secret',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'order_id' => 'inv-1042',
'game' => 'cs2',
'currency' => 'usd',
'min_amount' => 5,
'metadata' => [
'user_id' => '8812',
],
]),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);const res = await fetch('https://skinplata.com/api/v1/payments', {
method: 'POST',
headers: {
'X-Project-Key': 'pk_your_key',
'X-Project-Secret': 'sk_test_your_secret',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"order_id": "inv-1042",
"game": "cs2",
"currency": "usd",
"min_amount": 5,
"metadata": {
"user_id": "8812"
}
}),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error.message);import requests
r = requests.post(
"https://skinplata.com/api/v1/payments",
headers={"X-Project-Key": "pk_your_key", "X-Project-Secret": "sk_test_your_secret"},
json={
"order_id": "inv-1042",
"game": "cs2",
"currency": "usd",
"min_amount": 5,
"metadata": {
"user_id": "8812"
}
},
timeout=30,
)
data = r.json()
if not r.ok:
raise RuntimeError(data["error"]["message"])One integration, three games
- Hosted checkout or your own item picker through the API
- Live prices for every item, shown in 16 currencies
- One trade offer per payment, accepted in Steam by your customer
- Signed webhooks for every status, retried for two days
- Test mode with simulated trades and a test balance
- Payouts in USDT, USDC, BTC, ETH, LTC, SEPA, PayPal or Wise




FAQ
Is there an SDK?
The API is small enough to call directly; the reference has samples in cURL, PHP, Node.js and Python, and the OpenAPI file generates clients for any language.
What are the rate limits?
600 requests a minute per project and 1,200 per IP.
Are payments idempotent?
Yes. order_id is unique per project and mode; a repeat answers 409.