Fejlesztőknek
Kezdj bele
API-k/App API

App API

Az App API route-jai, jogosultságai, lapozása, idempotenciája és hibái, valamint az azokat hívó PolturaClient-metódusok.

Ezen az oldalon

Az App API az a /apps-api/v1 alatti HTTP API, amellyel a szervered elérheti és módosíthatja egy bolt adatait. Minden kérés a kereskedő jóváhagyásából származó telepítési access tokent hordoz (lásd: Hitelesítés), és kizárólag ahhoz fér hozzá, amit a kereskedő jóváhagyott az adott telepítésnek. Új vagy még itt? Kezdj az Első API-hívásod oldallal.

Az App API éles originje még nincs közzétéve, így a példák a POLTURA_API változóból olvassák be.

A @poltura/app-sdk csomagban található PolturaClient minden route-ot lefed: new PolturaClient({ origin, accessToken, timeoutMs?, maximumResponseBytes?, fetch? }). Az origin egy route nélküli HTTPS-origin. A kérések 10 másodperc után timeouttal megszakadnak, hacsak nem állítasz be timeoutMs értéket (legfeljebb 60 másodpercre), az 1 MiB feletti válaszokat pedig elutasítja, kivéve, ha megemeled a maximumResponseBytes értékét (legfeljebb 8 MiB-ig). A kliens a tokent Authorization: Bearer headerként küldi, soha nem küld cookie-kat, és soha nem követi a redirecteket.

Egy írási művelet a teljes példából: mentés az app storage-ba a felülírt verzióval és egy idempotenciakulccsal.

export async function saveFeatured(
  client: PolturaClient,
  productIds: readonly string[],
  expectedVersion: number,
  idempotencyKey: string,
): Promise<StorageRecord> {
  const value = FeaturedProducts.parse({ productIds: [...productIds] });
  return client.storage.put(STORAGE_NAMESPACE, FEATURED_KEY, value, {
    expectedVersion,
    idempotencyKey,
  });
}

Route-ok

A listák fogadják a limit (1–100, alapértelmezett: 25) és cursor paramétereket, és a nextCursor értékkel válaszolnak: add át újra a következő oldal lekéréséhez, amíg az értéke null nem lesz. Ebben a szekcióban mindegyik route-hoz külön oldal is tartozik, paraméterekkel és példákkal.

MetódusRouteJogosultságSDKKérésVálasz
GET/apps-api/v1/storesettings.readstore.retrieveStoreContext { id, name, locale, currency, timezone }
GET/apps-api/v1/installationnincsinstallation.retrievenincs tenant-overrideInstallationContext { installationId, storeId, appId, releaseId, generation, permissions } (permissions max 32)
GET/apps-api/v1/productsproducts.readproducts.listListOptionsProductPage { products, nextCursor } (max 100)
GET/apps-api/v1/products/{id}products.readproducts.retrieveProductIdProductResponse { product }
PATCH/apps-api/v1/products/{id}products.writeproducts.updateProductWriteInput { title?, description?, handle?, status?, metadata? } + Idempotency-KeyWriteResult { ok: true, version }
GET/apps-api/v1/collectionsproducts.readcollections.listListOptionsCollectionPage
GET/apps-api/v1/collections/{id}products.readcollections.retrieveCollectionIdCollectionResponse
PATCH/apps-api/v1/collections/{id}products.writecollections.updateCollectionWriteInput { title?, handle?, metadata? } + Idempotency-KeyWriteResult
GET/apps-api/v1/ordersorders.readorders.listOrderListOptions (status?, updatedAfter?)OrderPage
GET/apps-api/v1/orders/{id}orders.readorders.retrieveOrderIdOrderResponse { order: PublicOrder }
PATCH/apps-api/v1/orders/{id}orders.writeorders.updateOrderWriteInput { metadata?, tags?, note? } + Idempotency-KeyWriteResult
GET/apps-api/v1/customerscustomers.readcustomers.listCustomerListOptions (email?, updatedAfter?)CustomerPage
GET/apps-api/v1/customers/{id}customers.readcustomers.retrieveCustomerIdCustomerResponse
PATCH/apps-api/v1/customers/{id}customers.writecustomers.updateCustomerWriteInput { metadata?, tags? } + Idempotency-KeyWriteResult
GET/apps-api/v1/inventoryproducts.readinventory.listInventoryListOptions (variantId?, sku?)InventoryPage { levels, nextCursor }
GET/apps-api/v1/storage/{namespace}nincsstorage.listStorageListQueryStoragePage
GET/apps-api/v1/storage/{namespace}/{key}nincsstorage.getStorageRecord
PUT/apps-api/v1/storage/{namespace}/{key}nincsstorage.putStoragePutInput { value, expectedVersion } + Idempotency-KeyStorageRecord
DELETE/apps-api/v1/storage/{namespace}/{key}nincsstorage.deleteStorageDeleteInput { expectedVersion } + Idempotency-KeyStorageDeleteResult

CatalogueProduct: { id, title 1–500, handle 1–255, description legfeljebb 20000 vagy null, image, updatedAt }. A PublicProductWriteStatus értéke draft | published. A PublicMetadata legfeljebb 64 snake_case kulcsot tartalmazhat, az értékek legfeljebb 2000 karakteresek lehetnek. PublicTags: legfeljebb 32. A PublicOrder tartalmazza az orderNumber (1–64), a maximum 200 elemes items és a shippingAddress mezőket. A pénzösszegek formátuma { amount: "49.99", currency: "EUR" } a fő pénznemegységben; ne szorozd be 100-zal.

Egy írási művelet két kérésnek számít a telepítés kvótájában. Ha olyan mezőt írsz, amelyet a route nem engedélyez, a hívás invalid_input hibával meghiúsul. Minden írási művelet fogad egy Idempotency-Key headert, így az újrapróbált kérés csak egyszer fut le.

Storage-korlátok

SzabályÉrték
Érték bájtban65536
JSON-mélység8
JSON-node-ok1024
Namespace-ek16
Bájt / rekord telepítésenként10 MiB / 1000
Listázási oldal100 / 900 KiB
Aktív idempotencia128
Idempotencia TTL24 óra
Kurzor TTL1 óra
Első put1-es verziót hoz létre 0-s expectedVersion értékkel

A namespace 1–64 karakteres lehet: kisbetűket, számjegyeket és _ karaktert tartalmazhat, és betűvel kell kezdődnie. A kulcs 1–128 karakteres lehet: betűket, számjegyeket, ., _ és - karaktereket tartalmazhat, és betűvel vagy számjeggyel kell kezdődnie. Ugyanazon idempotenciakulcs elküldése azonos bodyval az első választ adja vissza újra; eltérő bodyval viszont conflict hibával meghiúsul. Ha egy írási művelet expectedVersion értéke nem az aktuális verzió, a kérés stale_version hibával meghiúsul: olvasd be újra a rekordot, és próbáld meg ismét.

Backend-műveletek

A műveletek épp fordítva működnek: egy worker meghívja a useAction(actionId) függvényt, a Poltura pedig egy aláírt POST kérést küld a { input, context } tartalommal a backendOrigin címedre. Ezek nem részei az App API-nak; lásd: Aláírt műveletek. Telepítésenkénti korlátok: percenként 60 hívás az adminfelületről és 300 a webáruházból, valamint percenként 10 hívás vásárlónként. Ha egy hívás nem tud lefutni, a worker a következő hibakódok egyikét kapja: not_declared, timeout, upstream, too_large vagy unavailable.

Hibák

A sikertelen hívások PolturaRequestError hibát dobnak code, status, requestId (segítségkéréskor ezt add meg) és rate_limited esetén retryAfterMs mezőkkel. Ha a kérésre egyáltalán nem érkezett válasz, a kód a következők egyike: response_too_large, invalid_response, request_failed, aborted vagy unavailable.

Az API hibaüzenetének bodyja { "error": { "code", "message", "requestId", "details"?, "retryAfterMs"? } }, az alábbi kódokkal:

codeHTTP
invalid_input400
unauthorized401
forbidden403
not_found404
conflict409
stale_version412
quota_exceeded409
rate_limited429
payload_too_large413
unsupported_api_version400
unavailable503

Az OpenAPI 3.1 specifikáció az /openapi.json címen található, amelyet az SDK-val azonos sémákból generálunk.

További lépések

Utoljára frissítve