Product · product
Portable POS product contract. externalId and name are the stable core fields; description, price, taxable, currencyCode, and categoryExternalId become important for some write targets such as Lightspeed R-Series, Square, and Clover.
Entity type:
product· Methods: GET · POST
Portable POS product contract. externalId and name are the stable core fields; description, price, taxable, currencyCode, and categoryExternalId become important for some write targets such as Lightspeed R-Series, Square, and Clover.
Endpoints
GET /unified/{accountId}/product # List normalized product records
POST /unified/{accountId}/product # Create / push one productSchema
| Field | Type | Required | Description |
|---|---|---|---|
externalId | string | Yes | Stable product identifier. Used as the idempotency key on writes. |
name | string | Yes | Primary sellable product name. |
description | string | — | Human-readable product description or long description. |
sku | string | — | Primary SKU or item code. |
barcode | string | — | Primary barcode / UPC / EAN / product code. |
price | number | — | Primary sell price in major currency units. |
cost | number | — | Primary unit cost in major currency units. |
active | boolean | — | Whether the product is active / available. |
taxable | boolean | — | Whether the product is taxable when the target requires that flag. |
stockOnHand | integer | — | Primary on-hand stock quantity when available. |
categoryExternalId | string | — | Source or mapped category / group identifier used by some targets. |
categoryName | string | — | Human-readable category / product type name. |
vendor | string | — | Vendor / manufacturer / brand label when present. |
tags | string[] | — | Searchable tags or labels. |
imageUrl | string · URL | — | Primary product image URL. |
currencyCode | string · ISO 4217 | — | 3-letter currency code. Needed by some write targets such as Square. |
Example object
{
"externalId": "prd_tee_black_m",
"name": "Organic Tee — Black / M",
"description": "100% organic cotton, garment dyed.",
"sku": "TEE-BLK-M",
"barcode": "840000012345",
"price": 32,
"cost": 11.4,
"active": true,
"taxable": true,
"stockOnHand": 142,
"categoryExternalId": "cat_apparel",
"categoryName": "Apparel",
"vendor": "Drift Basics",
"tags": [
"organic",
"core"
],
"currencyCode": "USD"
}The same shape is used as the POST request body and returned by GET reads — reads from
every connected system are normalized to it.
Requests
curl "https://api.linktoany.com/unified/{accountId}/product?pageSize=10" \
-H "accept: application/json" \
-H "authorization: Bearer ak_<your_api_key>"const page = await client.records.list(accountId, 'product', {
pageSize: 10,
});
for (const product of page.data) {
console.log(product);
}
// Or walk every page — the SDK follows the cursor for you
for await (const product of client.records.iterate(accountId, 'product')) {
await save(product);
}curl -X POST "https://api.linktoany.com/unified/{accountId}/product" \
-H "accept: application/json" \
-H "authorization: Bearer ak_<your_api_key>" \
-H "content-type: application/json" \
-d '{"externalId":"prd_tee_black_m","name":"Organic Tee — Black / M","description":"100% organic cotton, garment dyed.","sku":"TEE-BLK-M","barcode":"840000012345","price":32,"cost":11.4,"active":true,"taxable":true,"stockOnHand":142,"categoryExternalId":"cat_apparel","categoryName":"Apparel","vendor":"Drift Basics","tags":["organic","core"],"currencyCode":"USD"}'await client.records.create(accountId, 'product', {
externalId: 'prd_tee_black_m',
name: 'Organic Tee — Black / M',
description: '100% organic cotton, garment dyed.',
sku: 'TEE-BLK-M',
barcode: '840000012345',
price: 32,
cost: 11.4,
active: true,
taxable: true,
stockOnHand: 142,
categoryExternalId: 'cat_apparel',
categoryName: 'Apparel',
vendor: 'Drift Basics',
tags: [
'organic',
'core'
],
currencyCode: 'USD'
});Supported systems
| System | Read | Write | Auth | Rate limit |
|---|---|---|---|---|
| Shopify | Yes | Yes | OAuth 2.0 | 1 req / s |
| Lightspeed X-Series | Yes | Yes | OAuth 2.0 | 10 req / s · 100 req / min |
| Lightspeed R-Series | Yes | Yes | OAuth 2.0 | 1 req / 10s |
| Square | Yes | Yes | OAuth 2.0 | 5 req / s |
| Clover (Asia Pacific) | Yes | Yes | API token | 10 req / s · 100 req / min |
Order · order
Portable POS order contract with source order identity, status, party references, and normalized line items. currencyCode and locationExternalId matter when targeting Square; lineItems[].productExternalId matters when targeting Lightspeed X-Series sales.
Restaurant
Menu, customer, order, and labor entities normalized across restaurant platforms — Square, Toast, Clover, and Lightspeed K-Series.