1. Create an account and a project
Sign up with your e-mail, then submit a project: name, website, average monthly turnover, country and a Telegram or Discord contact. No ID documents. You get a project key and a test secret at once; the live secret works once our team approves the project.
2. Pick an integration
- Hosted checkout — POST /payments returns pay_url. Redirect the user, open it in a pop-up or put embed_url in an iframe. Fastest to ship.
- Direct payments — GET /inventory returns the user's items with prices; you build the picker and call POST /payments/direct. Full control over the UI.
Both send the same webhooks and land on the same balance.
3. Handle the webhook
Set your webhook URL on the project page. Every event is signed with HMAC-SHA256 over "<timestamp>.<raw body>" using your whsec_ secret. Verify the signature, refuse timestamps older than five minutes, then re-read the payment with GET /payments/{id} before you credit anything.
Credit on deposit.in_hold for speed, or on deposit.success once Steam's trade protection has passed.
4. Test everything
With your sk_test_ secret every trade is simulated: real item names and prices, a test balance and a button for each outcome on the checkout. POST /test/payments/{id}/simulate drives outcomes from your code.
5. Go live
When the project is approved, switch to the sk_live_ secret. Payouts go out in USDT, USDC, BTC, ETH, LTC, SEPA, PayPal or Wise from $25.
The first API call
Create a payment and send the customer to pay_url. 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"])FAQ
How long does approval take?
Our team reviews every project by hand. Your test keys work from the first minute, so you can build while you wait.
Can I accept Dota 2 and Rust items with the same code?
Yes — change the game parameter.
Is there a fee?
0% fees on payments, purchases and payouts.