Grupuje do 25 operacji w jedno wywołanie do REST API połączonego…
Grupuje do 25 operacji w jedno wywołanie do REST API połączonego sklepu. Każda operacja podaje ścieżkę zasobu względem /webapi/rest/ (nie pełny URL). obowiązują te same reguły traversal co w proxy. Odpowiedź Shoper ({errors, items: [{id, code, body}]})…
Żądanie
- x-api-key: <your-api-key>
- Content-Type: application/json
Odpowiedź
{
"status": "success",
"tokensDeducted": 1
}Co robi
Grupuje do 25 operacji w jedno wywołanie do REST API połączonego sklepu. Każda operacja podaje ścieżkę zasobu względem /webapi/rest/ (nie pełny URL). obowiązują te same reguły traversal co w proxy. Odpowiedź Shoper ({errors, items: [{id, code, body}]}) jest zwracana bez zmian; niepowodzenie jednej operacji nie powoduje niepowodzenia pozostałych. Użyj ?site=, aby wybrać spośród kilku połączonych sklepów.ROZLICZENIE ZA KAŻDĄ WYSŁANĄ OPERACJĘ (nie stawka ryczałtowa). Własny rate limit Shoper nalicza każdą operację osobno, więc to odzwierciedla rzeczywisty koszt upstream, zamiast wyceniać pakiet tak, jakby był darmowy.
Żądanie
Parametry
| Pole | W | Typ | Wymagane | Opis |
|---|---|---|---|---|
site | query | string | nie | Which connected store; required only when several are connected |
Treść
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
ops | array<object> | tak | |
↳ body | any | nie | Request body for POST/PUT ops |
↳ id | string | tak | Caller-chosen identifier to match this op to its result |
↳ method | enum | tak | One of: GET, POST, PUT, DELETE. |
↳ params | object | nie | Query parameters for GET ops, e.g. {"filters": "..."} |
↳ path | string | tak | Resource path relative to /webapi/rest/, e.g. "products" or "products/93" |
Przykładowe żądanie
{
"ops": [
{
"body": "Hello from castomAPI.",
"id": "prj_815313",
"method": "GET",
"params": {},
"path": "products"
}
]
}Odpowiedź
Przykładowa odpowiedź
{
"status": "success",
"tokensDeducted": 1
}Błędy
Każdy błąd ma tę samą kopertę: status HTTP, kod maszynowy i jedno zdanie.
400 | Treść albo parametr nie przeszły walidacji. Tablica details wskazuje pole. |
401 | Brak klucza, klucz cofnięty albo zły nagłówek. Wyślij x-api-key. |
402 | Portfel nie pokrywa tego wywołania. Doładuj albo poczekaj na miesięczny przydział. |
404 | Zasób nie istnieje albo nie jest Twój. Obie sytuacje odpowiadają identycznie i nic nie kosztują. |
429 | Przekroczony limit na minutę dla Twojego planu. Odczekaj i ponów. |
5xx | Usługa nadrzędna odmówiła albo przekroczyła czas. Wywołanie nie jest rozliczane. |
Kod
curl -X POST 'https://app.castomapi.com/v1/shoper/bulk' \
-H 'x-api-key: <your-api-key>' \
-H 'Content-Type: application/json' \
-d '{"ops": [{"body": "Hello from castomAPI.", "id": "prj_815313", "method": "GET", "params": {}, "path": "products"}]}'const res = await fetch('https://app.castomapi.com/v1/shoper/bulk', {
method: 'POST',
headers: { 'x-api-key': '<your-api-key>', 'Content-Type': 'application/json' },
body: JSON.stringify({"ops": [{"body": "Hello from castomAPI.", "id": "prj_815313", "method": "GET", "params": {}, "path": "products"}]})
});
const data = await res.json();
console.log(data);import { request } from 'node:https';
// Node 18+ has fetch built in
const res = await fetch('https://app.castomapi.com/v1/shoper/bulk', {
method: 'POST',
headers: { 'x-api-key': '<your-api-key>', 'Content-Type': 'application/json' },
body: JSON.stringify({"ops": [{"body": "Hello from castomAPI.", "id": "prj_815313", "method": "GET", "params": {}, "path": "products"}]})
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
'https://app.castomapi.com/v1/shoper/bulk',
headers={'x-api-key': '<your-api-key>'},
json={"ops": [{"body": "Hello from castomAPI.", "id": "prj_815313", "method": "GET", "params": {}, "path": "products"}]},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://app.castomapi.com/v1/shoper/bulk');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['x-api-key: <your-api-key>', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['ops' => [['body' => 'Hello from castomAPI.', 'id' => 'prj_815313', 'method' => 'GET', 'params' => [], 'path' => 'products']]]),
]);
$data = json_decode(curl_exec($ch), true);
print_r($data);Koszt i limity
Ta operacja kosztuje od 1 token. Nieudane wywołanie nigdy nie jest rozliczane. Każde konto dostaje 1000 darmowych tokenów miesięcznie; opłacone saldo nie wygasa. 1 token za każdą przesłaną operację — nie jest to ryczałt za cały wsad.
Limity żądań na minutę
| Bez klucza | 10 |
| Free | 60 |
| Pro | 300 |
| Enterprise | 1200 |
Pytania
Ile kosztuje Grupuje do 25 operacji w jedno wywołanie do REST API połączonego…?
od 1 token za udane wywołanie, pobierane z portfela po odpowiedzi. Nieudane wywołania są bezpłatne. Każde konto dostaje 1000 darmowych tokenów miesięcznie. 1 token za każdą przesłaną operację — nie jest to ryczałt za cały wsad.
Jak się uwierzytelnić?
Wyślij klucz w nagłówku x-api-key. Jeden klucz obejmuje każdy rozliczany endpoint; niczego nie trzeba włączać osobno.
Czy mogę wysłać nagłówek Authorization: Bearer zamiast klucza?
Nie dla rozliczanego endpointu — te przyjmują wyłącznie nagłówek x-api-key. Tokeny Bearer należą do strony konta: panel i API konta przyjmują sesję JWT, a castomapi-auth wydaje je standardowym uzgodnieniem OAuth2, z grantami authorization code, client credentials i refresh. Opisuje to strona usługi auth.
Jakie są limity?
10 żądań na minutę z jednego IP zupełnie bez klucza, 60 na minutę w planie Free, 300 w Pro, 1200 w Enterprise. Powyżej poziomu bez klucza limit jest na konto, łącznie dla wszystkich endpointów.
OpenAPI: https://app.castomapi.com/docs/json