Using the Products API
Purpose of this guide
This guide covers how to create, retrieve, update, and delete the product master under a business account using ReceiptRoller's Products API. It is the entry point for working with product data from a mobile app or server integration.
Prerequisites
- You have obtained an access token via the OAuth 2.0 authorization code flow
- Your app's scopes include
store.products.read(read) and/orstore.products.write(create, update, delete) - You know the business account ID (UUID) (Listing business accounts, stores, and POS terminals)
- Base URL:
https://receiptroller.io
Endpoint list
| Method | Path | Purpose | Required scope |
|---|---|---|---|
| GET | /api/v1/products | List / search products | store.products.read |
| GET | /api/v1/products/{productId} | Details of a single product (including variants) | store.products.read |
| POST | /api/v1/products | Create a new product | store.products.write |
| PUT | /api/v1/products/{productId} | Update a product | store.products.write |
| DELETE | /api/v1/products/{productId} | Delete a product (soft delete) | store.products.write |
1. Retrieve the product list
GET /api/v1/products?organizationId={organizationId}
Authorization: Bearer {access_token}
Query parameters (optional)
search— partial-match search on product name, SKU, or JAN codecategory— filter by category (exact match)brand— filter by brand (exact match)
Example response
{
"organizationId": "a04507de-043a-4b47-b0a3-6204562f6e20",
"products": [
{
"id": "prd-001",
"productName": "ブレンドコーヒー M",
"sku": "CFE-BLD-M",
"janCode": "4912345000017",
"category": "ドリンク",
"brand": "オリジナル",
"pricing": {
"basePrice": 480,
"baseCostPrice": 120,
"taxRate": 0.10,
"storePrices": []
},
"images": {
"cover": "https://...",
"gallery": ["https://..."]
},
"status": "Active",
"variants": { "hasVariants": false, "options": [], "items": [] },
"integrations": {
"squareCatalogObjectId": "",
"smaregiProductId": "SMG-12345"
},
"createdAt": "2026-04-01T09:00:00Z",
"updatedAt": "2026-05-30T12:34:56Z"
}
],
"totalCount": 1
}
2. Retrieve details of a single product
GET /api/v1/products/{productId}?organizationId={organizationId}
Authorization: Bearer {access_token}
The response includes variants (such as size and color differences). If the product does not belong to the specified business account, it returns 404.
3. Create a new product
POST /api/v1/products?organizationId={organizationId}
Authorization: Bearer {access_token}
Content-Type: application/json
{
"productName": "新商品 アイスティー",
"sku": "TEA-ICE-001",
"janCode": "4912345000024",
"category": "ドリンク",
"brand": "オリジナル",
"description": "夏季限定の冷茶。",
"basePrice": 380,
"baseCostPrice": 95,
"taxRate": 0.10,
"status": "Active",
"imageUrl": "https://..."
}
Notes
- Only
productNameis required. Everything else can be omitted - Even if you include
organizationIdin the request body, it is ignored. The business account resolved from the token/query is always used (this prevents accidental writes to another tenant) - The response is the complete product object, including the newly assigned
id(productId)
4. Update a product
PUT /api/v1/products/{productId}?organizationId={organizationId}
Authorization: Bearer {access_token}
Content-Type: application/json
{
"productName": "新商品 アイスティー(無糖)",
"basePrice": 400,
"status": "Active"
}
The fields you send overwrite the product record (this is a full replacement, not a partial update). Resend the existing values together for any field you want to preserve.
5. Delete a product (soft delete)
DELETE /api/v1/products/{productId}?organizationId={organizationId}
Authorization: Bearer {access_token}
Notes
- The response is
204 No Content - Because this is a soft delete, the product ID can still be resolved from past POS receipt line items
- Deleted products are not included in list or search results
Handling POS integration IDs
ReceiptRoller's product master is integrated with external POS systems. The integrations block may contain the following IDs.
squareCatalogObjectId/squareVariationId— the link to Square CatalogsmaregiProductId— the link to Smaregi's product ID
For products synced from an external POS as the source of truth, these IDs are set automatically. You can write them directly from the API, but it is usually safer to leave them to POS sync and not touch them.
Variants (size and color differences)
When a single product has multiple variants, variants.hasVariants = true and both variants.options (option definitions) and variants.items (the actual variant entries) are populated. The common design is to register only the minimal parent product on creation and add variants later through a separate UI/API.
A typical flow (mobile app)
- Obtain an access token via OAuth → include
store.products.readandstore.products.writein the scopes - Select a business account with
GET /api/v1/me/organizations - Show
GET /api/v1/productswith pagination on the product list screen - Use
POST /api/v1/productson the new product screen - On the edit screen,
GET /api/v1/products/{id}→PUT /api/v1/products/{id} - After a delete confirmation,
DELETE /api/v1/products/{id}
Error responses
| Status | Meaning | What to do |
|---|---|---|
| 401 Unauthorized | Access token invalid / expired | Re-obtain with the refresh token |
| 403 Forbidden | Missing required scope / not a member of the business account | Check the scopes and the selected business account |
| 400 Bad Request | Missing required field (productName) | Review the request body |
| 404 Not Found | The product ID does not exist in that business account | Re-fetch from the list |
Related articles
-
Using the Store Information APIA guide to the REST API for fetching and updating a store's basic information (store name, store type, contact details, and address). Lets you implement a store information editing screen from token-authenticated clients such as staff apps.
-
PosTransactionDto specification — field reference for transaction dataA complete field reference for PosTransactionDto, the canonical model for the transaction data ReceiptRoller handles. For each category — identifiers, dates, amounts, line items, payments, staff, status, and CRM linkage — it summarizes the field names, types, meanings, and how each POS vendor populates them. A reference for developers and external-system integrators. Also referenced from the Smaregi and Square mapping articles.
-
Purchase and receipt data integrationExplains the structure of the purchase and receipt data ReceiptRoller handles, how to retrieve it, related scopes, Webhooks, and common use cases.
-
Using the Business Hours APIA guide to ReceiptRoller's Business Hours API (/api/v1/stores/{storeId}/business-hours). Covers retrieving and updating per-day business hours, registering special business days (temporary closures and hour changes), configuring a store's workable hours (the upper bound for shift creation), and determining whether the store is currently open.
-
Using the Orders / OMS APIA guide to CRUD operations on the orders under a business account using ReceiptRoller's Orders / OMS API (/api/v1/orders). Covers creating, updating, transitioning status (confirm, process, cancel), and deleting orders, plus the flow for Android / iOS apps and server integrations.