The Product Library API is used for managing merchant's product information and product images.
Bring your own key. This API needs your own Product Library API key - get one from the provider, add it once below, and the proxy injects it on every call. Your OmniStream plan covers the unified SDK, key storage, and proxy - the provider's own rate limits still apply to your key.
This is a community listing. If you own this API, you can request ownership.
npm install omnistream-sdkimport { OmniClient } from "omnistream-sdk";
const omni = new OmniClient({ token: process.env.OMNI_KEY! });
// One key reaches every API on the marketplace.
const data = await omni.call("izettle/getProductTypes");One install, one key - the same client calls every API on the marketplace.
Retrieve all categories
Create a new category
Rename a category
Delete a category
Retrieve all discounts
/**
* ProductLibraryAPI - generated by OmniStream from Product Library API's OpenAPI spec.
* One typed method per endpoint. A single Omni key reaches the API.
*/
const DEFAULT_BASE = "https://grid.skinvaults.online/v1/proxy/izettle";
export class ProductLibraryAPIError extends Error {
status: number;
code?: string;
constructor(status: number, code: string | undefined, message?: string) {
super(message || `ProductLibraryAPI error ${status}`);
this.name = "ProductLibraryAPIError";
this.status = status;
this.code = code;
}
}
export interface ProductLibraryAPIOptions {
baseUrl?: string;
fetch?: typeof fetch;
timeoutMs?: number;
}
export class ProductLibraryAPI {
/** @param token Your OmniStream key (one key for every API). */
constructor(private token: string, private opts: ProductLibraryAPIOptions = {}) {
if (!token) throw new Error("ProductLibraryAPI: token is required");
}
rateLimit: { remainingMinute?: number; remainingDay?: number } | null = null;
private async _request(method: string, path: string, { params, body }: { params?: Record<string, unknown>; body?: unknown } = {}): Promise<any> {
const f = this.opts.fetch ?? globalThis.fetch;
const url = new URL((this.opts.baseUrl ?? DEFAULT_BASE).replace(/\/+$/, "") + path);
if (params) for (const [k, v] of Object.entries(params)) if (v != null) url.searchParams.set(k, String(v));
const headers: Record<string, string> = { "x-omni-key": this.token };
if (body !== undefined) headers["content-type"] = "application/json";
const res = await f(url, { method, headers, body: body !== undefined ? JSON.stringify(body) : undefined });
this.rateLimit = {
remainingMinute: Number(res.headers.get("x-ratelimit-remaining-minute")) || undefined,
remainingDay: Number(res.headers.get("x-ratelimit-remaining-day")) || undefined,
};
const data = await res.json().catch(() => ({}));
if (!res.ok) throw new ProductLibraryAPIError(res.status, data?.error?.code, data?.error?.message);
return data.data ?? data;
}
/** Retrieve all categories */
getProductTypes(params: { "organizationUuid": string }): Promise<any> {
return this._request("GET", "/organizations/{organizationUuid}/categories/v2", { params });
}
/** Create a new category */
createCategories(body: unknown, params: { "organizationUuid": string }): Promise<any> {
return this._request("POST", "/organizations/{organizationUuid}/categories/v2", { body, params });
}
/** Rename a category */
renameCategory(body: unknown, params: { "organizationUuid": string; "categoryUuid": string }): Promise<any> {
return this._request("PATCH", "/organizations/{organizationUuid}/categories/v2/{categoryUuid}", { body, params });
}
/** Delete a category */
deleteCategory(params: { "organizationUuid": string; "categoryUuid": string }): Promise<any> {
return this._request("DELETE", "/organizations/{organizationUuid}/categories/v2/{categoryUuid}", { params });
}
/** Retrieve all discounts */
getAllDiscounts(params: { "organizationUuid": string }): Promise<any> {
return this._request("GET", "/organizations/{organizationUuid}/discounts", { params });
}
/** Create a discount */
createDiscount(body: unknown, params: { "organizationUuid": string }): Promise<any> {
return this._request("POST", "/organizations/{organizationUuid}/discounts", { body, params });
}
/** Retrieve a single discount */
getDiscount(params: { "organizationUuid": string; "discountUuid": string; "If-None-Match"?: string }): Promise<any> {
return this._request("GET", "/organizations/{organizationUuid}/discounts/{discountUuid}", { params });
}
/** Update a single discount */
updateDiscount(body: unknown, params: { "organizationUuid": string; "discountUuid": string; "If-Match"?: string }): Promise<any> {
return this._request("PUT", "/organizations/{organizationUuid}/discounts/{discountUuid}", { body, params });
}
/** Delete a single discount */
deleteDiscount(params: { "organizationUuid": string; "discountUuid": string }): Promise<any> {
return this._request("DELETE", "/organizations/{organizationUuid}/discounts/{discountUuid}", { params });
}
/** Retrieve all library item images */
getAllImageUrls(params: { "organizationUuid": string }): Promise<any> {
return this._request("GET", "/organizations/{organizationUuid}/images", { params });
}
/** Get status for latest import */
getLatestImportStatus(params: { "organizationUuid": string }): Promise<any> {
return this._request("GET", "/organizations/{organizationUuid}/import/status", { params });
}
/** Get status for an import */
getStatusByUuid(params: { "organizationUuid": string; "importUuid": string }): Promise<any> {
return this._request("GET", "/organizations/{organizationUuid}/import/status/{importUuid}", { params });
}
/** Import library items */
importLibraryV2(body: unknown, params: { "organizationUuid": string }): Promise<any> {
return this._request("POST", "/organizations/{organizationUuid}/import/v2", { body, params });
}
/** Retrieve the entire library */
getLibrary(params: { "organizationUuid": string; "eventLogUuid"?: string; "limit"?: number; "offset"?: string; "all"?: boolean }): Promise<any> {
return this._request("GET", "/organizations/{organizationUuid}/library", { params });
}
/** Retrieve all products visible in POS */
getAllProductsInPos(params: { "organizationUuid": string }): Promise<any> {
return this._request("GET", "/organizations/{organizationUuid}/products", { params });
}
/** Create a new product */
createProduct(body: unknown, params: { "organizationUuid": string; "returnEntity"?: boolean }): Promise<any> {
return this._request("POST", "/organizations/{organizationUuid}/products", { body, params });
}
/** Delete a list of products */
deleteProducts(params: { "organizationUuid": string; "uuid": unknown[] }): Promise<any> {
return this._request("DELETE", "/organizations/{organizationUuid}/products", { params });
}
/** Create a product identifier */
createProductSlug(body: unknown, params: { "organizationUuid": string }): Promise<any> {
return this._request("POST", "/organizations/{organizationUuid}/products/online/slug", { body, params });
}
/** Retrieve an aggregate of active Options in the library */
getAllOptions(params: { "organizationUuid": string }): Promise<any> {
return this._request("GET", "/organizations/{organizationUuid}/products/options", { params });
}
/** Retrieve all products visible in POS – v2 */
getAllProductsV2(params: { "organizationUuid": string; "sort"?: boolean }): Promise<any> {
return this._request("GET", "/organizations/{organizationUuid}/products/v2", { params });
}
/** Retrieve the count of existing products */
countAllProducts(params: { "organizationUuid": string }): Promise<any> {
return this._request("GET", "/organizations/{organizationUuid}/products/v2/count", { params });
}
/** Update a single product */
updateProduct(body: unknown, params: { "organizationUuid": string; "productUuid": string; "If-Match"?: string }): Promise<any> {
return this._request("PUT", "/organizations/{organizationUuid}/products/v2/{productUuid}", { body, params });
}
/** Retrieve a single product */
getProduct(params: { "organizationUuid": string; "productUuid": string; "If-None-Match"?: string }): Promise<any> {
return this._request("GET", "/organizations/{organizationUuid}/products/{productUuid}", { params });
}
/** Delete a single product */
deleteProduct(params: { "organizationUuid": string; "productUuid": string }): Promise<any> {
return this._request("DELETE", "/organizations/{organizationUuid}/products/{productUuid}", { params });
}
/** Get all available tax rates */
getTaxRates(): Promise<any> {
return this._request("GET", "/v1/taxes", {});
}
/** Create new tax rates */
createTaxRates(body: unknown): Promise<any> {
return this._request("POST", "/v1/taxes", { body });
}
/** Get all tax rates and a count of products associated with each */
getProductCountForAllTaxes(): Promise<any> {
return this._request("GET", "/v1/taxes/count", {});
}
/** Get the organization tax settings */
getTaxSettings(): Promise<any> {
return this._request("GET", "/v1/taxes/settings", {});
}
/** Update the organization tax settings */
setTaxationMode(body: unknown): Promise<any> {
return this._request("PUT", "/v1/taxes/settings", { body });
}
/** Get a single tax rate */
getTaxRate(params: { "taxRateUuid": string }): Promise<any> {
return this._request("GET", "/v1/taxes/{taxRateUuid}", { params });
}
/** Update a single tax rate */
updateTaxRate(body: unknown, params: { "taxRateUuid": string }): Promise<any> {
return this._request("PUT", "/v1/taxes/{taxRateUuid}", { body, params });
}
/** Delete a single tax rate */
deleteTaxRate(params: { "taxRateUuid": string }): Promise<any> {
return this._request("DELETE", "/v1/taxes/{taxRateUuid}", { params });
}
}
export default ProductLibraryAPI;
No reviews yet. Be the first to rate this API.
Yes. Product Library API uses bearer authentication, so you bring your own key from the provider. You store it once on OmniStream and the proxy injects it into every call, so your code only ever sends your Omni key.
The Product Library API is used for managing merchant's product information and product images. It exposes 32 endpoints over GET, POST, PATCH, DELETE, PUT, including GET /organizations/{organizationUuid}/categories/v2, POST /organizations/{organizationUuid}/categories/v2, PATCH /organizations/{organizationUuid}/categories/v2/{categoryUuid}.
Install the OmniStream SDK for your language and call Product Library API through it. The client is generated from this API's OpenAPI spec, so parameters and responses are fully typed, and the same client also calls every other API in the marketplace.
You can start on the free plan. OmniStream charges for the unified SDK, key storage and proxy rather than for Product Library API itself, and Product Library API's own rate limits still apply to your provider key.
ExchangeRate-API: Fetch the latest currency exchange rates via API. ExchangeRate-API is free and unlimited.
Create a discount
Retrieve a single discount
Update a single discount
Delete a single discount
Retrieve all library item images
Get status for latest import
Get status for an import
Import library items
Retrieve the entire library
Retrieve all products visible in POS
Create a new product
Delete a list of products
Create a product identifier
Retrieve an aggregate of active Options in the library
Retrieve all products visible in POS – v2
Retrieve the count of existing products
Update a single product
Retrieve a single product
Delete a single product
Get all available tax rates
Create new tax rates
Get all tax rates and a count of products associated with each
Get the organization tax settings
Update the organization tax settings
Get a single tax rate
Update a single tax rate
Delete a single tax rate