# Admin API
Manage catalog, inventory, customers, orders, fulfillment, payments, and store settings.
Canonical: https://docs.ecomiq.pe/en/docs/admin
Use Admin API to automate an organization's internal operations. Protected operations require a token with the corresponding permissions.
## API areas
- [Platform & Identity](/en/docs/admin/platform-and-identity): Organizations, stores, domains, settings, and API keys.
- [Catalog](/en/docs/admin/catalog): Products, variants, categories, pricing, and catalog enrichment.
- [Inventory](/en/docs/admin/inventory): Stock, reservations, availability, and inventory movements.
- [Customers](/en/docs/admin/customers): Customer profiles, addresses, groups, and activity.
- [Orders](/en/docs/admin/orders): Orders, drafts, statuses, and post-purchase operations.
- [Fulfillment & Shipping](/en/docs/admin/fulfillment-and-shipping): Fulfillment, shipping, rates, zones, pickup, and coverage.
- [Payments & Finance](/en/docs/admin/payments-and-finance): Billing, credits, payment operations, sellers, and commissions.
- [Promotions](/en/docs/admin/promotions): Discounts, coupons, and promotional pricing rules.
- [Webhooks](/en/docs/admin/webhooks): Subscriptions, events, deliveries, retries, and operational control.
---
# Catalog
Products, variants, categories, pricing, and catalog enrichment.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog
- [Products](/en/docs/admin/catalog/products): Create and update products, relationships, files, and catalog imports.
- [Variants](/en/docs/admin/catalog/variants): Inspect variants and work with spreadsheet editing sessions.
- [SKUs](/en/docs/admin/catalog/skus): Check variant availability by SKU.
- [Brands](/en/docs/admin/catalog/brands): Create and maintain the brands used to classify products.
- [Categories](/en/docs/admin/catalog/categories): Create and update categories, organize their tree, and import or export categories.
- [Collections](/en/docs/admin/catalog/collections): Manage collections and the products included in each one.
- [Specifications](/en/docs/admin/catalog/specifications): Manage specifications, values, and aliases used by the catalog.
- [Size Guides](/en/docs/admin/catalog/size-guides): Manage size guides and assign them to products.
- [Price Lists](/en/docs/admin/catalog/price-lists): Create price lists and update their rules.
- [Price History](/en/docs/admin/catalog/price-history): Inspect recorded price changes for products and variants.
- [Recommendations](/en/docs/admin/catalog/recommendations): Find products that can be linked as recommendations.
- [Product Reviews](/en/docs/admin/catalog/product-reviews): Inspect product reviews and update their moderation status.
- [Channels](/en/docs/admin/catalog/channels): Publish products and inspect their publication state by channel.
- [Spreadsheet](/en/docs/admin/catalog/spreadsheet): Save changes made in a spreadsheet session.
- [Notifications](/en/docs/admin/catalog/notifications): Create, publish, and inspect notification templates, their groups, and versions.
---
# Brands
Create and maintain the brands used to classify products.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/brands
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/brands`](/en/docs/admin/catalog/brands/create-brand) | Create brand |
| `GET` | [`/v1/catalog/brands`](/en/docs/admin/catalog/brands/list-brands) | List brands |
| `POST` | [`/v1/catalog/brands/exports`](/en/docs/admin/catalog/brands/queue-a-brands-export) | Queue a brands export |
| `POST` | [`/v1/catalog/brands/import`](/en/docs/admin/catalog/brands/queue-a-brands-import) | Queue a brands import |
| `GET` | [`/v1/catalog/brands/{brandId}`](/en/docs/admin/catalog/brands/get-brand-by-id) | Get brand by ID |
| `GET` | [`/v1/catalog/brands/suggests`](/en/docs/admin/catalog/brands/suggests-brands) | Suggests brands |
| `PUT` | [`/v1/catalog/brands/{brandId}`](/en/docs/admin/catalog/brands/update-a-brand) | Update a brand |
| `DELETE` | [`/v1/catalog/brands/{brandId}`](/en/docs/admin/catalog/brands/delete-a-brand) | Delete a brand |
---
# Create brand
Create a new brand in the catalog
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/brands/create-brand
## Create brand
`POST /v1/catalog/brands`
Lifecycle: **stable**
Create a new brand in the catalog
Required permissions (any): `catalog:create`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `slug` (string): URL-friendly identifier.
- `logo` (string)
- `icon` (string)
- `description` (string)
- `metaTitle` (string)
- `metaDescription` (string)
- `keywords` (array)
- `order` (integer (int32))
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/brands' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete a brand
Delete an existing brand (only if it has no associated products)
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/brands/delete-a-brand
## Delete a brand
`DELETE /v1/catalog/brands/{brandId}`
Lifecycle: **stable**
Delete an existing brand (only if it has no associated products)
Required permissions (any): `catalog:delete`
### Parameters
- `brandId` (path, string, required)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `409`: Conflict — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/catalog/brands/{brandId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get brand by ID
Retrieve a specific brand by its ID
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/brands/get-brand-by-id
## Get brand by ID
`GET /v1/catalog/brands/{brandId}`
Lifecycle: **stable**
Retrieve a specific brand by its ID
Required permissions (any): `catalog:read`
### Parameters
- `brandId` (path, string, required)
### Responses
- `200`: OK — application/json, BrandDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/brands/{brandId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List brands
Retrieve a paginated list of brands with optional filtering
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/brands/list-brands
## List brands
`GET /v1/catalog/brands`
Lifecycle: **stable**
Retrieve a paginated list of brands with optional filtering
Required permissions (any): `catalog:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `ids` (query, array)
- `isActive` (query, boolean)
### Responses
- `200`: OK — application/json, PaginatedItemsOfBrandDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/brands' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Queue a brands export
Queues a brand export. Returns a job; the file becomes downloadable once it completes.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/brands/queue-a-brands-export
## Queue a brands export
`POST /v1/catalog/brands/exports`
Lifecycle: **stable**
Queues a brand export. Returns a job; the file becomes downloadable once it completes.
Required permissions (any): `catalog:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `format` (string)
- `search` (string): Free-text filter. Which fields it covers depends on the resource.
- `brandIds` (array)
- `status` (array)
- `template` (boolean)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/brands/exports' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Queue a brands import
Queues a brand import from a file. Returns a job you poll for progress.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/brands/queue-a-brands-import
## Queue a brands import
`POST /v1/catalog/brands/import`
Lifecycle: **stable**
Queues a brand import from a file. Returns a job you poll for progress.
Required permissions (any): `catalog:create`
### Request body
Content-Type: `multipart/form-data` · required
#### Fields
- `assetId` (string)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/brands/import' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: multipart/form-data'
```
---
# Suggests brands
Retrieve a suggest of brands
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/brands/suggests-brands
## Suggests brands
`GET /v1/catalog/brands/suggests`
Lifecycle: **stable**
Retrieve a suggest of brands
Required permissions (any): `catalog:read`
### Parameters
- `q` (query, string, required)
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/brands/suggests' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update a brand
Update an existing brand
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/brands/update-a-brand
## Update a brand
`PUT /v1/catalog/brands/{brandId}`
Lifecycle: **stable**
Update an existing brand
Required permissions (any): `catalog:update`
### Parameters
- `brandId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `slug` (string): URL-friendly identifier.
- `logo` (string)
- `icon` (string)
- `description` (string)
- `metaTitle` (string)
- `metaDescription` (string)
- `keywords` (array)
- `order` (integer (int32))
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/catalog/brands/{brandId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Categories
Create and update categories, organize their tree, and import or export categories.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/categories
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/categories`](/en/docs/admin/catalog/categories/create-category) | Create category |
| `GET` | [`/v1/catalog/categories`](/en/docs/admin/catalog/categories/list-categories) | List categories |
| `POST` | [`/v1/catalog/categories/exports`](/en/docs/admin/catalog/categories/queue-a-categories-export) | Queue a categories export |
| `POST` | [`/v1/catalog/categories/import`](/en/docs/admin/catalog/categories/queue-a-categories-import) | Queue a categories import |
| `GET` | [`/v1/catalog/categories/{categoryId}`](/en/docs/admin/catalog/categories/get-category-by-id) | Get category by ID |
| `GET` | [`/v1/catalog/categories/suggests`](/en/docs/admin/catalog/categories/suggest-categories) | Suggest categories |
| `PUT` | [`/v1/catalog/categories/{categoryId}`](/en/docs/admin/catalog/categories/update-a-category) | Update a category |
| `DELETE` | [`/v1/catalog/categories/{categoryId}`](/en/docs/admin/catalog/categories/delete-a-category) | Delete a category |
| `GET` | [`/v1/catalog/categories/tree`](/en/docs/admin/catalog/categories/get-categories-tree) | Get categories tree |
| `PUT` | [`/v1/catalog/categories/tree`](/en/docs/admin/catalog/categories/update-categories-tree) | Update categories tree |
---
# Create category
Create a new category in the catalog
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/categories/create-category
## Create category
`POST /v1/catalog/categories`
Lifecycle: **stable**
Create a new category in the catalog
Required permissions (any): `catalog:create`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `slug` (string): URL-friendly identifier.
- `logo` (string)
- `icon` (string)
- `description` (string)
- `metaTitle` (string)
- `metaDescription` (string)
- `keywords` (array)
- `order` (integer (int32))
- `parentId` (string)
- `requiresSizeGuide` (boolean)
- `commissionPercentage` (number (double))
- `commissionFixedFee` (number (double))
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/categories' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete a category
Delete an existing category (only if it has no subcategories or associated products)
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/categories/delete-a-category
## Delete a category
`DELETE /v1/catalog/categories/{categoryId}`
Lifecycle: **stable**
Delete an existing category (only if it has no subcategories or associated products)
Required permissions (any): `catalog:delete`
### Parameters
- `categoryId` (path, string, required)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `409`: Conflict — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/catalog/categories/{categoryId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get categories tree
Retrieve a hierarchical tree of categories
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/categories/get-categories-tree
## Get categories tree
`GET /v1/catalog/categories/tree`
Lifecycle: **stable**
Retrieve a hierarchical tree of categories
Required permissions (any): `catalog:read`
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/categories/tree' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get category by ID
Retrieve a specific category by its ID
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/categories/get-category-by-id
## Get category by ID
`GET /v1/catalog/categories/{categoryId}`
Lifecycle: **stable**
Retrieve a specific category by its ID
Required permissions (any): `catalog:read`
### Parameters
- `categoryId` (path, string, required)
### Responses
- `200`: OK — application/json, CategoryDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/categories/{categoryId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List categories
Retrieve a paginated list of categories with optional parent filtering
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/categories/list-categories
## List categories
`GET /v1/catalog/categories`
Lifecycle: **stable**
Retrieve a paginated list of categories with optional parent filtering
Required permissions (any): `catalog:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `parentId` (query, string)
- `ids` (query, array)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfCategoryDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/categories' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Queue a categories export
Queues a category export. Returns a job; the file becomes downloadable once it completes.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/categories/queue-a-categories-export
## Queue a categories export
`POST /v1/catalog/categories/exports`
Lifecycle: **stable**
Queues a category export. Returns a job; the file becomes downloadable once it completes.
Required permissions (any): `catalog:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `format` (string)
- `search` (string): Free-text filter. Which fields it covers depends on the resource.
- `status` (array)
- `excludeStatus` (array)
- `includeArchived` (boolean)
- `categoryIds` (array)
- `excludeCategoryIds` (array)
- `brandIds` (array)
- `excludeBrandIds` (array)
- `sellerIds` (array)
- `excludeSellerIds` (array)
- `productIds` (array)
- `skuIds` (array)
- `skus` (array)
- `types` (array)
- `excludeTypes` (array)
- `isFeatured` (boolean)
- `ean` (string)
- `minPrice` (number (double))
- `maxPrice` (number (double))
- `minOnHand` (integer (int32))
- `maxOnHand` (integer (int32))
- `minAvailable` (integer (int32))
- `tags` (array)
- `excludeTags` (array)
- `template` (boolean)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/categories/exports' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Queue a categories import
Queues a category import from a file. Returns a job you poll for progress.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/categories/queue-a-categories-import
## Queue a categories import
`POST /v1/catalog/categories/import`
Lifecycle: **stable**
Queues a category import from a file. Returns a job you poll for progress.
Required permissions (any): `catalog:create`
### Request body
Content-Type: `multipart/form-data` · required
#### Fields
- `assetId` (string)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/categories/import' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: multipart/form-data'
```
---
# Suggest categories
Retrieve a suggest of categories
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/categories/suggest-categories
## Suggest categories
`GET /v1/catalog/categories/suggests`
Lifecycle: **stable**
Retrieve a suggest of categories
Required permissions (any): `catalog:read`
### Parameters
- `q` (query, string, required)
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/categories/suggests' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update a category
Update an existing category
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/categories/update-a-category
## Update a category
`PUT /v1/catalog/categories/{categoryId}`
Lifecycle: **stable**
Update an existing category
Required permissions (any): `catalog:update`
### Parameters
- `categoryId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `slug` (string): URL-friendly identifier.
- `logo` (string)
- `icon` (string)
- `description` (string)
- `metaTitle` (string)
- `metaDescription` (string)
- `keywords` (array)
- `order` (integer (int32))
- `parentId` (string)
- `requiresSizeGuide` (boolean)
- `commissionPercentage` (number (double))
- `commissionFixedFee` (number (double))
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/catalog/categories/{categoryId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Update categories tree
Update the hierarchical structure of categories
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/categories/update-categories-tree
## Update categories tree
`PUT /v1/catalog/categories/tree`
Lifecycle: **stable**
Update the hierarchical structure of categories
Required permissions (any): `catalog:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `categories` (array)
### Responses
- `200`: OK — application/json, boolean
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/catalog/categories/tree' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Channels
Publish products and inspect their publication state by channel.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/channels
The `/v1/import-sources/*` routes are internal connector infrastructure: they create the external source, validate its connection, map its data, and activate the import. They are not part of the public contract. Use the operations on this page to publish products or inspect their status.
### Listings
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/channels/listings`](/en/docs/admin/catalog/channels/create-listing) | Create listing |
| `GET` | [`/v1/channels/listings`](/en/docs/admin/catalog/channels/list-listings) | List listings |
| `GET` | [`/v1/channels/listings/{id}`](/en/docs/admin/catalog/channels/get-listing-by-id) | Get listing by id |
| `POST` | [`/v1/channels/listings/{id}/publish`](/en/docs/admin/catalog/channels/queue-publication-for-a-listing) | Queue publication for a listing |
| `POST` | [`/v1/channels/listings/{id}/unpublish`](/en/docs/admin/catalog/channels/unpublish-a-listing) | Unpublish a listing |
| `PATCH` | [`/v1/channels/listings/{id}/price`](/en/docs/admin/catalog/channels/update-listing-price) | Update listing price |
### Products
| Method | Endpoint | Operation |
| --- | --- | --- |
| `GET` | [`/v1/channels/products/publications`](/en/docs/admin/catalog/channels/list-product-publications-for-a-set-of-products) | List product publications for a set of products |
| `GET` | [`/v1/channels/products/{productId}/publications`](/en/docs/admin/catalog/channels/list-product-publications) | List product publications |
| `POST` | [`/v1/channels/{channelId}/products/{productId}/publish`](/en/docs/admin/catalog/channels/publish-a-product-to-a-channel) | Publish a product to a channel |
### Publication
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/channels/{channelId}/publication/publish`](/en/docs/admin/catalog/channels/queue-publication-for-ready-listings) | Queue publication for ready listings |
| `GET` | [`/v1/channels/{channelId}/publication/readiness`](/en/docs/admin/catalog/channels/get-publication-readiness) | Get publication readiness |
---
# Create listing
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/channels/create-listing
## Create listing
`POST /v1/channels/listings`
Lifecycle: **stable**
Required permissions (any): `channel:create`
### Request body
Content-Type: `application/json` · required
#### Fields
- `channelId` (string, required)
- `productId` (string, required)
- `price` (number (double), required)
- `compareAtPrice` (number (double))
- `syncInventory` (boolean)
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/channels/listings' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Get listing by id
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/channels/get-listing-by-id
## Get listing by id
`GET /v1/channels/listings/{id}`
Lifecycle: **stable**
Required permissions (any): `channel:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, ChannelListingDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/channels/listings/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get publication readiness
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/channels/get-publication-readiness
## Get publication readiness
`GET /v1/channels/{channelId}/publication/readiness`
Lifecycle: **stable**
Required permissions (any): `channel:read`
### Parameters
- `channelId` (path, string, required)
### Responses
- `200`: OK — application/json, PublicationReadinessDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/channels/{channelId}/publication/readiness' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List listings
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/channels/list-listings
## List listings
`GET /v1/channels/listings`
Lifecycle: **stable**
Required permissions (any): `channel:read`
### Parameters
- `channelId` (query, string)
- `listingType` (query, QueryEnumOfListingType)
- `status` (query, QueryEnumOfListingStatus)
- `take` (query, integer (int32))
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/channels/listings' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List product publications
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/channels/list-product-publications
## List product publications
`GET /v1/channels/products/{productId}/publications`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Parameters
- `productId` (path, string, required)
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/channels/products/{productId}/publications' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List product publications for a set of products
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/channels/list-product-publications-for-a-set-of-products
## List product publications for a set of products
`GET /v1/channels/products/publications`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Parameters
- `productIds` (query, array, required)
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/channels/products/publications' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Publish a product to a channel
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/channels/publish-a-product-to-a-channel
## Publish a product to a channel
`POST /v1/channels/{channelId}/products/{productId}/publish`
Lifecycle: **stable**
Required permissions (any): `channel:update`
### Parameters
- `channelId` (path, string, required)
- `productId` (path, string, required)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/channels/{channelId}/products/{productId}/publish' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Queue publication for a listing
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/channels/queue-publication-for-a-listing
## Queue publication for a listing
`POST /v1/channels/listings/{id}/publish`
Lifecycle: **stable**
Required permissions (any): `channel:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/channels/listings/{id}/publish' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Queue publication for ready listings
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/channels/queue-publication-for-ready-listings
## Queue publication for ready listings
`POST /v1/channels/{channelId}/publication/publish`
Lifecycle: **stable**
Required permissions (any): `channel:update`
### Parameters
- `channelId` (path, string, required)
### Responses
- `200`: OK — application/json, PublishReadyResultDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/channels/{channelId}/publication/publish' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Unpublish a listing
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/channels/unpublish-a-listing
## Unpublish a listing
`POST /v1/channels/listings/{id}/unpublish`
Lifecycle: **stable**
Required permissions (any): `channel:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/channels/listings/{id}/unpublish' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update listing price
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/channels/update-listing-price
## Update listing price
`PATCH /v1/channels/listings/{id}/price`
Lifecycle: **stable**
Required permissions (any): `channel:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `price` (number (double), required)
- `compareAtPrice` (number (double))
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PATCH \
--url 'https://api.ecomiq.pe/api/v1/channels/listings/{id}/price' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Collections
Manage collections and the products included in each one.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/collections
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/collections`](/en/docs/admin/catalog/collections/create-collection) | Create collection |
| `GET` | [`/v1/catalog/collections`](/en/docs/admin/catalog/collections/list-collections) | List collections |
| `POST` | [`/v1/catalog/collections/preview-count`](/en/docs/admin/catalog/collections/create-collection-preview-count) | Create collection preview count |
| `POST` | [`/v1/catalog/collections/exports`](/en/docs/admin/catalog/collections/queue-a-collections-export) | Queue a collections export |
| `POST` | [`/v1/catalog/collections/import`](/en/docs/admin/catalog/collections/queue-a-collections-import) | Queue a collections import |
| `GET` | [`/v1/catalog/collections/{collectionId}`](/en/docs/admin/catalog/collections/get-collection) | Get collection |
| `PUT` | [`/v1/catalog/collections/{collectionId}`](/en/docs/admin/catalog/collections/update-collection) | Update collection |
| `DELETE` | [`/v1/catalog/collections/{collectionId}`](/en/docs/admin/catalog/collections/delete-collection) | Delete collection |
| `GET` | [`/v1/catalog/collections/{collectionId}/products`](/en/docs/admin/catalog/collections/list-collection-products) | List collection products |
| `PUT` | [`/v1/catalog/collections/{collectionId}/products`](/en/docs/admin/catalog/collections/set-collection-products) | Set collection products |
---
# Create collection
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/collections/create-collection
## Create collection
`POST /v1/catalog/collections`
Lifecycle: **stable**
Required permissions (any): `catalog:create`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `slug` (string): URL-friendly identifier.
- `description` (string)
- `status` (CollectionStatus)
- `image` (null | CollectionImageDto)
- `type` (CollectionType)
- `dynamicOperator` (ConditionOperator)
- `validFrom` (string (date-time))
- `validTo` (string (date-time))
- `rules` (array)
- `includeCollectionIds` (array)
- `excludeCollectionIds` (array)
- `includeProductIds` (array)
- `excludeProductIds` (array)
- `pins` (array)
### Responses
- `201`: Created — application/json, string
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `409`: Conflict — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/collections' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Create collection preview count
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/collections/create-collection-preview-count
## Create collection preview count
`POST /v1/catalog/collections/preview-count`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `dynamicOperator` (ConditionOperator)
- `rules` (array)
- `includeCollectionIds` (array)
- `excludeCollectionIds` (array)
- `includeProductIds` (array)
- `excludeProductIds` (array)
### Responses
- `200`: OK
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/collections/preview-count' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete collection
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/collections/delete-collection
## Delete collection
`DELETE /v1/catalog/collections/{collectionId}`
Lifecycle: **stable**
Required permissions (any): `catalog:delete`
### Parameters
- `collectionId` (path, string, required)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/catalog/collections/{collectionId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get collection
Returns collection metadata, rules, overrides and counts. Product rows are available separately through the paginated collection products endpoint.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/collections/get-collection
## Get collection
`GET /v1/catalog/collections/{collectionId}`
Lifecycle: **stable**
Returns collection metadata, rules, overrides and counts. Product rows are available separately through the paginated collection products endpoint.
Required permissions (any): `catalog:read`
### Parameters
- `collectionId` (path, string, required)
### Responses
- `200`: OK — application/json, CollectionDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/collections/{collectionId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List collection products
Returns a paginated product summary for a collection. Use this endpoint to render collection products instead of loading raw product IDs from the collection detail.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/collections/list-collection-products
## List collection products
`GET /v1/catalog/collections/{collectionId}/products`
Lifecycle: **stable**
Returns a paginated product summary for a collection. Use this endpoint to render collection products instead of loading raw product IDs from the collection detail.
Required permissions (any): `catalog:read`
### Parameters
- `collectionId` (path, string, required)
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfCollectionProductItemDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/collections/{collectionId}/products' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List collections
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/collections/list-collections
## List collections
`GET /v1/catalog/collections`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `type` (query, QueryEnumOfCollectionType)
- `status` (query, QueryEnumOfCollectionStatus)
- `types` (query, array)
- `statuses` (query, array)
- `excludeTypes` (query, array)
- `excludeStatuses` (query, array)
- `ids` (query, array)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfCollectionItemDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/collections' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Queue a collections export
Queues a collection export. Returns a job; the file becomes downloadable once it completes.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/collections/queue-a-collections-export
## Queue a collections export
`POST /v1/catalog/collections/exports`
Lifecycle: **stable**
Queues a collection export. Returns a job; the file becomes downloadable once it completes.
Required permissions (any): `catalog:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `format` (string)
- `search` (string): Free-text filter. Which fields it covers depends on the resource.
- `status` (array)
- `excludeStatus` (array)
- `includeArchived` (boolean)
- `categoryIds` (array)
- `excludeCategoryIds` (array)
- `brandIds` (array)
- `excludeBrandIds` (array)
- `sellerIds` (array)
- `excludeSellerIds` (array)
- `productIds` (array)
- `skuIds` (array)
- `skus` (array)
- `types` (array)
- `excludeTypes` (array)
- `isFeatured` (boolean)
- `ean` (string)
- `minPrice` (number (double))
- `maxPrice` (number (double))
- `minOnHand` (integer (int32))
- `maxOnHand` (integer (int32))
- `minAvailable` (integer (int32))
- `tags` (array)
- `excludeTags` (array)
- `template` (boolean)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/collections/exports' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Queue a collections import
Queues a collection import from a file. Returns a job you poll for progress.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/collections/queue-a-collections-import
## Queue a collections import
`POST /v1/catalog/collections/import`
Lifecycle: **stable**
Queues a collection import from a file. Returns a job you poll for progress.
Required permissions (any): `catalog:create`
### Request body
Content-Type: `multipart/form-data` · required
#### Fields
- `assetId` (string)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/collections/import' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: multipart/form-data'
```
---
# Set collection products
Replaces the manual product assignments for a static collection. Use product IDs only on write operations.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/collections/set-collection-products
## Set collection products
`PUT /v1/catalog/collections/{collectionId}/products`
Lifecycle: **stable**
Replaces the manual product assignments for a static collection. Use product IDs only on write operations.
Required permissions (any): `catalog:update`
### Parameters
- `collectionId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `productIds` (array)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/catalog/collections/{collectionId}/products' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Update collection
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/collections/update-collection
## Update collection
`PUT /v1/catalog/collections/{collectionId}`
Lifecycle: **stable**
Required permissions (any): `catalog:update`
### Parameters
- `collectionId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `slug` (string): URL-friendly identifier.
- `description` (string)
- `status` (CollectionStatus)
- `image` (null | CollectionImageDto)
- `type` (CollectionType)
- `dynamicOperator` (ConditionOperator)
- `validFrom` (string (date-time))
- `validTo` (string (date-time))
- `rules` (array)
- `includeCollectionIds` (array)
- `excludeCollectionIds` (array)
- `includeProductIds` (array)
- `excludeProductIds` (array)
- `pins` (array)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `409`: Conflict — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/catalog/collections/{collectionId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Notifications
Create, publish, and inspect notification templates, their groups, and versions.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/notifications
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/notifications/templates`](/en/docs/admin/catalog/notifications/create-template) | Create template |
| `GET` | [`/v1/notifications/templates`](/en/docs/admin/catalog/notifications/list-templates) | List templates |
| `GET` | [`/v1/notifications/templates/{templateId}`](/en/docs/admin/catalog/notifications/get-template-by-id) | Get template by ID |
| `GET` | [`/v1/notifications/templates/{templateKey}`](/en/docs/admin/catalog/notifications/get-template) | Get template |
| `GET` | [`/v1/notifications/templates/groups`](/en/docs/admin/catalog/notifications/list-template-groups) | List template groups |
| `PUT` | [`/v1/notifications/templates/{id}`](/en/docs/admin/catalog/notifications/updatedrafttemplate) | UpdateDraftTemplate |
| `POST` | [`/v1/notifications/templates/{id}/publish`](/en/docs/admin/catalog/notifications/publishtemplate) | PublishTemplate |
| `GET` | [`/v1/notifications/templates/{templateId}/versions`](/en/docs/admin/catalog/notifications/list-template-versions-by-id) | List template versions by ID |
| `GET` | [`/v1/notifications/templates/{templateKey}/versions`](/en/docs/admin/catalog/notifications/list-template-versions-by-key) | List template versions by key |
---
# Create template
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/notifications/create-template
## Create template
`POST /v1/notifications/templates`
Lifecycle: **stable**
Required permissions (any): `notification:create`
### Request body
Content-Type: `application/json` · required
#### Fields
- `group` (string, required)
- `key` (string, required)
- `name` (string, required)
- `notification` (NotificationChannel, required)
- `locale` (string, required)
- `subjectTpl` (string, required)
- `bodyTpl` (string, required)
- `engine` (string, required)
- `textTpl` (string)
### Responses
- `200`: OK — application/json, ResultOflong
- `201`: Created — application/json, value
- `400`: Bad Request — application/json, value
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/notifications/templates' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Get template
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/notifications/get-template
## Get template
`GET /v1/notifications/templates/{templateKey}`
Lifecycle: **stable**
Required permissions (any): `notification:read`
### Parameters
- `templateKey` (path, string, required)
- `channel` (query, QueryEnumOfNotificationChannel, required)
- `locale` (query, string)
### Responses
- `200`: OK — application/json, TemplateDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/notifications/templates/{templateKey}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get template by ID
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/notifications/get-template-by-id
## Get template by ID
`GET /v1/notifications/templates/{templateId}`
Lifecycle: **stable**
Required permissions (any): `notification:read`
### Parameters
- `templateId` (path, string, required)
### Responses
- `200`: OK — application/json, TemplateDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/notifications/templates/{templateId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List template groups
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/notifications/list-template-groups
## List template groups
`GET /v1/notifications/templates/groups`
Lifecycle: **stable**
Required permissions (any): `notification:read`
### Parameters
- `scope` (query, QueryEnumOfTemplateScope)
- `channel` (query, QueryEnumOfNotificationChannel)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfTemplateDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/notifications/templates/groups' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List template versions by ID
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/notifications/list-template-versions-by-id
## List template versions by ID
`GET /v1/notifications/templates/{templateId}/versions`
Lifecycle: **stable**
Required permissions (any): `notification:read`
### Parameters
- `templateId` (path, string, required)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfTemplateDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/notifications/templates/{templateId}/versions' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List template versions by key
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/notifications/list-template-versions-by-key
## List template versions by key
`GET /v1/notifications/templates/{templateKey}/versions`
Lifecycle: **stable**
Required permissions (any): `notification:read`
### Parameters
- `templateKey` (path, string, required)
- `channel` (query, QueryEnumOfNotificationChannel)
- `locale` (query, string)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfTemplateDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/notifications/templates/{templateKey}/versions' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List templates
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/notifications/list-templates
## List templates
`GET /v1/notifications/templates`
Lifecycle: **stable**
Required permissions (any): `notification:read`
### Parameters
- `page` (query, integer (int32))
- `pageSize` (query, integer (int32))
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `channel` (query, QueryEnumOfNotificationChannel)
- `groups` (query, array, required)
- `key` (query, string)
- `locale` (query, string)
- `scope` (query, QueryEnumOfTemplateScope)
### Responses
- `200`: OK — application/json, PaginatedItemsOfTemplateItemDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/notifications/templates' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# PublishTemplate
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/notifications/publishtemplate
## PublishTemplate
`POST /v1/notifications/templates/{id}/publish`
Lifecycle: **stable**
Required permissions (any): `notification:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, HttpValidationProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `409`: Conflict — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/notifications/templates/{id}/publish' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# UpdateDraftTemplate
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/notifications/updatedrafttemplate
## UpdateDraftTemplate
`PUT /v1/notifications/templates/{id}`
Lifecycle: **stable**
Required permissions (any): `notification:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `subjectTpl` (string, required)
- `bodyTpl` (string, required)
- `textTpl` (string, required)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, HttpValidationProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `409`: Conflict — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/notifications/templates/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Price History
Inspect recorded price changes for products and variants.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/price-history
| Method | Endpoint | Operation |
| --- | --- | --- |
| `GET` | [`/v1/catalog/price-history`](/en/docs/admin/catalog/price-history/list-price-history) | List price history |
---
# List price history
Returns how a product's price changed over time, with the date of each change.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/price-history/list-price-history
## List price history
`GET /v1/catalog/price-history`
Lifecycle: **stable**
Returns how a product's price changed over time, with the date of each change.
Required permissions (any): `catalog:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `productId` (query, string)
- `variantId` (query, string)
- `reason` (query, QueryEnumOfPriceChangeReason)
- `fromDate` (query, string (date-time))
- `toDate` (query, string (date-time))
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfPriceHistoryDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/price-history' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Price Lists
Create price lists and update their rules.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/price-lists
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/price-lists`](/en/docs/admin/catalog/price-lists/create-price-list) | Create price list |
| `GET` | [`/v1/catalog/price-lists`](/en/docs/admin/catalog/price-lists/list-price-lists) | List price lists |
| `PUT` | [`/v1/catalog/price-lists/{priceListId}`](/en/docs/admin/catalog/price-lists/update-price-list) | Update price list |
---
# Create price list
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/price-lists/create-price-list
## Create price list
`POST /v1/catalog/price-lists`
Lifecycle: **stable**
Required permissions (any): `catalog:create`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `currency` (string)
- `isActive` (boolean)
- `priority` (integer (int32))
- `scope` (PriceListScope)
- `customerId` (string)
- `productId` (string)
- `productIds` (array)
- `categoryIds` (array)
- `tags` (array)
- `excludedProductIds` (array)
- `validFrom` (string (date-time))
- `validTo` (string (date-time))
- `items` (array)
- `rules` (array)
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/price-lists' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# List price lists
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/price-lists/list-price-lists
## List price lists
`GET /v1/catalog/price-lists`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Parameters
- `productId` (query, string)
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/price-lists' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update price list
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/price-lists/update-price-list
## Update price list
`PUT /v1/catalog/price-lists/{priceListId}`
Lifecycle: **stable**
Required permissions (any): `catalog:update`
### Parameters
- `priceListId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `currency` (string)
- `isActive` (boolean)
- `priority` (integer (int32))
- `scope` (PriceListScope)
- `customerId` (string)
- `productId` (string)
- `productIds` (array)
- `categoryIds` (array)
- `tags` (array)
- `excludedProductIds` (array)
- `validFrom` (string (date-time))
- `validTo` (string (date-time))
- `items` (array)
- `rules` (array)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/catalog/price-lists/{priceListId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Product Reviews
Inspect product reviews and update their moderation status.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/product-reviews
| Method | Endpoint | Operation |
| --- | --- | --- |
| `GET` | [`/v1/catalog/product-reviews`](/en/docs/admin/catalog/product-reviews/list-product-reviews) | List product reviews |
| `GET` | [`/v1/catalog/product-reviews/{reviewId}`](/en/docs/admin/catalog/product-reviews/get-product-review) | Get product review |
| `PATCH` | [`/v1/catalog/product-reviews/{reviewId}/status`](/en/docs/admin/catalog/product-reviews/update-product-review-status) | Update product review status |
---
# Get product review
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/product-reviews/get-product-review
## Get product review
`GET /v1/catalog/product-reviews/{reviewId}`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Parameters
- `reviewId` (path, string, required)
### Responses
- `200`: OK — application/json, ReviewDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/product-reviews/{reviewId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List product reviews
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/product-reviews/list-product-reviews
## List product reviews
`GET /v1/catalog/product-reviews`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `productId` (query, string)
- `customerId` (query, string)
- `status` (query, string)
- `rating` (query, integer (int32))
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfReviewDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/product-reviews' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update product review status
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/product-reviews/update-product-review-status
## Update product review status
`PATCH /v1/catalog/product-reviews/{reviewId}/status`
Lifecycle: **stable**
Required permissions (any): `catalog:update`
### Parameters
- `reviewId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `status` (ReviewStatus, required)
### Responses
- `200`: OK — application/json, ReviewDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PATCH \
--url 'https://api.ecomiq.pe/api/v1/catalog/product-reviews/{reviewId}/status' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Products
Create and update products, relationships, files, and catalog imports.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/products`](/en/docs/admin/catalog/products/create-product) | Create product |
| `GET` | [`/v1/catalog/products`](/en/docs/admin/catalog/products/list-products) | List products |
| `POST` | [`/v1/catalog/products/import-assets`](/en/docs/admin/catalog/products/upload-a-product-import-asset) | Upload a product import asset |
| `POST` | [`/v1/catalog/products/imports`](/en/docs/admin/catalog/products/queue-a-product-import) | Queue a product import |
| `POST` | [`/v1/catalog/products/reindex`](/en/docs/admin/catalog/products/queue-a-search-reindex-for-every-product-of-the-store) | Queue a search reindex for every product of the store |
| `POST` | [`/v1/catalog/products/exports`](/en/docs/admin/catalog/products/queue-a-products-export) | Queue a products export |
| `GET` | [`/v1/catalog/products/{productId}`](/en/docs/admin/catalog/products/get-product-by-id) | Get product by ID |
| `GET` | [`/v1/catalog/products/count`](/en/docs/admin/catalog/products/count-products) | Count products |
| `GET` | [`/v1/catalog/products/import-schema`](/en/docs/admin/catalog/products/get-products-import-schema) | Get products import schema |
| `GET` | [`/v1/catalog/products/import-template`](/en/docs/admin/catalog/products/download-products-import-template) | Download products import template |
| `GET` | [`/v1/catalog/products/suggest`](/en/docs/admin/catalog/products/list-product-suggest) | List product suggest |
| `PUT` | [`/v1/catalog/products/{productId}`](/en/docs/admin/catalog/products/update-product) | Update product |
| `DELETE` | [`/v1/catalog/products/{productId}`](/en/docs/admin/catalog/products/delete-a-product) | Delete a product |
| `POST` | [`/v1/catalog/products/{productId}/reviews`](/en/docs/admin/catalog/products/create-product-review) | Create product review |
| `GET` | [`/v1/catalog/products/{productId}/activity`](/en/docs/admin/catalog/products/list-product-activity) | List product activity |
| `GET` | [`/v1/catalog/products/{productId}/commission`](/en/docs/admin/catalog/products/get-product-commission) | Get product commission |
| `GET` | [`/v1/catalog/products/{productId}/price-lists`](/en/docs/admin/catalog/products/list-product-price-lists) | List product price lists |
### Batch
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/products/batch/delete`](/en/docs/admin/catalog/products/queue-a-product-batch-delete) | Queue a product batch delete |
| `POST` | [`/v1/catalog/products/batch/prices`](/en/docs/admin/catalog/products/batch-update-product-prices) | Batch update product prices |
| `PATCH` | [`/v1/catalog/products/batch/status`](/en/docs/admin/catalog/products/batch-update-product-status) | Batch update product status |
| `PATCH` | [`/v1/catalog/products/batch/status-by-filters`](/en/docs/admin/catalog/products/batch-update-filtered-product-status) | Batch update filtered product status |
### Moderation
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/products/moderation/decide`](/en/docs/admin/catalog/products/approve-or-reject-seller-products) | Approve or reject seller products |
| `GET` | [`/v1/catalog/products/moderation/summary`](/en/docs/admin/catalog/products/summarize-seller-products-pending-review) | Summarize seller products pending review |
### Modifier Groups
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/products/{productId}/modifier-groups`](/en/docs/admin/catalog/products/create-product-modifier-group) | Create product modifier group |
| `PUT` | [`/v1/catalog/products/{productId}/modifier-groups/{id}`](/en/docs/admin/catalog/products/update-product-modifier-group) | Update product modifier group |
| `DELETE` | [`/v1/catalog/products/{productId}/modifier-groups/{id}`](/en/docs/admin/catalog/products/delete-product-modifier-group) | Delete product modifier group |
### Size Guide
| Method | Endpoint | Operation |
| --- | --- | --- |
| `GET` | [`/v1/catalog/products/{productId}/size-guide`](/en/docs/admin/catalog/products/get-product-size-guide) | Get product size guide |
| `PUT` | [`/v1/catalog/products/{productId}/size-guide`](/en/docs/admin/catalog/products/set-product-size-guide) | Set product size guide |
### Spreadsheet
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/products/spreadsheet`](/en/docs/admin/catalog/products/create-a-product-spreadsheet-session) | Create a product spreadsheet session |
| `POST` | [`/v1/catalog/products/spreadsheet/save`](/en/docs/admin/catalog/products/save-product-spreadsheet) | Save product spreadsheet |
| `GET` | [`/v1/catalog/products/spreadsheet/{id}`](/en/docs/admin/catalog/products/get-a-product-spreadsheet-page) | Get a product spreadsheet page |
### Variants
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/products/{productId}/variants`](/en/docs/admin/catalog/products/create-product-variant) | Create product variant |
| `GET` | [`/v1/catalog/products/{productId}/variants`](/en/docs/admin/catalog/products/list-product-variants) | List product variants |
| `PUT` | [`/v1/catalog/products/{productId}/variants/{variantId}`](/en/docs/admin/catalog/products/update-product-variant) | Update product variant |
| `DELETE` | [`/v1/catalog/products/{productId}/variants/{variantId}`](/en/docs/admin/catalog/products/delete-product-variant) | Delete product variant |
---
# Approve or reject seller products
Approves or rejects seller products in bulk. Rejected products stay unpublished with the reason attached.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/approve-or-reject-seller-products
## Approve or reject seller products
`POST /v1/catalog/products/moderation/decide`
Lifecycle: **stable**
Approves or rejects seller products in bulk. Rejected products stay unpublished with the reason attached.
Required permissions (any): `catalog:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `productIds` (array, required)
- `action` (null | ProductModerationAction, required)
- `reason` (string, required)
### Responses
- `200`: OK — application/json, ModerationDecisionResultDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/moderation/decide' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Batch update filtered product status
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/batch-update-filtered-product-status
## Batch update filtered product status
`PATCH /v1/catalog/products/batch/status-by-filters`
Lifecycle: **stable**
Required permissions (any): `catalog:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `status` (ProductStatus)
- `search` (string): Free-text filter. Which fields it covers depends on the resource.
- `statusFilter` (array)
- `categoryIds` (array)
- `brandIds` (array)
- `sellerIds` (array)
- `types` (array)
- `isFeatured` (boolean)
- `ean` (string)
- `minPrice` (number (double))
- `maxPrice` (number (double))
- `minOnHand` (integer (int32))
- `maxOnHand` (integer (int32))
- `minAvailable` (integer (int32))
- `tags` (array)
### Responses
- `202`: Accepted — application/json, QueuedOperationResponse
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PATCH \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/batch/status-by-filters' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Batch update product prices
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/batch-update-product-prices
## Batch update product prices
`POST /v1/catalog/products/batch/prices`
Lifecycle: **stable**
Required permissions (any): `catalog:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `items` (array)
- `reason` (PriceChangeReason)
### Responses
- `202`: Accepted — application/json, QueuedOperationResponse
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/batch/prices' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Batch update product status
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/batch-update-product-status
## Batch update product status
`PATCH /v1/catalog/products/batch/status`
Lifecycle: **stable**
Required permissions (any): `catalog:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `productIds` (array)
- `status` (ProductStatus)
### Responses
- `202`: Accepted — application/json, QueuedOperationResponse
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PATCH \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/batch/status' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Count products
Returns how many products match a filter, without returning them. Cheaper than paging through a listing when you only need the number.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/count-products
## Count products
`GET /v1/catalog/products/count`
Lifecycle: **stable**
Returns how many products match a filter, without returning them. Cheaper than paging through a listing when you only need the number.
Required permissions (any): `catalog:read`
### Parameters
- `productIds` (query, array)
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `status` (query, array)
- `excludeStatus` (query, array)
- `includeArchived` (query, boolean)
- `categoryIds` (query, array)
- `excludeCategoryIds` (query, array)
- `brandIds` (query, array)
- `excludeBrandIds` (query, array)
- `storeIds` (query, array)
- `sellerIds` (query, array)
- `excludeSellerIds` (query, array)
- `skuIds` (query, array)
- `skus` (query, array)
- `types` (query, array)
- `excludeTypes` (query, array)
- `isFeatured` (query, boolean)
- `ean` (query, string)
- `minPrice` (query, number (double))
- `maxPrice` (query, number (double))
- `minOnHand` (query, integer (int32))
- `maxOnHand` (query, integer (int32))
- `minAvailable` (query, integer (int32))
- `tags` (query, array)
- `excludeTags` (query, array)
- `limit` (query, string): Maximum number of results to return.
- `savedViewId` (query, string)
### Responses
- `200`: OK — application/json, ProductCountDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/count' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Create a product spreadsheet session
Opens a bulk edit session over a filtered set of products. The session id is then used to page through the rows.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/create-a-product-spreadsheet-session
## Create a product spreadsheet session
`POST /v1/catalog/products/spreadsheet`
Lifecycle: **stable**
Opens a bulk edit session over a filtered set of products. The session id is then used to page through the rows.
Required permissions (any): `catalog:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `ids` (array)
- `productIds` (array)
- `filters` (null | ProductSpreadsheetFilters)
- `pageSize` (integer (int32))
- `maxRows` (integer (int32))
### Responses
- `200`: OK — application/json, ProductSpreadsheetDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/spreadsheet' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Create product
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/create-product
## Create product
`POST /v1/catalog/products`
Lifecycle: **stable**
Required permissions (any): `catalog:create`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `sku` (string): Stock keeping unit (SKU).
- `description` (string)
- `slug` (string): URL-friendly identifier.
- `brandId` (string)
- `packageId` (string)
- `shippingProfileId` (string)
- `images` (array)
- `type` (null | ProductType)
- `condition` (null | ProductConditionType)
- `status` (null | ProductStatus)
- `price` (number (double))
- `compareAtPrice` (number (double))
- `costPrice` (number (double))
- `weight` (number (double))
- `categoryId` (string)
- `tags` (array)
- `summary` (string)
- `vendor` (string)
- `metaTitle` (string)
- `metaDescription` (string)
- `keywords` (array)
- `minOrderQuantity` (integer (int32))
- `maxOrderQuantity` (integer (int32))
- `isDigital` (boolean)
- `trackInventory` (boolean)
- `lowStockThreshold` (integer (int32))
- `allowBackorders` (boolean)
- `specifications` (array)
- `variants` (array)
- `items` (array)
- `options` (array)
- `modifiers` (array)
- `targetChannelIds` (array)
#### Example
```json
{
"name": "Polo de algodón",
"sku": "POL-001",
"price": 89,
"minOrderQuantity": 1,
"isDigital": false
}
```
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data '{"name":"Polo de algodón","sku":"POL-001","price":89,"minOrderQuantity":1,"isDigital":false}'
```
---
# Create product modifier group
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/create-product-modifier-group
## Create product modifier group
`POST /v1/catalog/products/{productId}/modifier-groups`
Lifecycle: **stable**
Required permissions (any): `catalog:create`
### Parameters
- `productId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `description` (string)
- `isRequired` (boolean)
- `selectionType` (ModifierSelectionType)
- `minSelections` (integer (int32))
- `maxSelections` (integer (int32))
- `order` (integer (int32))
- `status` (ModifierGroupStatus)
- `options` (array)
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `409`: Conflict — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/modifier-groups' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Create product review
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/create-product-review
## Create product review
`POST /v1/catalog/products/{productId}/reviews`
Lifecycle: **stable**
Required permissions (any): `catalog:update`
### Parameters
- `productId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `rating` (integer (int32), required)
- `content` (string, required)
- `title` (string, required)
- `reviewerName` (string, required)
- `reviewerEmail` (string, required)
- `customerId` (string, required)
- `orderId` (string, required)
- `status` (null | ReviewStatus, required)
### Responses
- `200`: OK — application/json, ReviewDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/reviews' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Create product variant
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/create-product-variant
## Create product variant
`POST /v1/catalog/products/{productId}/variants`
Lifecycle: **stable**
Required permissions (any): `catalog:create`
### Parameters
- `productId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `sku` (string): Stock keeping unit (SKU).
- `packageId` (string)
- `price` (number (double))
- `compareAtPrice` (number (double))
- `costPrice` (number (double))
- `lowStockThreshold` (integer (int32))
- `allowBackorders` (boolean)
- `trackInventory` (boolean)
- `weight` (number (double))
- `width` (number (double))
- `height` (number (double))
- `length` (number (double))
- `unitOfMeasure` (string)
- `barcode` (string): Barcode of the variant, such as EAN or UPC.
- `countryOfOrigin` (string)
- `hsCode` (string)
- `isDefault` (boolean)
- `isDigital` (boolean)
- `images` (array)
- `options` (object)
- `modifiers` (array)
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/variants' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete a product
Delete an existing product
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/delete-a-product
## Delete a product
`DELETE /v1/catalog/products/{productId}`
Lifecycle: **stable**
Delete an existing product
Required permissions (any): `catalog:delete`
### Parameters
- `productId` (path, string, required)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Delete product modifier group
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/delete-product-modifier-group
## Delete product modifier group
`DELETE /v1/catalog/products/{productId}/modifier-groups/{id}`
Lifecycle: **stable**
Required permissions (any): `catalog:delete`
### Parameters
- `productId` (path, string, required)
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/modifier-groups/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Delete product variant
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/delete-product-variant
## Delete product variant
`DELETE /v1/catalog/products/{productId}/variants/{variantId}`
Lifecycle: **stable**
Required permissions (any): `catalog:delete`
### Parameters
- `productId` (path, string, required)
- `variantId` (path, string, required)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/variants/{variantId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Download products import template
Downloads the spreadsheet template for product imports, with the expected columns already in place.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/download-products-import-template
## Download products import template
`GET /v1/catalog/products/import-template`
Lifecycle: **stable**
Downloads the spreadsheet template for product imports, with the expected columns already in place.
Required permissions (any): `catalog:read`
### Responses
- `200`: OK
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/import-template' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get a product spreadsheet page
Returns one page of an open product bulk edit session.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/get-a-product-spreadsheet-page
## Get a product spreadsheet page
`GET /v1/catalog/products/spreadsheet/{id}`
Lifecycle: **stable**
Returns one page of an open product bulk edit session.
Required permissions (any): `catalog:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfProductItemDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/spreadsheet/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get product by ID
Retrieve a specific product by ID
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/get-product-by-id
## Get product by ID
`GET /v1/catalog/products/{productId}`
Lifecycle: **stable**
Retrieve a specific product by ID
Required permissions (any): `catalog:read`
### Parameters
- `productId` (path, string, required)
### Responses
- `200`: OK — application/json, ProductDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get product commission
Returns the commission that applies to a product, resolved from the rules configured for its seller and category.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/get-product-commission
## Get product commission
`GET /v1/catalog/products/{productId}/commission`
Lifecycle: **stable**
Returns the commission that applies to a product, resolved from the rules configured for its seller and category.
Required permissions (any): `catalog:read`
### Parameters
- `productId` (path, string, required)
### Responses
- `200`: OK — application/json, ProductCommissionDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/commission' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get product size guide
Returns the size guide that applies to a product, whether attached directly or inherited from an assignment.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/get-product-size-guide
## Get product size guide
`GET /v1/catalog/products/{productId}/size-guide`
Lifecycle: **stable**
Returns the size guide that applies to a product, whether attached directly or inherited from an assignment.
Required permissions (any): `catalog:read`
### Parameters
- `productId` (path, string, required)
- `gender` (query, QueryEnumOfCatalogGender)
- `measurementType` (query, QueryEnumOfSizeGuideMeasurementType)
### Responses
- `200`: OK — application/json, SizeGuideItemDto
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/size-guide' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get products import schema
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/get-products-import-schema
## Get products import schema
`GET /v1/catalog/products/import-schema`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Responses
- `200`: OK — application/json, ProductImportSchemaDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/import-schema' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List product activity
Returns the audit trail of a product: what changed, when and who changed it.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/list-product-activity
## List product activity
`GET /v1/catalog/products/{productId}/activity`
Lifecycle: **stable**
Returns the audit trail of a product: what changed, when and who changed it.
Required permissions (any): `catalog:read`
### Parameters
- `productId` (path, string, required)
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `variantId` (query, string)
- `locationId` (query, string)
- `source` (query, QueryEnumOfProductActivitySource)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfProductActivityItemDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/activity' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List product price lists
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/list-product-price-lists
## List product price lists
`GET /v1/catalog/products/{productId}/price-lists`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Parameters
- `productId` (path, string, required)
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/price-lists' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List product suggest
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/list-product-suggest
## List product suggest
`GET /v1/catalog/products/suggest`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Parameters
- `Search` (query, string, required)
- `SellerId` (query, string)
- `Limit` (query, integer (int32), required)
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/suggest' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List product variants
Lists the variants of a product with their own SKU, price and stock.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/list-product-variants
## List product variants
`GET /v1/catalog/products/{productId}/variants`
Lifecycle: **stable**
Lists the variants of a product with their own SKU, price and stock.
Required permissions (any): `catalog:read`
### Parameters
- `productId` (path, string, required)
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `optionKey` (query, array, required)
- `optionValue` (query, array, required)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfProductVariantListItemDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/variants' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List products
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/list-products
## List products
`GET /v1/catalog/products`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `productIds` (query, array)
- `status` (query, array)
- `excludeStatus` (query, array)
- `includeArchived` (query, boolean)
- `categoryIds` (query, array)
- `excludeCategoryIds` (query, array)
- `brandIds` (query, array)
- `excludeBrandIds` (query, array)
- `storeIds` (query, array)
- `sellerIds` (query, array)
- `excludeSellerIds` (query, array)
- `skuIds` (query, array)
- `skus` (query, array)
- `types` (query, array)
- `excludeTypes` (query, array)
- `isFeatured` (query, boolean)
- `ean` (query, string)
- `minPrice` (query, number (double))
- `maxPrice` (query, number (double))
- `minOnHand` (query, integer (int32))
- `maxOnHand` (query, integer (int32))
- `minAvailable` (query, integer (int32))
- `tags` (query, array)
- `excludeTags` (query, array)
- `includeVariants` (query, boolean)
- `includeTotalCount` (query, boolean)
- `projection` (query, QueryEnumOfProductListProjection)
- `channelId` (query, string)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfProductItemDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Queue a product batch delete
Queues the deletion of several products. Returns immediately with a job; deletion happens in the background.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/queue-a-product-batch-delete
## Queue a product batch delete
`POST /v1/catalog/products/batch/delete`
Lifecycle: **stable**
Queues the deletion of several products. Returns immediately with a job; deletion happens in the background.
Required permissions (any): `catalog:delete`
### Request body
Content-Type: `application/json` · required
#### Fields
- `productIds` (array)
- `expectedCount` (integer (int32))
- `search` (string): Free-text filter. Which fields it covers depends on the resource.
- `statusFilter` (array)
- `categoryIds` (array)
- `brandIds` (array)
- `sellerIds` (array)
- `types` (array)
- `isFeatured` (boolean)
- `ean` (string)
- `minPrice` (number (double))
- `maxPrice` (number (double))
- `minOnHand` (integer (int32))
- `maxOnHand` (integer (int32))
- `minAvailable` (integer (int32))
- `tags` (array)
### Responses
- `202`: Accepted — application/json, QueuedOperationResponse
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/batch/delete' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Queue a product import
Queues a product import from an uploaded file. Returns a job you poll for progress and errors; nothing is written synchronously.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/queue-a-product-import
## Queue a product import
`POST /v1/catalog/products/imports`
Lifecycle: **stable**
Queues a product import from an uploaded file. Returns a job you poll for progress and errors; nothing is written synchronously.
Required permissions (any): `catalog:create`
### Request body
Content-Type: `application/json` · required
#### Fields
- `clientRunId` (string, required)
- `assetId` (string, required)
- `checksum` (string, required)
- `syncInventory` (boolean)
- `recordInventoryAudit` (boolean)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/imports' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Queue a products export
Queues a product export. Returns a job; the file becomes downloadable once it completes.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/queue-a-products-export
## Queue a products export
`POST /v1/catalog/products/exports`
Lifecycle: **stable**
Queues a product export. Returns a job; the file becomes downloadable once it completes.
Required permissions (any): `catalog:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `format` (string)
- `search` (string): Free-text filter. Which fields it covers depends on the resource.
- `status` (array)
- `excludeStatus` (array)
- `includeArchived` (boolean)
- `categoryIds` (array)
- `excludeCategoryIds` (array)
- `brandIds` (array)
- `excludeBrandIds` (array)
- `sellerIds` (array)
- `excludeSellerIds` (array)
- `productIds` (array)
- `skuIds` (array)
- `skus` (array)
- `types` (array)
- `excludeTypes` (array)
- `isFeatured` (boolean)
- `ean` (string)
- `minPrice` (number (double))
- `maxPrice` (number (double))
- `minOnHand` (integer (int32))
- `maxOnHand` (integer (int32))
- `minAvailable` (integer (int32))
- `tags` (array)
- `excludeTags` (array)
- `template` (boolean)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/exports' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Queue a search reindex for every product of the store
Queues a search reindex of every product in the store. Use it after a bulk change, when the catalog and the search index have drifted apart.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/queue-a-search-reindex-for-every-product-of-the-store
## Queue a search reindex for every product of the store
`POST /v1/catalog/products/reindex`
Lifecycle: **stable**
Queues a search reindex of every product in the store. Use it after a bulk change, when the catalog and the search index have drifted apart.
Required permissions (any): `catalog:update`
### Responses
- `200`: OK — application/json, ReindexStoreProductsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/reindex' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Save product spreadsheet
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/save-product-spreadsheet
## Save product spreadsheet
`POST /v1/catalog/products/spreadsheet/save`
Lifecycle: **stable**
Required permissions (any): `catalog:update`, `inventory:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `productPatches` (array)
- `statusGroups` (array)
- `priceItems` (array)
- `inventoryItems` (array)
- `variantCreates` (array)
- `variantUpdates` (array)
- `variantDeletes` (array)
- `productDeletes` (array)
### Responses
- `202`: Accepted — application/json, QueuedOperationResponse
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/spreadsheet/save' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Set product size guide
Attaches a size guide to a product. Replaces any guide already attached.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/set-product-size-guide
## Set product size guide
`PUT /v1/catalog/products/{productId}/size-guide`
Lifecycle: **stable**
Attaches a size guide to a product. Replaces any guide already attached.
Required permissions (any): `catalog:update`
### Parameters
- `productId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `sizeGuideId` (string)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/size-guide' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Summarize seller products pending review
Returns how many seller products are waiting for review, so a marketplace operator can see the queue at a glance.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/summarize-seller-products-pending-review
## Summarize seller products pending review
`GET /v1/catalog/products/moderation/summary`
Lifecycle: **stable**
Returns how many seller products are waiting for review, so a marketplace operator can see the queue at a glance.
Required permissions (any): `catalog:read`
### Responses
- `200`: OK — application/json, ModerationSummaryDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/moderation/summary' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update product
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/update-product
## Update product
`PUT /v1/catalog/products/{productId}`
Lifecycle: **stable**
Required permissions (any): `catalog:update`
### Parameters
- `productId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `sku` (string): Stock keeping unit (SKU).
- `slug` (string): URL-friendly identifier.
- `description` (string)
- `summary` (string)
- `brandId` (string)
- `clearBrand` (boolean)
- `categoryId` (string)
- `clearCategory` (boolean)
- `packageId` (string)
- `shippingProfileId` (string)
- `clearShippingProfile` (boolean)
- `tags` (array)
- `vendor` (string)
- `metaTitle` (string)
- `metaDescription` (string)
- `keywords` (array)
- `minOrderQuantity` (integer (int32))
- `maxOrderQuantity` (integer (int32))
- `isDigital` (boolean)
- `type` (null | ProductType)
- `status` (null | ProductStatus)
- `isFeatured` (boolean)
- `price` (number (double))
- `compareAtPrice` (number (double))
- `images` (array)
- `specifications` (array)
- `variants` (array)
- `items` (array)
- `options` (array)
- `modifiers` (array)
### Responses
- `200`: OK — application/json, Success
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Update product modifier group
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/update-product-modifier-group
## Update product modifier group
`PUT /v1/catalog/products/{productId}/modifier-groups/{id}`
Lifecycle: **stable**
Required permissions (any): `catalog:update`
### Parameters
- `productId` (path, string, required)
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `description` (string)
- `isRequired` (boolean)
- `selectionType` (ModifierSelectionType)
- `minSelections` (integer (int32))
- `maxSelections` (integer (int32))
- `order` (integer (int32))
- `status` (ModifierGroupStatus)
- `options` (array)
### Responses
- `200`: OK
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `409`: Conflict — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/modifier-groups/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Update product variant
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/update-product-variant
## Update product variant
`PUT /v1/catalog/products/{productId}/variants/{variantId}`
Lifecycle: **stable**
Required permissions (any): `catalog:update`
### Parameters
- `productId` (path, string, required)
- `variantId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `sku` (string): Stock keeping unit (SKU).
- `packageId` (string)
- `price` (number (double))
- `compareAtPrice` (number (double))
- `costPrice` (number (double))
- `lowStockThreshold` (integer (int32))
- `allowBackorders` (boolean)
- `trackInventory` (boolean)
- `isDigital` (boolean)
- `weight` (number (double))
- `width` (number (double))
- `height` (number (double))
- `length` (number (double))
- `unitOfMeasure` (string)
- `barcode` (string): Barcode of the variant, such as EAN or UPC.
- `countryOfOrigin` (string)
- `hsCode` (string)
- `isDefault` (boolean)
- `status` (null | VariantStatus)
- `images` (array)
- `options` (object)
- `modifiers` (array)
### Responses
- `200`: OK — application/json, Success
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/{productId}/variants/{variantId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Upload a product import asset
Uploads an image referenced by a product import, so the import file can point at it by name.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/products/upload-a-product-import-asset
## Upload a product import asset
`POST /v1/catalog/products/import-assets`
Lifecycle: **stable**
Uploads an image referenced by a product import, so the import file can point at it by name.
Required permissions (any): `catalog:create`
### Parameters
- `FileName` (query, string, required)
### Responses
- `201`: Created — application/json, ProductImportAssetResponse
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `411`: Length Required — application/problem+json, ProblemDetails
- `413`: Payload Too Large — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/products/import-assets' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Recommendations
Find products that can be linked as recommendations.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/recommendations
| Method | Endpoint | Operation |
| --- | --- | --- |
| `GET` | [`/v1/catalog/recommendations`](/en/docs/admin/catalog/recommendations/list-recommendations) | List recommendations |
---
# List recommendations
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/recommendations/list-recommendations
## List recommendations
`GET /v1/catalog/recommendations`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Parameters
- `ProductId` (query, string)
- `Category` (query, string)
- `Limit` (query, integer (int32), required)
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/recommendations' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Size Guides
Manage size guides and assign them to products.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/size-guides
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/size-guides`](/en/docs/admin/catalog/size-guides/create-size-guide) | Create size guide |
| `GET` | [`/v1/catalog/size-guides`](/en/docs/admin/catalog/size-guides/list-size-guides) | List size guides |
| `POST` | [`/v1/catalog/size-guides/exports`](/en/docs/admin/catalog/size-guides/queue-a-size-guides-export) | Queue a size guides export |
| `POST` | [`/v1/catalog/size-guides/import`](/en/docs/admin/catalog/size-guides/queue-a-size-guides-import) | Queue a size guides import |
| `GET` | [`/v1/catalog/size-guides/{sizeGuideId}`](/en/docs/admin/catalog/size-guides/get-size-guide) | Get size guide |
| `PUT` | [`/v1/catalog/size-guides/{sizeGuideId}`](/en/docs/admin/catalog/size-guides/update-size-guide) | Update size guide |
| `DELETE` | [`/v1/catalog/size-guides/{sizeGuideId}`](/en/docs/admin/catalog/size-guides/delete-size-guide) | Delete size guide |
| `POST` | [`/v1/catalog/size-guides/{sizeGuideId}/assignments`](/en/docs/admin/catalog/size-guides/assign-size-guide) | Assign size guide |
| `DELETE` | [`/v1/catalog/size-guides/{sizeGuideId}/assignments/{assignmentId}`](/en/docs/admin/catalog/size-guides/remove-size-guide-assignment) | Remove size guide assignment |
---
# Assign size guide
Assigns a size guide to a set of products, categories or brands, so new products inherit it.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/size-guides/assign-size-guide
## Assign size guide
`POST /v1/catalog/size-guides/{sizeGuideId}/assignments`
Lifecycle: **stable**
Assigns a size guide to a set of products, categories or brands, so new products inherit it.
Required permissions (any): `catalog:update`
### Parameters
- `sizeGuideId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `productId` (string)
- `categoryId` (string)
- `includeChildrenCategories` (boolean)
- `priority` (integer (int32))
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/size-guides/{sizeGuideId}/assignments' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Create size guide
Creates a size guide. It only becomes visible on a product page once it is assigned.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/size-guides/create-size-guide
## Create size guide
`POST /v1/catalog/size-guides`
Lifecycle: **stable**
Creates a size guide. It only becomes visible on a product page once it is assigned.
Required permissions (any): `catalog:create`
### Request body
Content-Type: `application/json` · required
#### Fields
- `assignments` (array)
- `name` (string)
- `slug` (string): URL-friendly identifier.
- `description` (string)
- `imageUrl` (string)
- `gender` (CatalogGender)
- `measurementType` (SizeGuideMeasurementType)
- `unit` (SizeGuideUnit)
- `status` (SizeGuideStatus)
- `priority` (integer (int32))
- `notes` (string)
- `rows` (array)
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/size-guides' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete size guide
Deletes a size guide and removes it from the products using it.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/size-guides/delete-size-guide
## Delete size guide
`DELETE /v1/catalog/size-guides/{sizeGuideId}`
Lifecycle: **stable**
Deletes a size guide and removes it from the products using it.
Required permissions (any): `catalog:delete`
### Parameters
- `sizeGuideId` (path, string, required)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/catalog/size-guides/{sizeGuideId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get size guide
Returns one size guide with its measurement table.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/size-guides/get-size-guide
## Get size guide
`GET /v1/catalog/size-guides/{sizeGuideId}`
Lifecycle: **stable**
Returns one size guide with its measurement table.
Required permissions (any): `catalog:read`
### Parameters
- `sizeGuideId` (path, string, required)
### Responses
- `200`: OK — application/json, SizeGuideDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/size-guides/{sizeGuideId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List size guides
Lists the size guides defined for the store.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/size-guides/list-size-guides
## List size guides
`GET /v1/catalog/size-guides`
Lifecycle: **stable**
Lists the size guides defined for the store.
Required permissions (any): `catalog:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `Gender` (query, string)
- `MeasurementType` (query, string)
- `Status` (query, string)
- `ProductId` (query, string)
- `CategoryId` (query, string)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfSizeGuideSummaryDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/size-guides' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Queue a size guides export
Queues a size guide export. Returns a job; the file becomes downloadable once it completes.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/size-guides/queue-a-size-guides-export
## Queue a size guides export
`POST /v1/catalog/size-guides/exports`
Lifecycle: **stable**
Queues a size guide export. Returns a job; the file becomes downloadable once it completes.
Required permissions (any): `catalog:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `format` (string)
- `search` (string): Free-text filter. Which fields it covers depends on the resource.
- `sizeGuideIds` (array)
- `gender` (null | CatalogGender)
- `measurementType` (null | SizeGuideMeasurementType)
- `status` (null | SizeGuideStatus)
- `sellerIds` (array)
- `template` (boolean)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/size-guides/exports' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Queue a size guides import
Queues a size guide import from a file. Returns a job you poll for progress.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/size-guides/queue-a-size-guides-import
## Queue a size guides import
`POST /v1/catalog/size-guides/import`
Lifecycle: **stable**
Queues a size guide import from a file. Returns a job you poll for progress.
Required permissions (any): `catalog:create`
### Request body
Content-Type: `multipart/form-data` · required
#### Fields
- `assetId` (string)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/size-guides/import' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: multipart/form-data'
```
---
# Remove size guide assignment
Removes an assignment rule. Products keep any guide attached to them directly.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/size-guides/remove-size-guide-assignment
## Remove size guide assignment
`DELETE /v1/catalog/size-guides/{sizeGuideId}/assignments/{assignmentId}`
Lifecycle: **stable**
Removes an assignment rule. Products keep any guide attached to them directly.
Required permissions (any): `catalog:update`
### Parameters
- `sizeGuideId` (path, string, required)
- `assignmentId` (path, string, required)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/catalog/size-guides/{sizeGuideId}/assignments/{assignmentId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update size guide
Updates a size guide. The change applies to every product it is assigned to.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/size-guides/update-size-guide
## Update size guide
`PUT /v1/catalog/size-guides/{sizeGuideId}`
Lifecycle: **stable**
Updates a size guide. The change applies to every product it is assigned to.
Required permissions (any): `catalog:update`
### Parameters
- `sizeGuideId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `slug` (string): URL-friendly identifier.
- `description` (string)
- `imageUrl` (string)
- `gender` (CatalogGender)
- `measurementType` (SizeGuideMeasurementType)
- `unit` (SizeGuideUnit)
- `status` (SizeGuideStatus)
- `priority` (integer (int32))
- `notes` (string)
- `rows` (array)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/catalog/size-guides/{sizeGuideId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# SKUs
Check variant availability by SKU.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/skus
| Method | Endpoint | Operation |
| --- | --- | --- |
| `GET` | [`/v1/catalog/skus/availability`](/en/docs/admin/catalog/skus/check-sku-availability) | Check SKU availability |
---
# Check SKU availability
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/skus/check-sku-availability
## Check SKU availability
`GET /v1/catalog/skus/availability`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Parameters
- `sku` (query, string, required): Stock keeping unit (SKU).
### Responses
- `200`: OK — application/json, Result
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/skus/availability' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Specifications
Manage specifications, values, and aliases used by the catalog.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/specifications
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/specifications`](/en/docs/admin/catalog/specifications/create-specification) | Create specification |
| `GET` | [`/v1/catalog/specifications`](/en/docs/admin/catalog/specifications/list-specifications) | List specifications |
| `GET` | [`/v1/catalog/specifications/{id}`](/en/docs/admin/catalog/specifications/get-specification-by-id) | Get specification by ID |
| `GET` | [`/v1/catalog/specifications/suggests`](/en/docs/admin/catalog/specifications/suggests-specifications) | Suggests specifications |
| `PUT` | [`/v1/catalog/specifications/{id}`](/en/docs/admin/catalog/specifications/update-an-specification) | Update an specification |
| `DELETE` | [`/v1/catalog/specifications/{id}`](/en/docs/admin/catalog/specifications/delete-an-specification) | Delete an specification |
---
# Create specification
Create a new product specification
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/specifications/create-specification
## Create specification
`POST /v1/catalog/specifications`
Lifecycle: **stable**
Create a new product specification
Required permissions (any): `catalog:create`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `key` (string, required)
- `aliases` (array)
- `description` (string)
- `isMultiple` (boolean)
- `isRequired` (boolean)
- `isFilterable` (boolean)
- `isSearchable` (boolean)
- `order` (integer (int32))
- `type` (SpecificationType)
- `level` (SpecificationLevel)
- `values` (array)
- `metadata` (object)
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/specifications' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete an specification
Delete an existing specification
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/specifications/delete-an-specification
## Delete an specification
`DELETE /v1/catalog/specifications/{id}`
Lifecycle: **stable**
Delete an existing specification
Required permissions (any): `catalog:delete`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `409`: Conflict — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/catalog/specifications/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get specification by ID
Retrieve a specific specification by its ID
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/specifications/get-specification-by-id
## Get specification by ID
`GET /v1/catalog/specifications/{id}`
Lifecycle: **stable**
Retrieve a specific specification by its ID
Required permissions (any): `catalog:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, SpecificationDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/specifications/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List specifications
Retrieve a paginated list of specifications with optional filtering. Use 'ids' param to fetch specific specifications by their IDs (comma-separated).
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/specifications/list-specifications
## List specifications
`GET /v1/catalog/specifications`
Lifecycle: **stable**
Retrieve a paginated list of specifications with optional filtering. Use 'ids' param to fetch specific specifications by their IDs (comma-separated).
Required permissions (any): `catalog:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `level` (query, QueryEnumOfSpecificationLevel)
- `type` (query, QueryEnumOfSpecificationType)
- `ids` (query, string)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfSpecificationDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/specifications' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Suggests specifications
Retrieve a suggests of specifications
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/specifications/suggests-specifications
## Suggests specifications
`GET /v1/catalog/specifications/suggests`
Lifecycle: **stable**
Retrieve a suggests of specifications
Required permissions (any): `catalog:read`
### Parameters
- `q` (query, string, required)
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/specifications/suggests' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update an specification
Update an existing specification
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/specifications/update-an-specification
## Update an specification
`PUT /v1/catalog/specifications/{id}`
Lifecycle: **stable**
Update an existing specification
Required permissions (any): `catalog:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `key` (string)
- `aliases` (array)
- `description` (string)
- `isMultiple` (boolean)
- `isRequired` (boolean)
- `isFilterable` (boolean)
- `isSearchable` (boolean)
- `order` (integer (int32))
- `status` (null | SpecificationStatus)
- `type` (SpecificationType)
- `level` (SpecificationLevel)
- `values` (array)
- `metadata` (object)
### Responses
- `200`: OK — application/json, boolean
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/catalog/specifications/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Spreadsheet
Save changes made in a spreadsheet session.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/spreadsheet
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/catalog/spreadsheet/save`](/en/docs/admin/catalog/spreadsheet/save-spreadsheet) | Save spreadsheet |
---
# Save spreadsheet
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/spreadsheet/save-spreadsheet
## Save spreadsheet
`POST /v1/catalog/spreadsheet/save`
Lifecycle: **stable**
Required permissions (any): `catalog:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `brandUpdates` (array)
- `categoryUpdates` (array)
- `specificationUpdates` (array)
- `sizeGuideUpdates` (array)
### Responses
- `202`: Accepted — application/json, QueuedOperationResponse
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/spreadsheet/save' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Variants
Inspect variants and work with spreadsheet editing sessions.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/variants
| Method | Endpoint | Operation |
| --- | --- | --- |
| `GET` | [`/v1/catalog/variants/{variantId}`](/en/docs/admin/catalog/variants/get-variant) | Get variant |
| `POST` | [`/v1/catalog/variants/spreadsheet`](/en/docs/admin/catalog/variants/create-a-variant-spreadsheet-session) | Create a variant spreadsheet session |
| `GET` | [`/v1/catalog/variants/spreadsheet/{id}`](/en/docs/admin/catalog/variants/get-a-variant-spreadsheet-page) | Get a variant spreadsheet page |
---
# Create a variant spreadsheet session
Opens a bulk edit session over variants, the same way the product one works but at variant level.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/variants/create-a-variant-spreadsheet-session
## Create a variant spreadsheet session
`POST /v1/catalog/variants/spreadsheet`
Lifecycle: **stable**
Opens a bulk edit session over variants, the same way the product one works but at variant level.
Required permissions (any): `catalog:read`, `inventory:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `variantIds` (array)
- `productIds` (array)
- `inventoryItems` (array)
- `filters` (null | VariantSpreadsheetFilters)
- `locationIds` (array)
- `pageSize` (integer (int32))
### Responses
- `200`: OK — application/json, VariantSpreadsheetDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/catalog/variants/spreadsheet' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Get a variant spreadsheet page
Returns one page of an open variant bulk edit session.
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/variants/get-a-variant-spreadsheet-page
## Get a variant spreadsheet page
`GET /v1/catalog/variants/spreadsheet/{id}`
Lifecycle: **stable**
Returns one page of an open variant bulk edit session.
Required permissions (any): `catalog:read`, `inventory:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfVariantSpreadsheetRowDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/variants/spreadsheet/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get variant
Canonical: https://docs.ecomiq.pe/en/docs/admin/catalog/variants/get-variant
## Get variant
`GET /v1/catalog/variants/{variantId}`
Lifecycle: **stable**
Required permissions (any): `catalog:read`
### Parameters
- `variantId` (path, string, required)
### Responses
- `200`: OK — application/json, CatalogVariantModel
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/catalog/variants/{variantId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Customers
Customer profiles, addresses, groups, and activity.
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers
- [Records, groups & addresses](/en/docs/admin/customers/customers): Manage customer profiles, addresses, groups, and activity.
---
# Records, groups & addresses
Manage customer profiles, addresses, groups, and activity.
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/customers`](/en/docs/admin/customers/customers/create-customer) | Create customer |
| `GET` | [`/v1/customers`](/en/docs/admin/customers/customers/list-customers) | List customers |
| `POST` | [`/v1/customers/exports`](/en/docs/admin/customers/customers/queue-a-customers-export) | Queue a customers export |
| `POST` | [`/v1/customers/import`](/en/docs/admin/customers/customers/queue-a-customers-import) | Queue a customers import |
| `GET` | [`/v1/customers/{id}`](/en/docs/admin/customers/customers/get-customer) | Get customer |
| `PUT` | [`/v1/customers/{id}`](/en/docs/admin/customers/customers/update-customer) | Update customer |
| `DELETE` | [`/v1/customers/{id}`](/en/docs/admin/customers/customers/delete-customer) | Delete customer |
### Addresses
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/customers/{customerId}/addresses`](/en/docs/admin/customers/customers/create-customer-address) | Create customer address |
| `GET` | [`/v1/customers/{customerId}/addresses`](/en/docs/admin/customers/customers/list-customer-addresses) | List customer addresses |
| `PUT` | [`/v1/customers/{customerId}/addresses/{addressId}`](/en/docs/admin/customers/customers/update-customer-address) | Update customer address |
| `DELETE` | [`/v1/customers/{customerId}/addresses/{addressId}`](/en/docs/admin/customers/customers/delete-customer-address) | Delete customer address |
### Groups
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/customers/groups`](/en/docs/admin/customers/customers/create-customer-group) | Create customer group |
| `GET` | [`/v1/customers/groups`](/en/docs/admin/customers/customers/list-customer-groups) | List customer groups |
| `GET` | [`/v1/customers/groups/{id}`](/en/docs/admin/customers/customers/get-customer-group) | Get customer group |
| `PUT` | [`/v1/customers/groups/{id}`](/en/docs/admin/customers/customers/update-customer-group) | Update customer group |
| `DELETE` | [`/v1/customers/groups/{id}`](/en/docs/admin/customers/customers/delete-customer-group) | Delete customer group |
| `POST` | [`/v1/customers/groups/{id}/members`](/en/docs/admin/customers/customers/add-customers-to-a-customer-group) | Add customers to a customer group |
| `POST` | [`/v1/customers/groups/{id}/members/remove`](/en/docs/admin/customers/customers/remove-customers-from-a-customer-group) | Remove customers from a customer group |
### Spreadsheet
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/customers/spreadsheet`](/en/docs/admin/customers/customers/create-customer-spreadsheet) | Create customer spreadsheet |
| `POST` | [`/v1/customers/spreadsheet/save`](/en/docs/admin/customers/customers/save-customer-spreadsheet) | Save customer spreadsheet |
| `GET` | [`/v1/customers/spreadsheet/{id}`](/en/docs/admin/customers/customers/get-customer-spreadsheet) | Get customer spreadsheet |
---
# Add customers to a customer group
Adds customers to a group. Customers already in it are ignored.
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/add-customers-to-a-customer-group
## Add customers to a customer group
`POST /v1/customers/groups/{id}/members`
Lifecycle: **stable**
Adds customers to a group. Customers already in it are ignored.
Required permissions (any): `customer_group:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `customerIds` (array, required)
### Responses
- `200`: OK — application/json, CustomerGroupMembershipChangeDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/customers/groups/{id}/members' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Create customer
Create a new customer
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/create-customer
## Create customer
`POST /v1/customers`
Lifecycle: **stable**
Create a new customer
Required permissions (any): `customer:create`
### Request body
Content-Type: `application/json` · required
#### Fields
- `email` (string, required)
- `firstName` (string, required)
- `lastName` (string, required)
- `customerType` (CustomerType, required)
- `countryIsoCode` (string, required)
- `phone` (string)
- `identificationNumber` (string)
- `identificationType` (string)
- `entityName` (string)
- `userId` (string (uuid))
- `gender` (string)
- `role` (string)
- `companyName` (string)
- `dateOfBirth` (string (date))
### Responses
- `201`: Created — application/json, CustomerCreatedDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/customers' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Create customer address
Add a new address to a customer
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/create-customer-address
## Create customer address
`POST /v1/customers/{customerId}/addresses`
Lifecycle: **stable**
Add a new address to a customer
Required permissions (any): `customer:create`
### Parameters
- `customerId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `addressKey` (string)
- `countryIsoCode` (string)
- `addressLine` (string)
- `addressNumber` (string)
- `department` (string)
- `province` (string)
- `district` (string)
- `phone` (string)
- `cellPhone` (string)
- `postalCode` (string)
- `reference` (string)
- `latitude` (number (double))
- `longitude` (number (double))
- `isDefault` (boolean)
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, HttpValidationProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/customers/{customerId}/addresses' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Create customer group
Creates a customer group. Members are added separately.
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/create-customer-group
## Create customer group
`POST /v1/customers/groups`
Lifecycle: **stable**
Creates a customer group. Members are added separately.
Required permissions (any): `customer_group:create`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `description` (string)
- `isActive` (boolean)
### Responses
- `201`: Created — application/json, CustomerGroupDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/customers/groups' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Create customer spreadsheet
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/create-customer-spreadsheet
## Create customer spreadsheet
`POST /v1/customers/spreadsheet`
Lifecycle: **stable**
Required permissions (any): `customer:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `ids` (array)
- `filters` (null | CustomerSpreadsheetFilters)
- `pageSize` (integer (int32))
- `maxRows` (integer (int32))
### Responses
- `200`: OK — application/json, CustomerSpreadsheetDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/customers/spreadsheet' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete customer
Delete a customer (soft delete)
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/delete-customer
## Delete customer
`DELETE /v1/customers/{id}`
Lifecycle: **stable**
Delete a customer (soft delete)
Required permissions (any): `customer:delete`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/customers/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Delete customer address
Delete a customer address
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/delete-customer-address
## Delete customer address
`DELETE /v1/customers/{customerId}/addresses/{addressId}`
Lifecycle: **stable**
Delete a customer address
Required permissions (any): `customer:delete`
### Parameters
- `customerId` (path, string, required)
- `addressId` (path, string, required)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/customers/{customerId}/addresses/{addressId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Delete customer group
Deletes a customer group. Its members are not deleted, only their membership.
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/delete-customer-group
## Delete customer group
`DELETE /v1/customers/groups/{id}`
Lifecycle: **stable**
Deletes a customer group. Its members are not deleted, only their membership.
Required permissions (any): `customer_group:delete`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/customers/groups/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get customer
Get a customer by ID
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/get-customer
## Get customer
`GET /v1/customers/{id}`
Lifecycle: **stable**
Get a customer by ID
Required permissions (any): `customer:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, CustomerDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/customers/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get customer group
Returns one customer group with its member count.
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/get-customer-group
## Get customer group
`GET /v1/customers/groups/{id}`
Lifecycle: **stable**
Returns one customer group with its member count.
Required permissions (any): `customer_group:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, CustomerGroupDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/customers/groups/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get customer spreadsheet
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/get-customer-spreadsheet
## Get customer spreadsheet
`GET /v1/customers/spreadsheet/{id}`
Lifecycle: **stable**
Required permissions (any): `customer:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfCustomerDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/customers/spreadsheet/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List customer addresses
Get all addresses for a customer
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/list-customer-addresses
## List customer addresses
`GET /v1/customers/{customerId}/addresses`
Lifecycle: **stable**
Get all addresses for a customer
Required permissions (any): `customer:read`
### Parameters
- `customerId` (path, string, required)
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/customers/{customerId}/addresses' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List customer groups
Lists the customer groups. Groups drive segmented pricing and promotions.
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/list-customer-groups
## List customer groups
`GET /v1/customers/groups`
Lifecycle: **stable**
Lists the customer groups. Groups drive segmented pricing and promotions.
Required permissions (any): `customer_group:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `isActive` (query, boolean)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfCustomerGroupDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/customers/groups' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List customers
Get a paginated list of customers with optional filtering
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/list-customers
## List customers
`GET /v1/customers`
Lifecycle: **stable**
Get a paginated list of customers with optional filtering
Required permissions (any): `customer:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `isActive` (query, boolean)
- `isVerified` (query, boolean)
- `customerType` (query, array)
- `status` (query, array)
- `groupId` (query, string)
- `customerIds` (query, array)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfCustomerDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/customers' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Queue a customers export
Queues a customer export. Returns a job; the file becomes downloadable once it completes.
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/queue-a-customers-export
## Queue a customers export
`POST /v1/customers/exports`
Lifecycle: **stable**
Queues a customer export. Returns a job; the file becomes downloadable once it completes.
Required permissions (any): `customer:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `format` (string)
- `search` (string): Free-text filter. Which fields it covers depends on the resource.
- `isActive` (boolean)
- `isVerified` (boolean)
- `customerType` (null | CustomerType)
- `customerTypes` (array)
- `status` (null | CustomerStatus)
- `statuses` (array)
- `customerIds` (array)
- `createdFrom` (string (date-time))
- `createdTo` (string (date-time))
- `template` (boolean)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/customers/exports' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Queue a customers import
Queues a customer import from a file. Returns a job you poll for progress and errors.
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/queue-a-customers-import
## Queue a customers import
`POST /v1/customers/import`
Lifecycle: **stable**
Queues a customer import from a file. Returns a job you poll for progress and errors.
Required permissions (any): `customer:update`
### Request body
Content-Type: `multipart/form-data` · required
#### Fields
- `assetId` (string)
### Responses
- `202`: Accepted — application/json, QueuedOperationResponse
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/customers/import' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: multipart/form-data'
```
---
# Remove customers from a customer group
Removes customers from a group without deleting the customers.
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/remove-customers-from-a-customer-group
## Remove customers from a customer group
`POST /v1/customers/groups/{id}/members/remove`
Lifecycle: **stable**
Removes customers from a group without deleting the customers.
Required permissions (any): `customer_group:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `customerIds` (array, required)
### Responses
- `200`: OK — application/json, CustomerGroupMembershipRemovalDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/customers/groups/{id}/members/remove' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Save customer spreadsheet
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/save-customer-spreadsheet
## Save customer spreadsheet
`POST /v1/customers/spreadsheet/save`
Lifecycle: **stable**
Required permissions (any): `customer:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `rows` (array)
### Responses
- `202`: Accepted — application/json, QueuedOperationResponse
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/customers/spreadsheet/save' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Update customer
Update an existing customer
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/update-customer
## Update customer
`PUT /v1/customers/{id}`
Lifecycle: **stable**
Update an existing customer
Required permissions (any): `customer:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `firstName` (string, required)
- `lastName` (string, required)
- `phone` (string)
- `identificationNumber` (string)
- `identificationType` (string)
- `entityName` (string)
- `entityIdentificationNumber` (string)
- `gender` (string)
- `role` (string)
- `companyName` (string)
- `dateOfBirth` (string (date))
- `consent` (boolean)
- `countryIsoCode` (string)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/customers/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Update customer address
Update an existing customer address
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/update-customer-address
## Update customer address
`PUT /v1/customers/{customerId}/addresses/{addressId}`
Lifecycle: **stable**
Update an existing customer address
Required permissions (any): `customer:update`
### Parameters
- `customerId` (path, string, required)
- `addressId` (path, string, required)
### Request body
Content-Type: `application/json` · required
#### Fields
- `addressKey` (string)
- `countryIsoCode` (string)
- `addressLine` (string)
- `addressNumber` (string)
- `department` (string)
- `province` (string)
- `district` (string)
- `phone` (string)
- `cellPhone` (string)
- `postalCode` (string)
- `reference` (string)
- `latitude` (number (double))
- `longitude` (number (double))
- `isDefault` (boolean)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, HttpValidationProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/customers/{customerId}/addresses/{addressId}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Update customer group
Updates a customer group's name and settings, without touching its members.
Canonical: https://docs.ecomiq.pe/en/docs/admin/customers/customers/update-customer-group
## Update customer group
`PUT /v1/customers/groups/{id}`
Lifecycle: **stable**
Updates a customer group's name and settings, without touching its members.
Required permissions (any): `customer_group:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `description` (string)
- `isActive` (boolean)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/customers/groups/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Fulfillment & Shipping
Fulfillment, shipping, rates, zones, pickup, and coverage.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping
- [Settings](/en/docs/admin/fulfillment-and-shipping/settings): Read and update general shipping and tax settings.
- [Profiles](/en/docs/admin/fulfillment-and-shipping/profiles): Group products and rules under shipping profiles.
- [Methods](/en/docs/admin/fulfillment-and-shipping/methods): Manage the shipping methods a shopper can select.
- [Rates](/en/docs/admin/fulfillment-and-shipping/rates): Manage shipping rates and their charging conditions.
- [Zones](/en/docs/admin/fulfillment-and-shipping/zones): Manage geographic shipping zones.
- [Regions](/en/docs/admin/fulfillment-and-shipping/regions): Manage the regions used to apply taxes.
- [Coverage](/en/docs/admin/fulfillment-and-shipping/coverage): Check which delivery options cover an address.
- [Fulfillment](/en/docs/admin/fulfillment-and-shipping/fulfillment): Manage locations, fulfillment, packages, shipments, and routing.
- [Orders](/en/docs/admin/fulfillment-and-shipping/orders): Manage fulfillment, labels, and shipments for an order.
- [Pickup Points](/en/docs/admin/fulfillment-and-shipping/pickup-points): Manage locations where shoppers can pick up an order.
- [Geo](/en/docs/admin/fulfillment-and-shipping/geo): Look up available countries, areas, and geographic divisions.
- [Holidays](/en/docs/admin/fulfillment-and-shipping/holidays): Manage holidays that affect delivery schedules.
- [Customizations](/en/docs/admin/fulfillment-and-shipping/customizations): Manage rules that customize shipping calculations.
- [Overrides](/en/docs/admin/fulfillment-and-shipping/overrides): Manage exceptions to tax rules.
---
# Coverage
Check which delivery options cover an address.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/coverage
| Method | Endpoint | Operation |
| --- | --- | --- |
| `GET` | [`/v1/shipping/coverage`](/en/docs/admin/fulfillment-and-shipping/coverage/list-shipping-coverage) | List shipping coverage |
---
# List shipping coverage
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/coverage/list-shipping-coverage
## List shipping coverage
`GET /v1/shipping/coverage`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Parameters
- `isActive` (query, boolean)
### Responses
- `200`: OK — application/json, ShippingCoverageDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/coverage' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Customizations
Manage rules that customize shipping calculations.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/customizations
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/shipping/customizations`](/en/docs/admin/fulfillment-and-shipping/customizations/create-shipping-customization) | Create shipping customization |
| `GET` | [`/v1/shipping/customizations`](/en/docs/admin/fulfillment-and-shipping/customizations/list-shipping-customizations) | List shipping customizations |
| `GET` | [`/v1/shipping/customizations/{id}`](/en/docs/admin/fulfillment-and-shipping/customizations/get-shipping-customization) | Get shipping customization |
| `PUT` | [`/v1/shipping/customizations/{id}`](/en/docs/admin/fulfillment-and-shipping/customizations/update-shipping-customization) | Update shipping customization |
| `DELETE` | [`/v1/shipping/customizations/{id}`](/en/docs/admin/fulfillment-and-shipping/customizations/delete-shipping-customization) | Delete shipping customization |
---
# Create shipping customization
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/customizations/create-shipping-customization
## Create shipping customization
`POST /v1/shipping/customizations`
Lifecycle: **stable**
Required permissions (any): `settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `shippingMethodId` (string)
- `name` (string)
- `priority` (integer (int32))
- `isActive` (boolean)
- `hideInCheckout` (boolean)
- `displayName` (string)
- `sortOrder` (integer (int32))
- `sellerId` (string)
- `shippingProfileId` (string)
- `minOrderAmount` (number (double))
- `maxOrderAmount` (number (double))
- `minWeight` (number (double))
- `maxWeight` (number (double))
- `availableDays` (array)
- `startTime` (string (time))
- `endTime` (string (time))
- `postalCodes` (array)
### Responses
- `200`: OK — application/json, ShippingCustomizationDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/shipping/customizations' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete shipping customization
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/customizations/delete-shipping-customization
## Delete shipping customization
`DELETE /v1/shipping/customizations/{id}`
Lifecycle: **stable**
Required permissions (any): `settings:delete`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/shipping/customizations/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get shipping customization
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/customizations/get-shipping-customization
## Get shipping customization
`GET /v1/shipping/customizations/{id}`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, ShippingCustomizationDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/customizations/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List shipping customizations
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/customizations/list-shipping-customizations
## List shipping customizations
`GET /v1/shipping/customizations`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/customizations' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update shipping customization
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/customizations/update-shipping-customization
## Update shipping customization
`PUT /v1/shipping/customizations/{id}`
Lifecycle: **stable**
Required permissions (any): `settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `shippingMethodId` (string)
- `name` (string)
- `priority` (integer (int32))
- `isActive` (boolean)
- `hideInCheckout` (boolean)
- `displayName` (string)
- `sortOrder` (integer (int32))
- `sellerId` (string)
- `shippingProfileId` (string)
- `minOrderAmount` (number (double))
- `maxOrderAmount` (number (double))
- `minWeight` (number (double))
- `maxWeight` (number (double))
- `availableDays` (array)
- `startTime` (string (time))
- `endTime` (string (time))
- `postalCodes` (array)
### Responses
- `200`: OK — application/json, ShippingCustomizationDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/shipping/customizations/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Fulfillment
Manage locations, fulfillment, packages, shipments, and routing.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/fulfillment/routing/preview`](/en/docs/admin/fulfillment-and-shipping/fulfillment/preview-routing) | Preview routing |
### Locations
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/fulfillment/locations`](/en/docs/admin/fulfillment-and-shipping/fulfillment/create-location) | Create location |
| `GET` | [`/v1/fulfillment/locations`](/en/docs/admin/fulfillment-and-shipping/fulfillment/list-locations) | List locations |
| `GET` | [`/v1/fulfillment/locations/{id}`](/en/docs/admin/fulfillment-and-shipping/fulfillment/get-location-by-id) | Get location by ID |
| `PUT` | [`/v1/fulfillment/locations/{id}`](/en/docs/admin/fulfillment-and-shipping/fulfillment/update-a-location) | Update a location |
| `PUT` | [`/v1/fulfillment/locations/default`](/en/docs/admin/fulfillment-and-shipping/fulfillment/set-default-location) | Set default location |
| `DELETE` | [`/v1/fulfillment/locations/{id}`](/en/docs/admin/fulfillment-and-shipping/fulfillment/delete-a-location) | Delete a location |
### Orders
| Method | Endpoint | Operation |
| --- | --- | --- |
| `GET` | [`/v1/fulfillment/orders`](/en/docs/admin/fulfillment-and-shipping/fulfillment/list-fulfillment-orders) | List fulfillment orders |
| `GET` | [`/v1/fulfillment/orders/{id}`](/en/docs/admin/fulfillment-and-shipping/fulfillment/get-fulfillment-order) | Get fulfillment order |
| `POST` | [`/v1/fulfillment/orders/{id}/assign`](/en/docs/admin/fulfillment-and-shipping/fulfillment/assign-fulfillment-order) | Assign fulfillment order |
| `POST` | [`/v1/fulfillment/orders/{id}/cancel`](/en/docs/admin/fulfillment-and-shipping/fulfillment/cancel-fulfillment-order) | Cancel fulfillment order |
| `POST` | [`/v1/fulfillment/orders/{id}/deliver`](/en/docs/admin/fulfillment-and-shipping/fulfillment/deliver-fulfillment-order) | Deliver fulfillment order |
| `POST` | [`/v1/fulfillment/orders/{id}/in-progress`](/en/docs/admin/fulfillment-and-shipping/fulfillment/set-fulfillment-order-in-progress) | Set fulfillment order in progress |
| `POST` | [`/v1/fulfillment/orders/{id}/pick-up`](/en/docs/admin/fulfillment-and-shipping/fulfillment/pick-up-fulfillment-order) | Pick up fulfillment order |
| `POST` | [`/v1/fulfillment/orders/{id}/ready-to-pickup`](/en/docs/admin/fulfillment-and-shipping/fulfillment/set-fulfillment-order-ready-to-pick-up) | Set fulfillment order ready to pick up |
| `POST` | [`/v1/fulfillment/orders/{id}/ship`](/en/docs/admin/fulfillment-and-shipping/fulfillment/ship-fulfillment-order) | Ship fulfillment order |
| `POST` | [`/v1/fulfillment/orders/{id}/shipment`](/en/docs/admin/fulfillment-and-shipping/fulfillment/create-shipment) | Create shipment |
| `GET` | [`/v1/fulfillment/orders/{id}/label`](/en/docs/admin/fulfillment-and-shipping/fulfillment/get-shipment-label) | Get shipment label |
| `GET` | [`/v1/fulfillment/orders/{id}/packing-slip`](/en/docs/admin/fulfillment-and-shipping/fulfillment/get-packing-slip) | Get packing slip |
| `GET` | [`/v1/fulfillment/orders/{id}/tracking`](/en/docs/admin/fulfillment-and-shipping/fulfillment/get-shipment-tracking) | Get shipment tracking |
| `GET` | [`/v1/fulfillment/orders/tracking/{trackingNumber}`](/en/docs/admin/fulfillment-and-shipping/fulfillment/get-fulfillment-order-by-tracking) | Get fulfillment order by tracking |
| `GET` | [`/v1/fulfillment/orders/{id}/shipments/{shipmentId}/label`](/en/docs/admin/fulfillment-and-shipping/fulfillment/get-shipment-label-2) | Get shipment label |
| `GET` | [`/v1/fulfillment/orders/{id}/shipments/{shipmentId}/packing-slip`](/en/docs/admin/fulfillment-and-shipping/fulfillment/get-packing-slip-2) | Get packing slip |
| `GET` | [`/v1/fulfillment/orders/{id}/shipments/{shipmentId}/tracking`](/en/docs/admin/fulfillment-and-shipping/fulfillment/get-shipment-tracking-2) | Get shipment tracking |
### Packages
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/fulfillment/packages`](/en/docs/admin/fulfillment-and-shipping/fulfillment/create-package) | Create package |
| `GET` | [`/v1/fulfillment/packages`](/en/docs/admin/fulfillment-and-shipping/fulfillment/list-packages) | List packages |
| `GET` | [`/v1/fulfillment/packages/{id}`](/en/docs/admin/fulfillment-and-shipping/fulfillment/get-package) | Get package |
| `PUT` | [`/v1/fulfillment/packages/{id}`](/en/docs/admin/fulfillment-and-shipping/fulfillment/update-package) | Update package |
| `DELETE` | [`/v1/fulfillment/packages/{id}`](/en/docs/admin/fulfillment-and-shipping/fulfillment/delete-package) | Delete package |
### Settings
| Method | Endpoint | Operation |
| --- | --- | --- |
| `GET` | [`/v1/fulfillment/settings`](/en/docs/admin/fulfillment-and-shipping/fulfillment/get-fulfillment-settings) | Get fulfillment settings |
| `PUT` | [`/v1/fulfillment/settings`](/en/docs/admin/fulfillment-and-shipping/fulfillment/update-fulfillment-settings) | Update fulfillment settings |
---
# Assign fulfillment order
Assigns the fulfillment order to a location, which becomes responsible for preparing it.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/assign-fulfillment-order
## Assign fulfillment order
`POST /v1/fulfillment/orders/{id}/assign`
Lifecycle: **stable**
Assigns the fulfillment order to a location, which becomes responsible for preparing it.
Required permissions (any): `shipment:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `locationId` (string, required)
### Responses
- `200`: OK — application/json, FulfillmentOrderDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/assign' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Cancel fulfillment order
Cancels the fulfillment. Any stock reserved for it is released.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/cancel-fulfillment-order
## Cancel fulfillment order
`POST /v1/fulfillment/orders/{id}/cancel`
Lifecycle: **stable**
Cancels the fulfillment. Any stock reserved for it is released.
Required permissions (any): `shipment:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, FulfillmentOrderDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/cancel' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Create location
Create a new fulfillment location for the store
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/create-location
## Create location
`POST /v1/fulfillment/locations`
Lifecycle: **stable**
Create a new fulfillment location for the store
Required permissions (any): `settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `code` (string)
- `type` (LocationType)
- `address` (string)
- `city` (string)
- `state` (string)
- `country` (string)
- `postalCode` (string)
- `latitude` (number (double))
- `longitude` (number (double))
- `phone` (string)
- `email` (string)
- `description` (string)
- `isDefault` (boolean)
- `useForFulfillment` (boolean)
- `supportsShipping` (boolean)
- `supportsLocalDelivery` (boolean)
- `supportsPickup` (boolean)
- `isPhysicalStore` (boolean)
- `supportsPos` (boolean)
- `priority` (integer (int32))
- `pickupInstructions` (string)
- `pickupLeadTimeInMinutes` (integer (int32))
- `pickupSlotInMinutes` (integer (int32))
- `pickupDailyCapacity` (integer (int32))
- `localDeliveryInstructions` (string)
- `localDeliveryLeadTimeInMinutes` (integer (int32))
- `localDeliverySlotInMinutes` (integer (int32))
- `localDeliveryDailyCapacity` (integer (int32))
- `localDeliveryFee` (number (double))
- `localDeliveryFreeFromAmount` (number (double))
- `localDeliveryMinHours` (integer (int32))
- `localDeliveryMaxHours` (integer (int32))
- `localDeliveryPostalCodes` (array)
- `localDeliveryZones` (array)
- `schedules` (array)
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/locations' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Create package
Creates a package format.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/create-package
## Create package
`POST /v1/fulfillment/packages`
Lifecycle: **stable**
Creates a package format.
Required permissions (any): `settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `type` (PackageType)
- `length` (number (double))
- `width` (number (double))
- `height` (number (double))
- `dimensionUnit` (DimensionUnit)
- `emptyWeight` (number (double))
- `weightUnit` (WeightUnit)
- `isDefault` (boolean)
- `isActive` (boolean)
### Responses
- `201`: Created — application/json, PackageDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/packages' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Create shipment
Creates the shipment for a fulfillment order, with its carrier and tracking number.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/create-shipment
## Create shipment
`POST /v1/fulfillment/orders/{id}/shipment`
Lifecycle: **stable**
Creates the shipment for a fulfillment order, with its carrier and tracking number.
Required permissions (any): `shipment:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `packageId` (string)
- `items` (array)
### Responses
- `200`: OK — application/json, FulfillmentShipmentModel
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/shipment' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete a location
Delete an existing fulfillment location
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/delete-a-location
## Delete a location
`DELETE /v1/fulfillment/locations/{id}`
Lifecycle: **stable**
Delete an existing fulfillment location
Required permissions (any): `settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/locations/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Delete package
Deletes a package format.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/delete-package
## Delete package
`DELETE /v1/fulfillment/packages/{id}`
Lifecycle: **stable**
Deletes a package format.
Required permissions (any): `settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/packages/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Deliver fulfillment order
Confirms delivery to the customer. Closes a delivery fulfillment.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/deliver-fulfillment-order
## Deliver fulfillment order
`POST /v1/fulfillment/orders/{id}/deliver`
Lifecycle: **stable**
Confirms delivery to the customer. Closes a delivery fulfillment.
Required permissions (any): `shipment:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, FulfillmentOrderDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/deliver' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get fulfillment order
Returns one fulfillment order with its items, its assigned location and its state.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/get-fulfillment-order
## Get fulfillment order
`GET /v1/fulfillment/orders/{id}`
Lifecycle: **stable**
Returns one fulfillment order with its items, its assigned location and its state.
Required permissions (any): `shipment:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, FulfillmentOrderDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get fulfillment order by tracking
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/get-fulfillment-order-by-tracking
## Get fulfillment order by tracking
`GET /v1/fulfillment/orders/tracking/{trackingNumber}`
Lifecycle: **stable**
Required permissions (any): `shipment:read`
### Parameters
- `trackingNumber` (path, string, required)
- `tenantId` (query, string)
### Responses
- `200`: OK — application/json, FulfillmentOrderSummaryModel
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/tracking/{trackingNumber}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get fulfillment settings
Returns the fulfillment rules of the store: how orders are routed and split.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/get-fulfillment-settings
## Get fulfillment settings
`GET /v1/fulfillment/settings`
Lifecycle: **stable**
Returns the fulfillment rules of the store: how orders are routed and split.
Required permissions (any): `settings:read`
### Responses
- `200`: OK — application/json, FulfillmentSettingsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/settings' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get location by ID
Retrieve a specific fulfillment location by its ID
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/get-location-by-id
## Get location by ID
`GET /v1/fulfillment/locations/{id}`
Lifecycle: **stable**
Retrieve a specific fulfillment location by its ID
Required permissions (any): `settings:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, LocationDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/locations/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get package
Returns one package format with its dimensions and weight.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/get-package
## Get package
`GET /v1/fulfillment/packages/{id}`
Lifecycle: **stable**
Returns one package format with its dimensions and weight.
Required permissions (any): `settings:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, PackageDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/packages/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get packing slip
Returns the packing slip that goes inside the box.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/get-packing-slip
## Get packing slip
`GET /v1/fulfillment/orders/{id}/packing-slip`
Lifecycle: **stable**
Returns the packing slip that goes inside the box.
Required permissions (any): `shipment:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
- `shipmentId` (query, string)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/packing-slip' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get packing slip
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/get-packing-slip-2
## Get packing slip
`GET /v1/fulfillment/orders/{id}/shipments/{shipmentId}/packing-slip`
Lifecycle: **stable**
Required permissions (any): `shipment:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
- `shipmentId` (path, string, required)
### Responses
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/shipments/{shipmentId}/packing-slip' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get shipment label
Returns the shipping label, ready to print.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/get-shipment-label
## Get shipment label
`GET /v1/fulfillment/orders/{id}/label`
Lifecycle: **stable**
Returns the shipping label, ready to print.
Required permissions (any): `shipment:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
- `shipmentId` (query, string)
### Responses
- `200`: OK — application/pdf, string (byte)
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/label' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get shipment label
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/get-shipment-label-2
## Get shipment label
`GET /v1/fulfillment/orders/{id}/shipments/{shipmentId}/label`
Lifecycle: **stable**
Required permissions (any): `shipment:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
- `shipmentId` (path, string, required)
### Responses
- `200`: OK — application/pdf, string (byte)
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/shipments/{shipmentId}/label' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get shipment tracking
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/get-shipment-tracking
## Get shipment tracking
`GET /v1/fulfillment/orders/{id}/shipments/{shipmentId}/tracking`
Lifecycle: **stable**
Required permissions (any): `shipment:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
- `shipmentId` (path, string, required)
### Responses
- `200`: OK — application/json, ShipmentTrackingDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/shipments/{shipmentId}/tracking' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get shipment tracking
Returns the tracking events of a shipment as reported by the carrier.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/get-shipment-tracking-2
## Get shipment tracking
`GET /v1/fulfillment/orders/{id}/tracking`
Lifecycle: **stable**
Returns the tracking events of a shipment as reported by the carrier.
Required permissions (any): `shipment:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
- `shipmentId` (query, string)
### Responses
- `200`: OK — application/json, ShipmentTrackingDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/tracking' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List fulfillment orders
Lists the work to be fulfilled. One customer order becomes several fulfillment orders when its items ship from different locations.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/list-fulfillment-orders
## List fulfillment orders
`GET /v1/fulfillment/orders`
Lifecycle: **stable**
Lists the work to be fulfilled. One customer order becomes several fulfillment orders when its items ship from different locations.
Required permissions (any): `shipment:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `orderId` (query, string)
- `locationId` (query, string)
- `status` (query, array)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfFulfillmentOrderListItemDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List locations
Retrieve a paginated list of fulfillment locations
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/list-locations
## List locations
`GET /v1/fulfillment/locations`
Lifecycle: **stable**
Retrieve a paginated list of fulfillment locations
Required permissions (any): `settings:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `isActive` (query, boolean)
- `sellerId` (query, string)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfLocationDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/locations' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List packages
Lists the package formats defined for the store. They are used to pick a box and estimate shipping.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/list-packages
## List packages
`GET /v1/fulfillment/packages`
Lifecycle: **stable**
Lists the package formats defined for the store. They are used to pick a box and estimate shipping.
Required permissions (any): `settings:read`
### Parameters
- `includeInactive` (query, boolean)
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/packages' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Pick up fulfillment order
Confirms the customer collected the order. Closes a pickup fulfillment.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/pick-up-fulfillment-order
## Pick up fulfillment order
`POST /v1/fulfillment/orders/{id}/pick-up`
Lifecycle: **stable**
Confirms the customer collected the order. Closes a pickup fulfillment.
Required permissions (any): `shipment:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, FulfillmentOrderDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/pick-up' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Preview routing
Shows which locations would fulfill an order and how it would split, without committing anything.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/preview-routing
## Preview routing
`POST /v1/fulfillment/routing/preview`
Lifecycle: **stable**
Shows which locations would fulfill an order and how it would split, without committing anything.
Required permissions (any): `settings:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `allowSplitFulfillment` (boolean)
- `items` (array)
### Responses
- `200`: OK — application/json, RoutingPreviewDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/routing/preview' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Set default location
Returns the store's default location, creating it if none exists. Useful when bootstrapping a store.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/set-default-location
## Set default location
`PUT /v1/fulfillment/locations/default`
Lifecycle: **stable**
Returns the store's default location, creating it if none exists. Useful when bootstrapping a store.
Required permissions (any): `settings:update`
### Responses
- `200`: OK — application/json, LocationModel
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/locations/default' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Set fulfillment order in progress
Marks that preparation has started. Use it to distinguish what is being picked from what is still queued.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/set-fulfillment-order-in-progress
## Set fulfillment order in progress
`POST /v1/fulfillment/orders/{id}/in-progress`
Lifecycle: **stable**
Marks that preparation has started. Use it to distinguish what is being picked from what is still queued.
Required permissions (any): `shipment:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, FulfillmentOrderDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/in-progress' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Set fulfillment order ready to pick up
Marks the order as ready for the customer to collect. Only for pickup, not for delivery.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/set-fulfillment-order-ready-to-pick-up
## Set fulfillment order ready to pick up
`POST /v1/fulfillment/orders/{id}/ready-to-pickup`
Lifecycle: **stable**
Marks the order as ready for the customer to collect. Only for pickup, not for delivery.
Required permissions (any): `shipment:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, FulfillmentOrderDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/ready-to-pickup' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Ship fulfillment order
Marks the order as shipped. From here it is tracked by its shipment.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/ship-fulfillment-order
## Ship fulfillment order
`POST /v1/fulfillment/orders/{id}/ship`
Lifecycle: **stable**
Marks the order as shipped. From here it is tracked by its shipment.
Required permissions (any): `shipment:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `shipmentId` (string)
- `trackingNumber` (string)
- `trackingLink` (string)
- `labelUrl` (string)
- `carrierName` (string)
- `packageId` (string)
- `items` (array)
### Responses
- `200`: OK — application/json, FulfillmentOrderDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/orders/{id}/ship' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Update a location
Update an existing fulfillment location
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/update-a-location
## Update a location
`PUT /v1/fulfillment/locations/{id}`
Lifecycle: **stable**
Update an existing fulfillment location
Required permissions (any): `settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `code` (string)
- `type` (null | LocationType)
- `address` (string)
- `city` (string)
- `state` (string)
- `country` (string)
- `postalCode` (string)
- `latitude` (number (double))
- `longitude` (number (double))
- `phone` (string)
- `email` (string)
- `description` (string)
- `isDefault` (boolean)
- `useForFulfillment` (boolean)
- `supportsShipping` (boolean)
- `supportsLocalDelivery` (boolean)
- `supportsPickup` (boolean)
- `isPhysicalStore` (boolean)
- `supportsPos` (boolean)
- `priority` (integer (int32))
- `pickupInstructions` (string)
- `pickupLeadTimeInMinutes` (integer (int32))
- `pickupSlotInMinutes` (integer (int32))
- `pickupDailyCapacity` (integer (int32))
- `localDeliveryInstructions` (string)
- `localDeliveryLeadTimeInMinutes` (integer (int32))
- `localDeliverySlotInMinutes` (integer (int32))
- `localDeliveryDailyCapacity` (integer (int32))
- `localDeliveryFee` (number (double))
- `localDeliveryFreeFromAmount` (number (double))
- `localDeliveryMinHours` (integer (int32))
- `localDeliveryMaxHours` (integer (int32))
- `localDeliveryPostalCodes` (array)
- `localDeliveryZones` (array)
- `schedules` (array)
### Responses
- `200`: OK — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/locations/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Update fulfillment settings
Updates the fulfillment rules. Applies to orders created from here on; existing ones keep their routing.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/update-fulfillment-settings
## Update fulfillment settings
`PUT /v1/fulfillment/settings`
Lifecycle: **stable**
Updates the fulfillment rules. Applies to orders created from here on; existing ones keep their routing.
Required permissions (any): `settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `routingMode` (RoutingMode)
- `splitFulfillmentEnabled` (boolean)
- `packingSlipSenderName` (string)
- `packingSlipSenderPhone` (string)
- `packingSlipSenderEmail` (string)
- `packingSlipNotes` (string)
### Responses
- `200`: OK — application/json, FulfillmentSettingsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/settings' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Update package
Updates a package format. Shipments already created keep the dimensions they were made with.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/fulfillment/update-package
## Update package
`PUT /v1/fulfillment/packages/{id}`
Lifecycle: **stable**
Updates a package format. Shipments already created keep the dimensions they were made with.
Required permissions (any): `settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `type` (PackageType)
- `length` (number (double))
- `width` (number (double))
- `height` (number (double))
- `dimensionUnit` (DimensionUnit)
- `emptyWeight` (number (double))
- `weightUnit` (WeightUnit)
- `isDefault` (boolean)
- `isActive` (boolean)
### Responses
- `200`: OK — application/json, PackageDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/fulfillment/packages/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Geo
Look up available countries, areas, and geographic divisions.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/geo
| Method | Endpoint | Operation |
| --- | --- | --- |
| `GET` | [`/v1/geo/countries`](/en/docs/admin/fulfillment-and-shipping/geo/list-countries) | List countries |
| `GET` | [`/v1/geo/resolve`](/en/docs/admin/fulfillment-and-shipping/geo/resolve-area-by-source-code) | Resolve area by source code |
| `GET` | [`/v1/geo/areas`](/en/docs/admin/fulfillment-and-shipping/geo/list-areas) | List areas |
| `GET` | [`/v1/geo/areas/{id}`](/en/docs/admin/fulfillment-and-shipping/geo/get-area) | Get area |
---
# Get area
Returns one area with the districts it covers.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/geo/get-area
## Get area
`GET /v1/geo/areas/{id}`
Lifecycle: **stable**
Returns one area with the districts it covers.
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, GeoAreaModel
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/geo/areas/{id}'
```
---
# List areas
Lists the geographic areas used to group districts for shipping.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/geo/list-areas
## List areas
`GET /v1/geo/areas`
Lifecycle: **stable**
Lists the geographic areas used to group districts for shipping.
### Parameters
- `countryCode` (query, string): ISO 3166-1 alpha-2 country code, for example `PE`.
- `type` (query, QueryEnumOfAreaLevel)
- `parentId` (query, string)
- `parentCode` (query, string)
- `source` (query, string)
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `limit` (query, integer (int32)): Maximum number of results to return.
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/geo/areas'
```
---
# List countries
Lists the countries available for addresses and shipping.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/geo/list-countries
## List countries
`GET /v1/geo/countries`
Lifecycle: **stable**
Lists the countries available for addresses and shipping.
### Parameters
- `Search` (query, string)
- `Limit` (query, integer (int32))
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/geo/countries'
```
---
# Resolve area by source code
Finds which area a location belongs to, from a source code.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/geo/resolve-area-by-source-code
## Resolve area by source code
`GET /v1/geo/resolve`
Lifecycle: **stable**
Finds which area a location belongs to, from a source code.
### Parameters
- `CountryCode` (query, string, required)
- `Source` (query, string, required)
- `Code` (query, string, required)
### Responses
- `200`: OK — application/json, GeoAreaModel
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/geo/resolve'
```
---
# Holidays
Manage holidays that affect delivery schedules.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/holidays
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/shipping/holidays`](/en/docs/admin/fulfillment-and-shipping/holidays/create-holiday) | Create holiday |
| `GET` | [`/v1/shipping/holidays`](/en/docs/admin/fulfillment-and-shipping/holidays/list-holidays) | List holidays |
| `GET` | [`/v1/shipping/holidays/{id}`](/en/docs/admin/fulfillment-and-shipping/holidays/get-a-holiday-by-id) | Get a holiday by ID |
| `PUT` | [`/v1/shipping/holidays/{id}`](/en/docs/admin/fulfillment-and-shipping/holidays/update-holiday) | Update holiday |
| `DELETE` | [`/v1/shipping/holidays/{id}`](/en/docs/admin/fulfillment-and-shipping/holidays/delete-a-holiday) | Delete a holiday |
---
# Create holiday
Create a new holiday in the system
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/holidays/create-holiday
## Create holiday
`POST /v1/shipping/holidays`
Lifecycle: **stable**
Create a new holiday in the system
Required permissions (any): `shipping_settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `fromDate` (string (date), required)
- `toDate` (string (date), required)
- `description` (string)
### Responses
- `201`: Created
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/shipping/holidays' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete a holiday
Delete an existing holiday
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/holidays/delete-a-holiday
## Delete a holiday
`DELETE /v1/shipping/holidays/{id}`
Lifecycle: **stable**
Delete an existing holiday
Required permissions (any): `shipping_settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/shipping/holidays/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get a holiday by ID
Returns one non-working day.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/holidays/get-a-holiday-by-id
## Get a holiday by ID
`GET /v1/shipping/holidays/{id}`
Lifecycle: **stable**
Returns one non-working day.
Required permissions (any): `settings:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, HolidayDetailsDto
- `400`: Bad Request — application/problem+json, HttpValidationProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/holidays/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List holidays
Get a paginated list of holidays with optional filtering
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/holidays/list-holidays
## List holidays
`GET /v1/shipping/holidays`
Lifecycle: **stable**
Get a paginated list of holidays with optional filtering
Required permissions (any): `settings:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `isActive` (query, boolean)
- `year` (query, string (date-time))
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfHolidayDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/holidays' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update holiday
Updates a non-working day. Delivery estimates skip these dates.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/holidays/update-holiday
## Update holiday
`PUT /v1/shipping/holidays/{id}`
Lifecycle: **stable**
Updates a non-working day. Delivery estimates skip these dates.
Required permissions (any): `shipping_settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `fromDate` (string (date), required)
- `toDate` (string (date), required)
- `description` (string)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, HttpValidationProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/shipping/holidays/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Methods
Manage the shipping methods a shopper can select.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/methods
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/shipping/methods`](/en/docs/admin/fulfillment-and-shipping/methods/create-shipping-method) | Create shipping method |
| `GET` | [`/v1/shipping/methods`](/en/docs/admin/fulfillment-and-shipping/methods/list-shipping-methods) | List shipping methods |
| `POST` | [`/v1/shipping/methods/slots`](/en/docs/admin/fulfillment-and-shipping/methods/list-shipping-method-slots) | List shipping method slots |
| `GET` | [`/v1/shipping/methods/{id}`](/en/docs/admin/fulfillment-and-shipping/methods/get-shipping-method) | Get shipping method |
| `PUT` | [`/v1/shipping/methods/{id}`](/en/docs/admin/fulfillment-and-shipping/methods/update-shipping-method) | Update shipping method |
| `DELETE` | [`/v1/shipping/methods/{id}`](/en/docs/admin/fulfillment-and-shipping/methods/delete-shipping-method) | Delete shipping method |
| `GET` | [`/v1/shipping/methods/{id}/rates`](/en/docs/admin/fulfillment-and-shipping/methods/get-shipping-method-rates) | Get shipping method rates |
---
# Create shipping method
Create a new shipping method
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/methods/create-shipping-method
## Create shipping method
`POST /v1/shipping/methods`
Lifecycle: **stable**
Create a new shipping method
Required permissions (any): `settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `displayName` (string)
- `type` (ShippingMethodType)
- `basePrice` (number (double))
- `currency` (string)
- `estimatedDeliveryDays` (integer (int32))
- `estimatedDeliveryHours` (integer (int32))
- `allowShowCalendar` (boolean)
- `visibleInCheckout` (boolean)
- `sortOrder` (integer (int32))
- `shippingProfileId` (string)
- `minOrderAmount` (number (double))
- `maxOrderAmount` (number (double))
- `minWeight` (number (double))
- `maxWeight` (number (double))
- `allowSplitFulfillment` (boolean)
- `availableDays` (array)
- `metadata` (object)
- `connectionId` (string)
- `pickupPointIds` (array)
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/shipping/methods' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete shipping method
Delete an existing shipping method
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/methods/delete-shipping-method
## Delete shipping method
`DELETE /v1/shipping/methods/{id}`
Lifecycle: **stable**
Delete an existing shipping method
Required permissions (any): `settings:delete`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/shipping/methods/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get shipping method
Get a shipping method by ID
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/methods/get-shipping-method
## Get shipping method
`GET /v1/shipping/methods/{id}`
Lifecycle: **stable**
Get a shipping method by ID
Required permissions (any): `settings:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, ShippingMethodDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/methods/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get shipping method rates
Get paginated rates for a specific shipping method
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/methods/get-shipping-method-rates
## Get shipping method rates
`GET /v1/shipping/methods/{id}/rates`
Lifecycle: **stable**
Get paginated rates for a specific shipping method
Required permissions (any): `settings:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `isActive` (query, boolean)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfShippingRateDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/methods/{id}/rates' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List shipping method slots
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/methods/list-shipping-method-slots
## List shipping method slots
`POST /v1/shipping/methods/slots`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `storeId` (string, required)
- `shippingMethodId` (string, required)
- `locationId` (string, required)
- `pickupPointId` (string, required)
- `postalCode` (string, required)
- `latitude` (number (double), required)
- `longitude` (number (double), required)
- `date` (string (date), required)
### Responses
- `200`: OK — application/json, ShippingMethodSlotsModel
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/shipping/methods/slots' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# List shipping methods
Get a paginated list of shipping methods with optional filtering
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/methods/list-shipping-methods
## List shipping methods
`GET /v1/shipping/methods`
Lifecycle: **stable**
Get a paginated list of shipping methods with optional filtering
Required permissions (any): `settings:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `isActive` (query, boolean)
- `visibleInCheckout` (query, boolean)
- `onlyAvailable` (query, boolean)
- `postalCode` (query, string)
- `type` (query, QueryEnumOfShippingMethodType)
- `shippingProfileId` (query, string)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfShippingMethodDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/methods' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update shipping method
Update an existing shipping method
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/methods/update-shipping-method
## Update shipping method
`PUT /v1/shipping/methods/{id}`
Lifecycle: **stable**
Update an existing shipping method
Required permissions (any): `settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `displayName` (string)
- `type` (ShippingMethodType)
- `basePrice` (number (double))
- `currency` (string)
- `estimatedDeliveryDays` (integer (int32))
- `estimatedDeliveryHours` (integer (int32))
- `allowShowCalendar` (boolean)
- `visibleInCheckout` (boolean)
- `sortOrder` (integer (int32))
- `shippingProfileId` (string)
- `minOrderAmount` (number (double))
- `maxOrderAmount` (number (double))
- `minWeight` (number (double))
- `maxWeight` (number (double))
- `allowSplitFulfillment` (boolean)
- `availableDays` (array)
- `metadata` (object)
- `connectionId` (string)
- `pickupPointIds` (array)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/shipping/methods/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Orders
Manage fulfillment, labels, and shipments for an order.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/orders
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/orders/{orderId}/shipment`](/en/docs/admin/fulfillment-and-shipping/orders/create-shipment) | Create shipment |
| `GET` | [`/v1/orders/{orderId}/label`](/en/docs/admin/fulfillment-and-shipping/orders/get-order-label) | Get order label |
| `GET` | [`/v1/orders/{orderId}/tracking`](/en/docs/admin/fulfillment-and-shipping/orders/get-order-tracking) | Get order tracking |
| `GET` | [`/v1/orders/{orderId}/fulfillment-orders`](/en/docs/admin/fulfillment-and-shipping/orders/list-fulfillment-orders-by-order) | List fulfillment orders by order |
| `DELETE` | [`/v1/orders/{orderId}/fulfillment-orders`](/en/docs/admin/fulfillment-and-shipping/orders/cancel-fulfillment-orders-by-order) | Cancel fulfillment orders by order |
---
# Cancel fulfillment orders by order
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/orders/cancel-fulfillment-orders-by-order
## Cancel fulfillment orders by order
`DELETE /v1/orders/{orderId}/fulfillment-orders`
Lifecycle: **stable**
Required permissions (any): `shipment:update`
### Parameters
- `orderId` (path, string, required)
### Responses
- `200`: OK — application/json, integer (int32)
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/orders/{orderId}/fulfillment-orders' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Create shipment
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/orders/create-shipment
## Create shipment
`POST /v1/orders/{orderId}/shipment`
Lifecycle: **stable**
Required permissions (any): `shipment:create`
### Parameters
- `orderId` (path, string, required)
### Request body
Content-Type: `application/json`
### Responses
- `200`: OK — application/json, CreateOrderShipmentDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/orders/{orderId}/shipment' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Get order label
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/orders/get-order-label
## Get order label
`GET /v1/orders/{orderId}/label`
Lifecycle: **stable**
Required permissions (any): `shipment:read`
### Parameters
- `orderId` (path, string, required)
### Responses
- `200`: OK — application/pdf, string (byte)
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/orders/{orderId}/label' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get order tracking
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/orders/get-order-tracking
## Get order tracking
`GET /v1/orders/{orderId}/tracking`
Lifecycle: **stable**
Required permissions (any): `shipment:read`
### Parameters
- `orderId` (path, string, required)
### Responses
- `200`: OK — application/json, OrderShipmentTrackingDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/orders/{orderId}/tracking' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List fulfillment orders by order
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/orders/list-fulfillment-orders-by-order
## List fulfillment orders by order
`GET /v1/orders/{orderId}/fulfillment-orders`
Lifecycle: **stable**
Required permissions (any): `shipment:read`
### Parameters
- `orderId` (path, string, required)
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/orders/{orderId}/fulfillment-orders' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Overrides
Manage exceptions to tax rules.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/overrides
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/taxes/overrides`](/en/docs/admin/fulfillment-and-shipping/overrides/create-tax-override) | Create tax override |
| `GET` | [`/v1/taxes/overrides`](/en/docs/admin/fulfillment-and-shipping/overrides/list-tax-overrides) | List tax overrides |
| `GET` | [`/v1/taxes/overrides/{id}`](/en/docs/admin/fulfillment-and-shipping/overrides/get-tax-override) | Get tax override |
| `PUT` | [`/v1/taxes/overrides/{id}`](/en/docs/admin/fulfillment-and-shipping/overrides/update-tax-override) | Update tax override |
| `DELETE` | [`/v1/taxes/overrides/{id}`](/en/docs/admin/fulfillment-and-shipping/overrides/delete-tax-override) | Delete tax override |
---
# Create tax override
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/overrides/create-tax-override
## Create tax override
`POST /v1/taxes/overrides`
Lifecycle: **stable**
Required permissions (any): `settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `taxRegionId` (string, required)
- `name` (string, required)
- `target` (TaxOverrideTarget)
- `rate` (number (double))
- `isExempt` (boolean)
- `collectionId` (string)
- `categoryId` (string)
- `productType` (string)
- `description` (string)
### Responses
- `201`: Created — application/json, TaxOverrideDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/taxes/overrides' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete tax override
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/overrides/delete-tax-override
## Delete tax override
`DELETE /v1/taxes/overrides/{id}`
Lifecycle: **stable**
Required permissions (any): `settings:delete`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, Success
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/taxes/overrides/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get tax override
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/overrides/get-tax-override
## Get tax override
`GET /v1/taxes/overrides/{id}`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, TaxOverrideDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/taxes/overrides/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List tax overrides
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/overrides/list-tax-overrides
## List tax overrides
`GET /v1/taxes/overrides`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/taxes/overrides' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update tax override
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/overrides/update-tax-override
## Update tax override
`PUT /v1/taxes/overrides/{id}`
Lifecycle: **stable**
Required permissions (any): `settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `taxRegionId` (string, required)
- `name` (string, required)
- `target` (TaxOverrideTarget)
- `rate` (number (double))
- `isExempt` (boolean)
- `collectionId` (string)
- `categoryId` (string)
- `productType` (string)
- `description` (string)
### Responses
- `200`: OK — application/json, TaxOverrideDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/taxes/overrides/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Pickup Points
Manage locations where shoppers can pick up an order.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/pickup-points
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/shipping/pickup-points`](/en/docs/admin/fulfillment-and-shipping/pickup-points/create-pickup-point) | Create pickup point |
| `GET` | [`/v1/shipping/pickup-points`](/en/docs/admin/fulfillment-and-shipping/pickup-points/list-pickup-points) | List pickup points |
| `GET` | [`/v1/shipping/pickup-points/{id}`](/en/docs/admin/fulfillment-and-shipping/pickup-points/get-a-pickup-point-by-id) | Get a pickup point by ID |
| `PUT` | [`/v1/shipping/pickup-points/{id}`](/en/docs/admin/fulfillment-and-shipping/pickup-points/update-pickup-point) | Update pickup point |
---
# Create pickup point
Creates a pickup point where customers can collect their orders.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/pickup-points/create-pickup-point
## Create pickup point
`POST /v1/shipping/pickup-points`
Lifecycle: **stable**
Creates a pickup point where customers can collect their orders.
Required permissions (any): `settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `address` (string, required)
- `locationId` (string)
- `connectionId` (string)
- `isExternal` (boolean)
- `externalId` (string)
- `city` (string)
- `zone` (string)
- `postalCode` (string)
- `phone` (string)
- `email` (string)
- `contactPerson` (string)
- `instructions` (string)
- `deliveryTimeInMinutes` (integer (int32))
- `leadTimeInMinutes` (integer (int32))
- `schedule` (array)
- `latitude` (number (double))
- `longitude` (number (double))
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, HttpValidationProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/shipping/pickup-points' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Get a pickup point by ID
Returns one pickup point with its address and opening hours.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/pickup-points/get-a-pickup-point-by-id
## Get a pickup point by ID
`GET /v1/shipping/pickup-points/{id}`
Lifecycle: **stable**
Returns one pickup point with its address and opening hours.
Required permissions (any): `settings:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, PickupPointDetailsDto
- `400`: Bad Request — application/problem+json, HttpValidationProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/pickup-points/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List pickup points
Get a paginated list of pickup points with optional filtering
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/pickup-points/list-pickup-points
## List pickup points
`GET /v1/shipping/pickup-points`
Lifecycle: **stable**
Get a paginated list of pickup points with optional filtering
Required permissions (any): `settings:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `isActive` (query, boolean)
- `locationId` (query, string)
- `city` (query, string)
- `zone` (query, string)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfPickupPointDetailsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/pickup-points' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update pickup point
Updates a pickup point.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/pickup-points/update-pickup-point
## Update pickup point
`PUT /v1/shipping/pickup-points/{id}`
Lifecycle: **stable**
Updates a pickup point.
Required permissions (any): `settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string, required)
- `address` (string, required)
- `description` (string)
- `state` (string)
- `city` (string)
- `neighborhood` (string)
- `postalCode` (string)
- `addressNumber` (string)
- `reference` (string)
- `locationId` (string)
- `connectionId` (string)
- `isExternal` (boolean)
- `externalId` (string)
- `contactPerson` (string)
- `phone` (string)
- `email` (string)
- `instructions` (string)
- `deliveryTimeInMinutes` (integer (int32))
- `leadTimeInMinutes` (integer (int32))
- `schedule` (array)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, HttpValidationProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/shipping/pickup-points/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Profiles
Group products and rules under shipping profiles.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/profiles
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/shipping/profiles`](/en/docs/admin/fulfillment-and-shipping/profiles/create-shipping-profile) | Create shipping profile |
| `GET` | [`/v1/shipping/profiles`](/en/docs/admin/fulfillment-and-shipping/profiles/list-shipping-profiles) | List shipping profiles |
| `GET` | [`/v1/shipping/profiles/{id}`](/en/docs/admin/fulfillment-and-shipping/profiles/get-shipping-profile) | Get shipping profile |
| `PUT` | [`/v1/shipping/profiles/{id}`](/en/docs/admin/fulfillment-and-shipping/profiles/update-shipping-profile) | Update shipping profile |
| `DELETE` | [`/v1/shipping/profiles/{id}`](/en/docs/admin/fulfillment-and-shipping/profiles/delete-shipping-profile) | Delete shipping profile |
---
# Create shipping profile
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/profiles/create-shipping-profile
## Create shipping profile
`POST /v1/shipping/profiles`
Lifecycle: **stable**
Required permissions (any): `settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `description` (string)
- `locationIds` (array)
- `isDefault` (boolean)
### Responses
- `200`: OK — application/json, ShippingProfileModel
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/shipping/profiles' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete shipping profile
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/profiles/delete-shipping-profile
## Delete shipping profile
`DELETE /v1/shipping/profiles/{id}`
Lifecycle: **stable**
Required permissions (any): `settings:delete`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/shipping/profiles/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get shipping profile
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/profiles/get-shipping-profile
## Get shipping profile
`GET /v1/shipping/profiles/{id}`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, ShippingProfileModel
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/profiles/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List shipping profiles
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/profiles/list-shipping-profiles
## List shipping profiles
`GET /v1/shipping/profiles`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/profiles' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update shipping profile
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/profiles/update-shipping-profile
## Update shipping profile
`PUT /v1/shipping/profiles/{id}`
Lifecycle: **stable**
Required permissions (any): `settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `name` (string)
- `description` (string)
- `locationIds` (array)
- `isDefault` (boolean)
- `isActive` (boolean)
### Responses
- `200`: OK — application/json, ShippingProfileModel
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/shipping/profiles/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Rates
Manage shipping rates and their charging conditions.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/rates
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/shipping/rates`](/en/docs/admin/fulfillment-and-shipping/rates/create-shipping-rate) | Create shipping rate |
| `GET` | [`/v1/shipping/rates`](/en/docs/admin/fulfillment-and-shipping/rates/list-shipping-rates) | List shipping rates |
| `POST` | [`/v1/shipping/rates/available`](/en/docs/admin/fulfillment-and-shipping/rates/list-available-shipping-rates) | List available shipping rates |
| `POST` | [`/v1/shipping/rates/live-quotes`](/en/docs/admin/fulfillment-and-shipping/rates/get-live-shipping-quotes-from-carrier) | Get live shipping quotes from carrier |
| `POST` | [`/v1/shipping/rates/import`](/en/docs/admin/fulfillment-and-shipping/rates/import-shipping-rates-from-asset-or-json-rows) | Import shipping rates from asset or JSON rows |
| `GET` | [`/v1/shipping/rates/{id}`](/en/docs/admin/fulfillment-and-shipping/rates/get-shipping-rate) | Get shipping rate |
| `GET` | [`/v1/shipping/rates/template`](/en/docs/admin/fulfillment-and-shipping/rates/download-shipping-rates-import-template) | Download shipping rates import template |
| `PUT` | [`/v1/shipping/rates/{id}`](/en/docs/admin/fulfillment-and-shipping/rates/update-shipping-rate) | Update shipping rate |
| `DELETE` | [`/v1/shipping/rates/{id}`](/en/docs/admin/fulfillment-and-shipping/rates/delete-shipping-rate) | Delete shipping rate |
---
# Create shipping rate
Creates a shipping rate inside a zone: what it costs to reach that area under given conditions.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/rates/create-shipping-rate
## Create shipping rate
`POST /v1/shipping/rates`
Lifecycle: **stable**
Creates a shipping rate inside a zone: what it costs to reach that area under given conditions.
Required permissions (any): `settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `shippingMethodId` (string)
- `type` (ShippingRateType)
- `zoneCode` (string)
- `price` (number (double))
- `currency` (string)
- `minOrderPrice` (number (double))
- `maxOrderPrice` (number (double))
- `postalCodes` (array)
- `isActive` (boolean)
- `description` (string)
- `discountPercentage` (number (double))
- `minWeight` (number (double))
- `maxWeight` (number (double))
- `minValue` (number (double))
- `maxValue` (number (double))
- `basePrice` (number (double))
- `pricePerKg` (number (double))
- `pricePerUnit` (number (double))
- `taxIncluded` (boolean)
- `surcharge` (number (double))
- `metadata` (object)
### Responses
- `201`: Created — application/json, value
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/shipping/rates' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete shipping rate
Delete an existing shipping rate
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/rates/delete-shipping-rate
## Delete shipping rate
`DELETE /v1/shipping/rates/{id}`
Lifecycle: **stable**
Delete an existing shipping rate
Required permissions (any): `settings:delete`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/shipping/rates/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Download shipping rates import template
Downloads the spreadsheet template for importing shipping rates.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/rates/download-shipping-rates-import-template
## Download shipping rates import template
`GET /v1/shipping/rates/template`
Lifecycle: **stable**
Downloads the spreadsheet template for importing shipping rates.
Required permissions (any): `settings:read`
### Responses
- `200`: OK
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/rates/template' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get live shipping quotes from carrier
Get real-time shipping rate quotes from an external carrier via shipping method connection
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/rates/get-live-shipping-quotes-from-carrier
## Get live shipping quotes from carrier
`POST /v1/shipping/rates/live-quotes`
Lifecycle: **stable**
Get real-time shipping rate quotes from an external carrier via shipping method connection
Required permissions (any): `settings:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `shippingMethodId` (string)
- `countryIsoCode` (string)
- `destination` (ShipmentAddress)
- `products` (array)
- `orderAmount` (number (double))
- `currency` (string)
### Responses
- `200`: OK — application/json, ShippingQuoteResult
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/shipping/rates/live-quotes' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Get shipping rate
Get a shipping rate by ID
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/rates/get-shipping-rate
## Get shipping rate
`GET /v1/shipping/rates/{id}`
Lifecycle: **stable**
Get a shipping rate by ID
Required permissions (any): `settings:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, ShippingRateDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/rates/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Import shipping rates from asset or JSON rows
Imports shipping rates in bulk, from an uploaded file or from rows sent inline.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/rates/import-shipping-rates-from-asset-or-json-rows
## Import shipping rates from asset or JSON rows
`POST /v1/shipping/rates/import`
Lifecycle: **stable**
Imports shipping rates in bulk, from an uploaded file or from rows sent inline.
Required permissions (any): `settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `assetId` (string)
- `rows` (array)
### Responses
- `200`: OK — application/json, ShippingRateImportDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/shipping/rates/import' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# List available shipping rates
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/rates/list-available-shipping-rates
## List available shipping rates
`POST /v1/shipping/rates/available`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Request body
Content-Type: `application/json` · required
#### Fields
- `storeId` (string, required)
- `orderAmount` (number (double), required)
- `postalCode` (string, required)
- `totalWeight` (number (double), required)
- `sellerId` (string, required)
- `shippingProfileId` (string, required)
- `destination` (null | Address)
- `items` (array)
- `scheduledDate` (string (date))
- `scheduledTime` (string (time))
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/shipping/rates/available' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# List shipping rates
Get a paginated list of shipping rates with optional filtering
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/rates/list-shipping-rates
## List shipping rates
`GET /v1/shipping/rates`
Lifecycle: **stable**
Get a paginated list of shipping rates with optional filtering
Required permissions (any): `settings:read`
### Parameters
- `limit` (query, integer (int32)): Maximum number of results to return.
- `cursor` (query, string): Opaque cursor from the previous response. Omit it on the first page.
- `search` (query, string): Free-text filter. Which fields it covers depends on the resource.
- `sortBy` (query, string): Field to sort by. Accepted values depend on the resource.
- `sortDirection` (query, QueryEnumOfSortDirection): Sort direction: `asc` or `desc`.
- `shippingMethodId` (query, string)
- `isActive` (query, boolean)
- `type` (query, QueryEnumOfShippingRateType)
### Responses
- `200`: OK — application/json, CursorPaginatedItemsOfShippingRateDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/rates' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update shipping rate
Updates a shipping rate. Carts already quoted keep the price they were given.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/rates/update-shipping-rate
## Update shipping rate
`PUT /v1/shipping/rates/{id}`
Lifecycle: **stable**
Updates a shipping rate. Carts already quoted keep the price they were given.
Required permissions (any): `settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `shippingMethodId` (string)
- `type` (ShippingRateType)
- `zoneCode` (string)
- `price` (number (double))
- `currency` (string)
- `minOrderPrice` (number (double))
- `maxOrderPrice` (number (double))
- `postalCodes` (array)
- `isActive` (boolean)
- `description` (string)
- `discountPercentage` (number (double))
- `minWeight` (number (double))
- `maxWeight` (number (double))
- `minValue` (number (double))
- `maxValue` (number (double))
- `basePrice` (number (double))
- `pricePerKg` (number (double))
- `pricePerUnit` (number (double))
- `taxIncluded` (boolean)
- `surcharge` (number (double))
- `metadata` (object)
### Responses
- `204`: No Content
- `400`: Bad Request — application/problem+json, HttpValidationProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/shipping/rates/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Regions
Manage the regions used to apply taxes.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/regions
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/taxes/regions`](/en/docs/admin/fulfillment-and-shipping/regions/create-tax-region) | Create tax region |
| `GET` | [`/v1/taxes/regions`](/en/docs/admin/fulfillment-and-shipping/regions/list-tax-regions) | List tax regions |
| `GET` | [`/v1/taxes/regions/{id}`](/en/docs/admin/fulfillment-and-shipping/regions/get-tax-region) | Get tax region |
| `PUT` | [`/v1/taxes/regions/{id}`](/en/docs/admin/fulfillment-and-shipping/regions/update-tax-region) | Update tax region |
| `DELETE` | [`/v1/taxes/regions/{id}`](/en/docs/admin/fulfillment-and-shipping/regions/delete-tax-region) | Delete tax region |
---
# Create tax region
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/regions/create-tax-region
## Create tax region
`POST /v1/taxes/regions`
Lifecycle: **stable**
Required permissions (any): `settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `countryCode` (string, required): ISO 3166-1 alpha-2 country code, for example `PE`.
- `name` (string, required)
- `serviceType` (TaxServiceType)
- `isActive` (boolean)
- `rates` (array)
### Responses
- `201`: Created — application/json, TaxRegionDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request POST \
--url 'https://api.ecomiq.pe/api/v1/taxes/regions' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Delete tax region
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/regions/delete-tax-region
## Delete tax region
`DELETE /v1/taxes/regions/{id}`
Lifecycle: **stable**
Required permissions (any): `settings:delete`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, Success
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request DELETE \
--url 'https://api.ecomiq.pe/api/v1/taxes/regions/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get tax region
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/regions/get-tax-region
## Get tax region
`GET /v1/taxes/regions/{id}`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Responses
- `200`: OK — application/json, TaxRegionDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/taxes/regions/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# List tax regions
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/regions/list-tax-regions
## List tax regions
`GET /v1/taxes/regions`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Responses
- `200`: OK — application/json, array
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/taxes/regions' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update tax region
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/regions/update-tax-region
## Update tax region
`PUT /v1/taxes/regions/{id}`
Lifecycle: **stable**
Required permissions (any): `settings:update`
### Parameters
- `id` (path, string, required): Unique identifier of the resource.
### Request body
Content-Type: `application/json` · required
#### Fields
- `countryCode` (string, required): ISO 3166-1 alpha-2 country code, for example `PE`.
- `name` (string, required)
- `serviceType` (TaxServiceType)
- `isActive` (boolean)
- `rates` (array)
### Responses
- `200`: OK — application/json, TaxRegionDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/taxes/regions/{id}' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Settings
Read and update general shipping and tax settings.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/settings
| Method | Endpoint | Operation |
| --- | --- | --- |
| `GET` | [`/v1/shipping/settings`](/en/docs/admin/fulfillment-and-shipping/settings/get-shipping-settings) | Get shipping settings |
| `GET` | [`/v1/taxes/settings`](/en/docs/admin/fulfillment-and-shipping/settings/get-tax-settings) | Get tax settings |
| `PUT` | [`/v1/shipping/settings`](/en/docs/admin/fulfillment-and-shipping/settings/update-shipping-settings) | Update shipping settings |
| `PUT` | [`/v1/taxes/settings`](/en/docs/admin/fulfillment-and-shipping/settings/update-tax-settings) | Update tax settings |
---
# Get shipping settings
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/settings/get-shipping-settings
## Get shipping settings
`GET /v1/shipping/settings`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Responses
- `200`: OK — application/json, ShippingSettingsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/shipping/settings' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Get tax settings
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/settings/get-tax-settings
## Get tax settings
`GET /v1/taxes/settings`
Lifecycle: **stable**
Required permissions (any): `settings:read`
### Responses
- `200`: OK — application/json, TaxSettingsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request GET \
--url 'https://api.ecomiq.pe/api/v1/taxes/settings' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN'
```
---
# Update shipping settings
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/settings/update-shipping-settings
## Update shipping settings
`PUT /v1/shipping/settings`
Lifecycle: **stable**
Required permissions (any): `shipping_settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `defaultLocationId` (string)
- `estimatedDeliveryEnabled` (boolean)
- `estimatedDeliveryFulfillmentDays` (integer (int32))
- `pickupEnabled` (boolean)
- `localDeliveryEnabled` (boolean)
- `useLiveRates` (boolean)
### Responses
- `200`: OK — application/json, ShippingSettingsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/shipping/settings' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Update tax settings
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/settings/update-tax-settings
## Update tax settings
`PUT /v1/taxes/settings`
Lifecycle: **stable**
Required permissions (any): `settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `serviceType` (TaxServiceType)
- `serviceActive` (boolean)
- `pricesIncludeTax` (boolean)
- `chargeTaxOnShipping` (boolean)
- `chargeVatOnDigitalGoods` (boolean)
- `collectDutiesAtCheckout` (boolean)
### Responses
- `200`: OK — application/json, TaxSettingsDto
- `400`: Bad Request — application/problem+json, ProblemDetails
- `401`: Unauthorized — application/problem+json, ProblemDetails
- `403`: Forbidden — application/problem+json, ProblemDetails
- `404`: Not Found — application/problem+json, ProblemDetails
- `500`: Internal Server Error — application/problem+json, ProblemDetails
### Request
```bash
curl --request PUT \
--url 'https://api.ecomiq.pe/api/v1/taxes/settings' \
--header 'Authorization: Bearer $ECOMIQ_TOKEN' \
--header 'Content-Type: application/json' \
--data-binary @request.json
```
---
# Zones
Manage geographic shipping zones.
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/zones
| Method | Endpoint | Operation |
| --- | --- | --- |
| `POST` | [`/v1/shipping/zones`](/en/docs/admin/fulfillment-and-shipping/zones/create-shipping-zone) | Create shipping zone |
| `GET` | [`/v1/shipping/zones`](/en/docs/admin/fulfillment-and-shipping/zones/list-shipping-zones) | List shipping zones |
| `GET` | [`/v1/shipping/zones/{id}`](/en/docs/admin/fulfillment-and-shipping/zones/get-shipping-zone) | Get shipping zone |
| `PUT` | [`/v1/shipping/zones/{id}`](/en/docs/admin/fulfillment-and-shipping/zones/update-shipping-zone) | Update shipping zone |
---
# Create shipping zone
Create a new shipping zone by country, province, city, district or postal codes
Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/zones/create-shipping-zone
## Create shipping zone
`POST /v1/shipping/zones`
Lifecycle: **stable**
Create a new shipping zone by country, province, city, district or postal codes
Required permissions (any): `shipping_settings:update`
### Request body
Content-Type: `application/json` · required
#### Fields
- `code` (string)
- `name` (string)
- `description` (string)
- `countryCodes` (array)
- `provinceCodes` (array)
- `cityNames` (array)
- `districtNames` (array