# 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) - `postalCodes` (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/zones' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Get shipping zone Get a shipping zone by ID Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/zones/get-shipping-zone ## Get shipping zone `GET /v1/shipping/zones/{id}` Lifecycle: **stable** Get a shipping zone by ID Required permissions (any): `settings:read` ### Parameters - `id` (path, string, required): Unique identifier of the resource. ### Responses - `200`: OK — application/json, ShippingZoneDetailsDto - `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/zones/{id}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List shipping zones Get a paginated list of shipping zones with optional filtering Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/zones/list-shipping-zones ## List shipping zones `GET /v1/shipping/zones` Lifecycle: **stable** Get a paginated list of shipping zones 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) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfShippingZoneDetailsDto - `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/zones' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Update shipping zone Updates a shipping zone: the set of areas that share the same rates. Canonical: https://docs.ecomiq.pe/en/docs/admin/fulfillment-and-shipping/zones/update-shipping-zone ## Update shipping zone `PUT /v1/shipping/zones/{id}` Lifecycle: **stable** Updates a shipping zone: the set of areas that share the same rates. Required permissions (any): `shipping_settings:update` ### Parameters - `id` (path, string, required): Unique identifier of the resource. ### Request body Content-Type: `application/json` · required #### Fields - `code` (string) - `name` (string) - `description` (string) - `countryCodes` (array) - `provinceCodes` (array) - `cityNames` (array) - `districtNames` (array) - `postalCodes` (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/zones/{id}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Inventory Stock, reservations, availability, and inventory movements. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory - [Stock & movements](/en/docs/admin/inventory/inventory): Inspect levels and availability; adjust, reserve, release, and consume stock. --- # Stock & movements Inspect levels and availability; adjust, reserve, release, and consume stock. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/inventory`](/en/docs/admin/inventory/inventory/list-physical-inventory-levels) | List physical inventory levels | | `POST` | [`/v1/inventory/adjust`](/en/docs/admin/inventory/inventory/adjust-inventory-stock) | Adjust inventory stock | | `POST` | [`/v1/inventory/availability`](/en/docs/admin/inventory/inventory/check-availability) | Check availability | | `POST` | [`/v1/inventory/consume-reserved`](/en/docs/admin/inventory/inventory/consume-reserved-stock) | Consume reserved stock | | `POST` | [`/v1/inventory/levels`](/en/docs/admin/inventory/inventory/get-stock-levels) | Get stock levels | | `POST` | [`/v1/inventory/release`](/en/docs/admin/inventory/inventory/release-stock) | Release stock | | `POST` | [`/v1/inventory/reserve`](/en/docs/admin/inventory/inventory/reserve-stock) | Reserve stock | | `POST` | [`/v1/inventory/totals`](/en/docs/admin/inventory/inventory/get-stock-totals) | Get stock totals | | `POST` | [`/v1/inventory/exports`](/en/docs/admin/inventory/inventory/queue-an-inventory-export) | Queue an inventory export | | `POST` | [`/v1/inventory/import`](/en/docs/admin/inventory/inventory/queue-an-inventory-import) | Queue an inventory import | | `GET` | [`/v1/inventory/count`](/en/docs/admin/inventory/inventory/count-inventory-items) | Count inventory items | | `GET` | [`/v1/inventory/transactions`](/en/docs/admin/inventory/inventory/list-inventory-transactions) | List inventory transactions | | `POST` | [`/v1/inventory/batch/stock`](/en/docs/admin/inventory/inventory/queue-a-batch-inventory-stock-update) | Queue a batch inventory stock update | --- # Adjust inventory stock Changes the physical stock of a SKU by a delta and records the reason. This is the entry point for counts, losses and corrections. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/adjust-inventory-stock ## Adjust inventory stock `POST /v1/inventory/adjust` Lifecycle: **stable** Changes the physical stock of a SKU by a delta and records the reason. This is the entry point for counts, losses and corrections. Required permissions (any): `inventory:update` ### Request body Content-Type: `application/json` · required #### Fields - `variantId` (string) - `locationId` (string) - `target` (InventoryQuantityTarget) - `mode` (InventoryQuantityMode) - `quantity` (integer (int32)) - `reason` (TransactionReason) - `note` (string) - `expectedVersion` (integer (int64)) #### Example ```json { "variantId": "7204558912004325377", "locationId": "7204558912004325378", "target": "onHand", "mode": "adjust", "quantity": 5, "reason": "restock", "note": "Ingreso de cinco unidades.", "expectedVersion": 3 } ``` ### Responses - `200`: OK — application/json, InventoryLevelModel - `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/inventory/adjust' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data '{"variantId":"7204558912004325377","locationId":"7204558912004325378","target":"onHand","mode":"adjust","quantity":5,"reason":"restock","note":"Ingreso de cinco unidades.","expectedVersion":3}' ``` --- # Check availability Checks whether a set of SKUs can be fulfilled in the requested quantity. Ask before promising stock, not after. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/check-availability ## Check availability `POST /v1/inventory/availability` Lifecycle: **stable** Checks whether a set of SKUs can be fulfilled in the requested quantity. Ask before promising stock, not after. Required permissions (any): `inventory:read` ### Request body Content-Type: `application/json` · required #### Fields - `storeId` (string, required) - `locationIds` (array, required) - `variantIds` (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 POST \ --url 'https://api.ecomiq.pe/api/v1/inventory/availability' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Consume reserved stock Turns a reservation into an actual exit. Physical stock drops and the reservation closes. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/consume-reserved-stock ## Consume reserved stock `POST /v1/inventory/consume-reserved` Lifecycle: **stable** Turns a reservation into an actual exit. Physical stock drops and the reservation closes. Required permissions (any): `inventory:update` ### Request body Content-Type: `application/json` · required #### Fields - `storeId` (string, required) - `locationId` (string, required) - `locationName` (string, required) - `lines` (array, required) - `note` (string, required) - `userId` (string (uuid), required) - `userEmail` (string, required) - `userName` (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 POST \ --url 'https://api.ecomiq.pe/api/v1/inventory/consume-reserved' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Count inventory items Returns how many inventory items match a filter, without returning them. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/count-inventory-items ## Count inventory items `GET /v1/inventory/count` Lifecycle: **stable** Returns how many inventory items match a filter, without returning them. Required permissions (any): `inventory:read` ### Parameters - `search` (query, string): Free-text filter. Which fields it covers depends on the resource. - `inventoryIds` (query, array) - `locationIds` (query, array) - `brandIds` (query, array) - `categoryIds` (query, array) - `productStatus` (query, array) - `minOnHand` (query, integer (int32)) - `maxOnHand` (query, integer (int32)) - `minAvailable` (query, integer (int32)) - `maxAvailable` (query, integer (int32)) - `minCommitted` (query, integer (int32)) - `maxCommitted` (query, integer (int32)) - `isInStock` (query, boolean) ### Responses - `200`: OK — application/json, InventoryCountDto - `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/inventory/count' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get stock levels Returns the stock of specific SKUs broken down into on hand, committed and available. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/get-stock-levels ## Get stock levels `POST /v1/inventory/levels` Lifecycle: **stable** Returns the stock of specific SKUs broken down into on hand, committed and available. Required permissions (any): `inventory:read` ### Request body Content-Type: `application/json` · required #### Fields - `storeId` (string, required) - `variantIds` (array, required) - `locationIds` (array) ### 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/inventory/levels' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Get stock totals Returns stock totals across locations, without the per-location breakdown. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/get-stock-totals ## Get stock totals `POST /v1/inventory/totals` Lifecycle: **stable** Returns stock totals across locations, without the per-location breakdown. Required permissions (any): `inventory:read` ### Request body Content-Type: `application/json` · required #### Fields - `storeId` (string, required) - `variantIds` (array, required) - `locationIds` (array) ### 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/inventory/totals' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # List inventory transactions Returns the ledger of stock movements: what moved, when, why and by how much. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/list-inventory-transactions ## List inventory transactions `GET /v1/inventory/transactions` Lifecycle: **stable** Returns the ledger of stock movements: what moved, when, why and by how much. Required permissions (any): `inventory: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) - `locationId` (query, string) - `reason` (query, QueryEnumOfTransactionReason) - `referenceId` (query, string) - `fromDate` (query, string (date-time)) - `toDate` (query, string (date-time)) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfInventoryTransactionDto - `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/inventory/transactions' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List physical inventory levels Lists the physical stock of each SKU by location. Physical stock is what is on the shelf, before reservations are subtracted. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/list-physical-inventory-levels ## List physical inventory levels `GET /v1/inventory` Lifecycle: **stable** Lists the physical stock of each SKU by location. Physical stock is what is on the shelf, before reservations are subtracted. Required permissions (any): `inventory: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`. - `searchTerm` (query, string) - `inventoryIds` (query, array) - `locationIds` (query, array) - `brandIds` (query, array) - `categoryIds` (query, array) - `productStatus` (query, array) - `minOnHand` (query, integer (int32)) - `maxOnHand` (query, integer (int32)) - `minAvailable` (query, integer (int32)) - `maxAvailable` (query, integer (int32)) - `minCommitted` (query, integer (int32)) - `maxCommitted` (query, integer (int32)) - `isLowStock` (query, boolean) - `isInStock` (query, boolean) - `trackInventory` (query, boolean) - `includeTotalCount` (query, boolean) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfInventoryListDto - `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/inventory' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Queue a batch inventory stock update Queues a stock update over many SKUs. Returns a job; the write happens in the background. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/queue-a-batch-inventory-stock-update ## Queue a batch inventory stock update `POST /v1/inventory/batch/stock` Lifecycle: **stable** Queues a stock update over many SKUs. Returns a job; the write happens in the background. Required permissions (any): `inventory:update` ### Request body Content-Type: `application/json` · required #### Fields - `items` (array) - `reason` (TransactionReason) - `note` (string) ### Responses - `202`: Accepted — application/json, InventoryOperationDto - `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/inventory/batch/stock' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Queue an inventory export Queues an inventory export. Returns a job; the file becomes downloadable once it completes. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/queue-an-inventory-export ## Queue an inventory export `POST /v1/inventory/exports` Lifecycle: **stable** Queues an inventory export. Returns a job; the file becomes downloadable once it completes. Required permissions (any): `inventory:read` ### Request body Content-Type: `application/json` · required #### Fields - `format` (string) - `search` (string): Free-text filter. Which fields it covers depends on the resource. - `locationIds` (array) - `brandIds` (array) - `categoryIds` (array) - `productStatus` (array) - `minOnHand` (integer (int32)) - `maxOnHand` (integer (int32)) - `minAvailable` (integer (int32)) - `maxAvailable` (integer (int32)) - `minCommitted` (integer (int32)) - `maxCommitted` (integer (int32)) - `isLowStock` (boolean) - `isInStock` (boolean) - `template` (boolean) ### Responses - `202`: Accepted — application/json, InventoryOperationDto - `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/inventory/exports' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Queue an inventory import Queues an inventory import from a file. Returns a job you poll for progress and errors. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/queue-an-inventory-import ## Queue an inventory import `POST /v1/inventory/import` Lifecycle: **stable** Queues an inventory import from a file. Returns a job you poll for progress and errors. Required permissions (any): `inventory:update` ### Request body Content-Type: `multipart/form-data` · required #### Fields - `assetId` (string) - `reason` (TransactionReason) - `note` (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/inventory/import' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: multipart/form-data' ``` --- # Release stock Frees a reservation. The units go back to available without changing physical stock. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/release-stock ## Release stock `POST /v1/inventory/release` Lifecycle: **stable** Frees a reservation. The units go back to available without changing physical stock. Required permissions (any): `inventory:update` ### Request body Content-Type: `application/json` · required #### Fields - `storeId` (string, required) - `locationId` (string, required) - `lines` (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 POST \ --url 'https://api.ecomiq.pe/api/v1/inventory/release' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Reserve stock Holds stock for an order without removing it. Reserved units stop counting as available while the hold lasts. Canonical: https://docs.ecomiq.pe/en/docs/admin/inventory/inventory/reserve-stock ## Reserve stock `POST /v1/inventory/reserve` Lifecycle: **stable** Holds stock for an order without removing it. Reserved units stop counting as available while the hold lasts. Required permissions (any): `inventory:update` ### Request body Content-Type: `application/json` · required #### Fields - `storeId` (string, required) - `locationId` (string, required) - `lines` (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 POST \ --url 'https://api.ecomiq.pe/api/v1/inventory/reserve' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Orders Orders, drafts, statuses, and post-purchase operations. Canonical: https://docs.ecomiq.pe/en/docs/admin/orders - [Carts](/en/docs/admin/orders/carts): Inspect carts and their pickup options from back-office operations. - [Order Bumps](/en/docs/admin/orders/order-bumps): Manage add-on offers shown during checkout. - [Order Drafts](/en/docs/admin/orders/order-drafts): Create, update, share, and convert order drafts. - [Orders](/en/docs/admin/orders/orders): Inspect orders and manage statuses, invoicing, notes, claims, returns, and items. --- # Carts Inspect carts and their pickup options from back-office operations. Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/carts | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/carts`](/en/docs/admin/orders/carts/list-carts) | List carts | | `GET` | [`/v1/carts/{cartId}`](/en/docs/admin/orders/carts/get-cart) | Get cart | | `GET` | [`/v1/carts/shipping/pickup-options`](/en/docs/admin/orders/carts/get-pickup-options-for-checkout) | Get pickup options for checkout | --- # Get cart Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/carts/get-cart ## Get cart `GET /v1/carts/{cartId}` Lifecycle: **stable** Required permissions (any): `order:read` ### Parameters - `cartId` (path, string, required) ### Responses - `200`: OK — application/json, CartDetailsDto - `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/carts/{cartId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get pickup options for checkout Returns the pickup points the shopper can collect from, as an alternative to delivery. Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/carts/get-pickup-options-for-checkout ## Get pickup options for checkout `GET /v1/carts/shipping/pickup-options` Lifecycle: **stable** Returns the pickup points the shopper can collect from, as an alternative to delivery. ### Parameters - `ShippingMethodId` (query, string, required) ### Responses - `200`: OK — application/json, PickupOptionsDto - `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/carts/shipping/pickup-options' ``` --- # List carts Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/carts/list-carts ## List carts `GET /v1/carts` Lifecycle: **stable** Required permissions (any): `order: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`. - `status` (query, array) - `email` (query, string) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfCartListItemDto - `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/carts' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Order Bumps Manage add-on offers shown during checkout. Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-bumps | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/order-bumps`](/en/docs/admin/orders/order-bumps/create-order-bump) | Create order bump | | `GET` | [`/v1/order-bumps`](/en/docs/admin/orders/order-bumps/list-order-bumps) | List order bumps | | `GET` | [`/v1/order-bumps/{orderBumpId}`](/en/docs/admin/orders/order-bumps/get-order-bump) | Get order bump | | `PUT` | [`/v1/order-bumps/{orderBumpId}`](/en/docs/admin/orders/order-bumps/update-order-bump) | Update order bump | | `DELETE` | [`/v1/order-bumps/{orderBumpId}`](/en/docs/admin/orders/order-bumps/delete-order-bump) | Delete order bump | --- # Create order bump Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-bumps/create-order-bump ## Create order bump `POST /v1/order-bumps` Lifecycle: **stable** Required permissions (any): `promotion:create` ### Request body Content-Type: `application/json` · required #### Fields - `name` (string, required) - `description` (string, required) - `status` (OrderBumpStatus, required) - `productId` (string, required) - `variantId` (string, required) - `offerPrice` (number (double), required) - `minimumCartSubtotal` (number (double), required) - `priority` (integer (int32), required) - `maxPerCart` (integer (int32), required) - `startsAt` (string (date-time), required) - `endsAt` (string (date-time), required) - `badgeLabel` (string, required) - `callToAction` (string, required) ### 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 - `500`: Internal Server Error — application/problem+json, ProblemDetails ### Request ```bash curl --request POST \ --url 'https://api.ecomiq.pe/api/v1/order-bumps' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Delete order bump Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-bumps/delete-order-bump ## Delete order bump `DELETE /v1/order-bumps/{orderBumpId}` Lifecycle: **stable** Required permissions (any): `promotion:update` ### Parameters - `orderBumpId` (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/order-bumps/{orderBumpId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get order bump Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-bumps/get-order-bump ## Get order bump `GET /v1/order-bumps/{orderBumpId}` Lifecycle: **stable** Required permissions (any): `promotion:read` ### Parameters - `orderBumpId` (path, string, required) ### Responses - `200`: OK — application/json, OrderBumpDto - `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/order-bumps/{orderBumpId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List order bumps Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-bumps/list-order-bumps ## List order bumps `GET /v1/order-bumps` Lifecycle: **stable** Required permissions (any): `promotion: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/order-bumps' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Update order bump Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-bumps/update-order-bump ## Update order bump `PUT /v1/order-bumps/{orderBumpId}` Lifecycle: **stable** Required permissions (any): `promotion:update` ### Parameters - `orderBumpId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `name` (string, required) - `description` (string, required) - `status` (OrderBumpStatus, required) - `productId` (string, required) - `variantId` (string, required) - `offerPrice` (number (double), required) - `minimumCartSubtotal` (number (double), required) - `priority` (integer (int32), required) - `maxPerCart` (integer (int32), required) - `startsAt` (string (date-time), required) - `endsAt` (string (date-time), required) - `badgeLabel` (string, required) - `callToAction` (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 PUT \ --url 'https://api.ecomiq.pe/api/v1/order-bumps/{orderBumpId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Order Drafts Create, update, share, and convert order drafts. Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/order-drafts`](/en/docs/admin/orders/order-drafts/create-order-draft) | Create order draft | | `GET` | [`/v1/order-drafts`](/en/docs/admin/orders/order-drafts/list-order-drafts) | List order drafts | | `GET` | [`/v1/order-drafts/{draftId}`](/en/docs/admin/orders/order-drafts/get-order-draft) | Get order draft | | `PATCH` | [`/v1/order-drafts/{draftId}`](/en/docs/admin/orders/order-drafts/update-order-draft) | Update order draft | | `POST` | [`/v1/order-drafts/{draftId}/convert`](/en/docs/admin/orders/order-drafts/convert-order-draft-to-order) | Convert order draft to order | | `POST` | [`/v1/order-drafts/{draftId}/share`](/en/docs/admin/orders/order-drafts/create-order-draft-share-link) | Create order draft share link | | `POST` | [`/v1/order-drafts/{draftId}/cancel`](/en/docs/admin/orders/order-drafts/cancel-order-draft) | Cancel order draft | | `GET` | [`/v1/order-drafts/{draftId}/shipping-options`](/en/docs/admin/orders/order-drafts/list-order-draft-shipping-options) | List order draft shipping options | | `PATCH` | [`/v1/order-drafts/{draftId}/status`](/en/docs/admin/orders/order-drafts/update-order-draft-status) | Update order draft status | ### Items | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/order-drafts/{draftId}/items`](/en/docs/admin/orders/order-drafts/add-item-to-order-draft) | Add item to order draft | | `PATCH` | [`/v1/order-drafts/{draftId}/items/{itemId}`](/en/docs/admin/orders/order-drafts/update-order-draft-item) | Update order draft item | | `DELETE` | [`/v1/order-drafts/{draftId}/items/{itemId}`](/en/docs/admin/orders/order-drafts/remove-item-from-order-draft) | Remove item from order draft | ### Shipping Method | Method | Endpoint | Operation | | --- | --- | --- | | `PUT` | [`/v1/order-drafts/{draftId}/shipping-method`](/en/docs/admin/orders/order-drafts/set-order-draft-shipping-method) | Set order draft shipping method | | `DELETE` | [`/v1/order-drafts/{draftId}/shipping-method`](/en/docs/admin/orders/order-drafts/clear-order-draft-shipping-method) | Clear order draft shipping method | --- # Add item to order draft Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/add-item-to-order-draft ## Add item to order draft `POST /v1/order-drafts/{draftId}/items` Lifecycle: **stable** Required permissions (any): `draft:update` ### Parameters - `draftId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `variantId` (string) - `title` (string) - `subtitle` (string) - `thumbnail` (string) - `quantity` (integer (int32), required) - `unitPrice` (number (double)) - `discount` (number (double)) - `shipping` (number (double)) - `tax` (number (double)) - `warranty` (number (double)) - `requiresShipping` (boolean) - `isTaxInclusive` (boolean) - `metadata` (object) ### Responses - `200`: OK — application/json, OrderDraftDetailsDto - `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/order-drafts/{draftId}/items' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Cancel order draft Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/cancel-order-draft ## Cancel order draft `POST /v1/order-drafts/{draftId}/cancel` Lifecycle: **stable** Required permissions (any): `draft:update` ### Parameters - `draftId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `reason` (string, required) ### Responses - `200`: OK — application/json, OrderDraftDetailsDto - `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/order-drafts/{draftId}/cancel' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Clear order draft shipping method Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/clear-order-draft-shipping-method ## Clear order draft shipping method `DELETE /v1/order-drafts/{draftId}/shipping-method` Lifecycle: **stable** Required permissions (any): `draft:update` ### Parameters - `draftId` (path, string, required) - `sellerId` (query, string) - `shippingProfileId` (query, string) ### Responses - `200`: OK — application/json, OrderDraftDetailsDto - `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/order-drafts/{draftId}/shipping-method' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Convert order draft to order Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/convert-order-draft-to-order ## Convert order draft to order `POST /v1/order-drafts/{draftId}/convert` Lifecycle: **stable** Required permissions (any): `draft:update` ### Parameters - `draftId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `invoiceType` (string) ### Responses - `200`: OK — application/json, OrderDraftConversionDto - `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/order-drafts/{draftId}/convert' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Create order draft Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/create-order-draft ## Create order draft `POST /v1/order-drafts` Lifecycle: **stable** Required permissions (any): `draft:create` ### Request body Content-Type: `application/json` · required #### Fields - `currencyCode` (string, required): ISO 4217 currency code, for example `PEN`. - `customerId` (string, required) - `cartId` (string, required) - `email` (string, required) - `phone` (string, required) - `firstName` (string, required) - `lastName` (string, required) - `identificationType` (string, required) - `identificationNumber` (string, required) - `entityTaxId` (string, required) - `entityName` (string, required) - `source` (string, required) - `notes` (string, required) ### Responses - `201`: Created — application/json, CreateOrderDraftDto - `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/order-drafts' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Create order draft share link Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/create-order-draft-share-link ## Create order draft share link `POST /v1/order-drafts/{draftId}/share` Lifecycle: **stable** Required permissions (any): `draft:update` ### Parameters - `draftId` (path, string, required) ### Request body Content-Type: `application/json` ### Responses - `200`: OK — application/json, OrderDraftShareDto - `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/order-drafts/{draftId}/share' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Get order draft Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/get-order-draft ## Get order draft `GET /v1/order-drafts/{draftId}` Lifecycle: **stable** Required permissions (any): `draft:read` ### Parameters - `draftId` (path, string, required) ### Responses - `200`: OK — application/json, OrderDraftDetailsDto - `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/order-drafts/{draftId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List order draft shipping options Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/list-order-draft-shipping-options ## List order draft shipping options `GET /v1/order-drafts/{draftId}/shipping-options` Lifecycle: **stable** Required permissions (any): `draft:read` ### Parameters - `draftId` (path, string, required) - `sellerId` (query, string) - `shippingProfileId` (query, string) - `scheduledDate` (query, string (date)) - `scheduledTime` (query, 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 GET \ --url 'https://api.ecomiq.pe/api/v1/order-drafts/{draftId}/shipping-options' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List order drafts Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/list-order-drafts ## List order drafts `GET /v1/order-drafts` Lifecycle: **stable** Required permissions (any): `draft: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`. - `status` (query, array) - `customerId` (query, string) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfOrderDraftListItemDto - `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/order-drafts' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Remove item from order draft Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/remove-item-from-order-draft ## Remove item from order draft `DELETE /v1/order-drafts/{draftId}/items/{itemId}` Lifecycle: **stable** Required permissions (any): `draft:update` ### Parameters - `draftId` (path, string, required) - `itemId` (path, string, required) ### Responses - `200`: OK — application/json, OrderDraftDetailsDto - `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/order-drafts/{draftId}/items/{itemId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Set order draft shipping method Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/set-order-draft-shipping-method ## Set order draft shipping method `PUT /v1/order-drafts/{draftId}/shipping-method` Lifecycle: **stable** Required permissions (any): `draft:update` ### Parameters - `draftId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `sellerId` (string) - `shippingProfileId` (string) - `shippingMethodId` (string) - `rateId` (string) - `locationId` (string) - `pickupPointId` (string) - `scheduledDate` (string (date)) - `scheduledTime` (string (time)) - `serviceCode` (string) ### Responses - `200`: OK — application/json, OrderDraftDetailsDto - `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/order-drafts/{draftId}/shipping-method' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update order draft Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/update-order-draft ## Update order draft `PATCH /v1/order-drafts/{draftId}` Lifecycle: **stable** Required permissions (any): `draft:update` ### Parameters - `draftId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `customerId` (string) - `cartId` (string) - `email` (string) - `phone` (string) - `firstName` (string) - `lastName` (string) - `identificationType` (string) - `identificationNumber` (string) - `entityTaxId` (string) - `entityName` (string) - `source` (string) - `notes` (string) - `paymentMethod` (string) - `paymentCode` (string) - `shippingAddress` (null | OrderDraftAddressRequest) - `billingAddress` (null | OrderDraftAddressRequest) - `metadata` (object) ### Responses - `200`: OK — application/json, OrderDraftDetailsDto - `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/order-drafts/{draftId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update order draft item Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/update-order-draft-item ## Update order draft item `PATCH /v1/order-drafts/{draftId}/items/{itemId}` Lifecycle: **stable** Required permissions (any): `draft:update` ### Parameters - `draftId` (path, string, required) - `itemId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `quantity` (integer (int32)) - `unitPrice` (number (double)) - `discount` (number (double)) - `shipping` (number (double)) - `tax` (number (double)) - `warranty` (number (double)) - `requiresShipping` (boolean) - `isTaxInclusive` (boolean) - `metadata` (object) ### Responses - `200`: OK — application/json, OrderDraftDetailsDto - `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/order-drafts/{draftId}/items/{itemId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update order draft status Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/order-drafts/update-order-draft-status ## Update order draft status `PATCH /v1/order-drafts/{draftId}/status` Lifecycle: **stable** Required permissions (any): `draft:update` ### Parameters - `draftId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `status` (OrderDraftStatus, required) ### Responses - `200`: OK — application/json, OrderDraftDetailsDto - `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/order-drafts/{draftId}/status' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Orders Inspect orders and manage statuses, invoicing, notes, claims, returns, and items. Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/orders`](/en/docs/admin/orders/orders/list-orders) | List orders | | `POST` | [`/v1/orders/package-status`](/en/docs/admin/orders/orders/set-order-package-status) | Set order package status | | `POST` | [`/v1/orders/schedule-count`](/en/docs/admin/orders/orders/get-order-schedule-count) | Get order schedule count | | `POST` | [`/v1/orders/shipment`](/en/docs/admin/orders/orders/update-order-shipment) | Update order shipment | | `POST` | [`/v1/orders/exports`](/en/docs/admin/orders/orders/queue-an-orders-export) | Queue an orders export | | `GET` | [`/v1/orders/{orderId}`](/en/docs/admin/orders/orders/get-order) | Get order | | `POST` | [`/v1/orders/{orderId}/confirm`](/en/docs/admin/orders/orders/confirm-order) | Confirm order | | `POST` | [`/v1/orders/{orderId}/custom-status`](/en/docs/admin/orders/orders/add-order-custom-status) | Add order custom status | | `POST` | [`/v1/orders/{orderId}/delivery`](/en/docs/admin/orders/orders/deliver-order) | Deliver order | | `POST` | [`/v1/orders/{orderId}/in-progress`](/en/docs/admin/orders/orders/set-order-in-progress) | Set order in progress | | `POST` | [`/v1/orders/{orderId}/in-transit`](/en/docs/admin/orders/orders/set-order-in-transit) | Set order in transit | | `POST` | [`/v1/orders/{orderId}/invalidate`](/en/docs/admin/orders/orders/invalidate-order) | Invalidate order | | `POST` | [`/v1/orders/{orderId}/invoice`](/en/docs/admin/orders/orders/invoice-order) | Invoice order | | `POST` | [`/v1/orders/{orderId}/ready-to-pickup`](/en/docs/admin/orders/orders/set-order-ready-to-pick-up) | Set order ready to pick up | | `POST` | [`/v1/orders/{orderId}/return`](/en/docs/admin/orders/orders/return-order) | Return order | | `POST` | [`/v1/orders/status/batch`](/en/docs/admin/orders/orders/queue-a-batch-order-status-update) | Queue a batch order status update | | `POST` | [`/v1/orders/{orderId}/cancel`](/en/docs/admin/orders/orders/cancel-order) | Cancel order | | `POST` | [`/v1/orders/{orderId}/close`](/en/docs/admin/orders/orders/close-order) | Close order | | `GET` | [`/v1/orders/{orderId}/activity`](/en/docs/admin/orders/orders/list-order-activity) | List order activity | | `GET` | [`/v1/orders/group/{orderGroup}`](/en/docs/admin/orders/orders/get-orders-by-group) | Get orders by group | | `GET` | [`/v1/orders/{orderId}/packages`](/en/docs/admin/orders/orders/list-order-packages) | List order packages | | `GET` | [`/v1/orders/{orderId}/transactions`](/en/docs/admin/orders/orders/list-order-transactions) | List order transactions | | `PUT` | [`/v1/orders/{orderId}/return-status`](/en/docs/admin/orders/orders/update-order-return-status) | Update order return status | | `PATCH` | [`/v1/orders/{orderId}/notes`](/en/docs/admin/orders/orders/update-order-notes) | Update order notes | ### Batch | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/orders/batch`](/en/docs/admin/orders/orders/create-orders) | Create orders | | `PATCH` | [`/v1/orders/batch/conciliation`](/en/docs/admin/orders/orders/batch-update-order-conciliation) | Batch update order conciliation | ### Claims | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/orders/claims`](/en/docs/admin/orders/orders/list-order-claims) | List order claims | | `POST` | [`/v1/orders/{orderId}/claims`](/en/docs/admin/orders/orders/create-order-claim) | Create order claim | | `GET` | [`/v1/orders/claims/{claimId}`](/en/docs/admin/orders/orders/get-order-claim) | Get order claim | | `POST` | [`/v1/orders/claims/{claimId}/notes`](/en/docs/admin/orders/orders/add-order-claim-note) | Add order claim note | | `PATCH` | [`/v1/orders/claims/{claimId}/status`](/en/docs/admin/orders/orders/update-order-claim-status) | Update order claim status | ### Items | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/orders/items`](/en/docs/admin/orders/orders/list-order-items) | List order items | | `POST` | [`/v1/orders/items/spreadsheet/save`](/en/docs/admin/orders/orders/save-order-item-spreadsheet) | Save order item spreadsheet | | `POST` | [`/v1/orders/{orderId}/items/{itemId}/cancel`](/en/docs/admin/orders/orders/cancel-order-item) | Cancel order item | | `POST` | [`/v1/orders/{orderId}/items/{itemId}/delivery`](/en/docs/admin/orders/orders/deliver-order-item) | Deliver order item | | `POST` | [`/v1/orders/{orderId}/items/{itemId}/in-transit`](/en/docs/admin/orders/orders/set-order-item-in-transit) | Set order item in transit | | `POST` | [`/v1/orders/{orderId}/items/{itemId}/invoice`](/en/docs/admin/orders/orders/invoice-order-item) | Invoice order item | | `POST` | [`/v1/orders/{orderId}/items/{itemId}/return`](/en/docs/admin/orders/orders/return-order-item) | Return order item | ### Spreadsheet | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/orders/spreadsheet`](/en/docs/admin/orders/orders/create-order-spreadsheet) | Create order spreadsheet | | `GET` | [`/v1/orders/spreadsheet/{id}`](/en/docs/admin/orders/orders/get-order-spreadsheet) | Get order spreadsheet | --- # Add order claim note Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/add-order-claim-note ## Add order claim note `POST /v1/orders/claims/{claimId}/notes` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `claimId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `note` (string, required) ### Responses - `200`: OK — application/json, OrderClaimDetailsDto - `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/claims/{claimId}/notes' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Add order custom status Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/add-order-custom-status ## Add order custom status `POST /v1/orders/{orderId}/custom-status` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `status` (string, required) - `comment` (string, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/custom-status' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Batch update order conciliation Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/batch-update-order-conciliation ## Batch update order conciliation `PATCH /v1/orders/batch/conciliation` Lifecycle: **stable** Required permissions (any): `order:update` ### Request body Content-Type: `application/json` · required #### Fields - `orderIds` (array) - `orderNumbers` (array) - `conciliated` (boolean) - `conciliationAt` (string (date-time)) ### Responses - `200`: OK — application/json, BatchOrderConciliationDto - `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/orders/batch/conciliation' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Cancel order Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/cancel-order ## Cancel order `POST /v1/orders/{orderId}/cancel` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `cancelReason` (string, required) - `cancelReasonType` (string, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/cancel' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Cancel order item Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/cancel-order-item ## Cancel order item `POST /v1/orders/{orderId}/items/{itemId}/cancel` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) - `itemId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `cancelReason` (string, required) - `cancelReasonType` (string, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/items/{itemId}/cancel' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Close order Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/close-order ## Close order `POST /v1/orders/{orderId}/close` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/close' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Confirm order Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/confirm-order ## Confirm order `POST /v1/orders/{orderId}/confirm` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/confirm' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Create order claim Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/create-order-claim ## Create order claim `POST /v1/orders/{orderId}/claims` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `type` (OrderClaimType, required) - `subject` (string, required) - `description` (string, required) - `contactEmail` (string, required) - `contactPhone` (string, required) ### Responses - `200`: OK — application/json, OrderClaimDetailsDto - `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}/claims' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Create order spreadsheet Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/create-order-spreadsheet ## Create order spreadsheet `POST /v1/orders/spreadsheet` Lifecycle: **stable** Required permissions (any): `order:read` ### Request body Content-Type: `application/json` · required #### Fields - `ids` (array) - `filters` (null | OrderSpreadsheetFilters) - `pageSize` (integer (int32)) - `maxRows` (integer (int32)) ### Responses - `200`: OK — application/json, OrderSpreadsheetDto - `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/spreadsheet' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Create orders Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/create-orders ## Create orders `POST /v1/orders/batch` Lifecycle: **stable** Required permissions (any): `order:create` ### Request body Content-Type: `application/json` · required #### Fields - `orders` (array, required) - `paymentRequest` (null | CreateOrderPaymentRequestModel) ### Responses - `200`: OK — application/json, CreateOrderResult - `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/batch' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Deliver order Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/deliver-order ## Deliver order `POST /v1/orders/{orderId}/delivery` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `trackingNumber` (string, required) - `trackingLink` (string, required) - `carrierName` (string) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/delivery' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Deliver order item Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/deliver-order-item ## Deliver order item `POST /v1/orders/{orderId}/items/{itemId}/delivery` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) - `itemId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `quantity` (number (double), required) - `trackingNumber` (string, required) - `trackingLink` (string, required) - `carrierName` (string) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/items/{itemId}/delivery' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Get order Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/get-order ## Get order `GET /v1/orders/{orderId}` Lifecycle: **stable** Required permissions (any): `order:read` ### Parameters - `orderId` (path, string, required) - `include` (query, string) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get order claim Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/get-order-claim ## Get order claim `GET /v1/orders/claims/{claimId}` Lifecycle: **stable** Required permissions (any): `order:read` ### Parameters - `claimId` (path, string, required) ### Responses - `200`: OK — application/json, OrderClaimDetailsDto - `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/claims/{claimId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get order schedule count Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/get-order-schedule-count ## Get order schedule count `POST /v1/orders/schedule-count` Lifecycle: **stable** Required permissions (any): `order:read` ### Request body Content-Type: `application/json` · required #### Fields - `storeId` (string, required) - `scheduledDate` (string (date), required) - `locationId` (string, required) - `pickupPointId` (string, required) ### Responses - `200`: OK — application/json, OrderScheduleCountDto - `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/schedule-count' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Get order spreadsheet Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/get-order-spreadsheet ## Get order spreadsheet `GET /v1/orders/spreadsheet/{id}` Lifecycle: **stable** Required permissions (any): `order: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, CursorPaginatedItemsOfOrderItemListItemDto - `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/spreadsheet/{id}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get orders by group Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/get-orders-by-group ## Get orders by group `GET /v1/orders/group/{orderGroup}` Lifecycle: **stable** Required permissions (any): `order:read` ### Parameters - `orderGroup` (path, string, required) ### Responses - `200`: OK — application/json, OrderGroupDetailsDto - `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/group/{orderGroup}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Invalidate order Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/invalidate-order ## Invalidate order `POST /v1/orders/{orderId}/invalidate` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/invalidate' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Invoice order Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/invoice-order ## Invoice order `POST /v1/orders/{orderId}/invoice` Lifecycle: **stable** Required permissions (any): `invoice:create` ### Parameters - `orderId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `invoiceNumber` (string, required) - `invoiceLink` (string, required) - `comment` (string, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/invoice' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Invoice order item Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/invoice-order-item ## Invoice order item `POST /v1/orders/{orderId}/items/{itemId}/invoice` Lifecycle: **stable** Required permissions (any): `invoice:create` ### Parameters - `orderId` (path, string, required) - `itemId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `invoiceNumber` (string, required) - `invoiceLink` (string, required) - `comment` (string, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/items/{itemId}/invoice' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # List order activity Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/list-order-activity ## List order activity `GET /v1/orders/{orderId}/activity` Lifecycle: **stable** Required permissions (any): `order: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}/activity' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List order claims Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/list-order-claims ## List order claims `GET /v1/orders/claims` Lifecycle: **stable** Required permissions (any): `order: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) - `status` (query, QueryEnumOfOrderClaimStatus) - `type` (query, QueryEnumOfOrderClaimType) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfOrderClaimListItemDto - `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/claims' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List order items Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/list-order-items ## List order items `GET /v1/orders/items` Lifecycle: **stable** Required permissions (any): `order: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`. - `status` (query, array) - `state` (query, array) - `fulfillmentStatus` (query, array) - `returnStatus` (query, array) - `itemStatus` (query, array) - `locationId` (query, string) - `orderIds` (query, array) - `itemIds` (query, array) - `customerId` (query, string) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfOrderItemListItemDto - `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/items' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List order packages Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/list-order-packages ## List order packages `GET /v1/orders/{orderId}/packages` Lifecycle: **stable** Required permissions (any): `order: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}/packages' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List order transactions Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/list-order-transactions ## List order transactions `GET /v1/orders/{orderId}/transactions` Lifecycle: **stable** Required permissions (any): `order: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}/transactions' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List orders Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/list-orders ## List orders `GET /v1/orders` Lifecycle: **stable** Required permissions (any): `order: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`. - `status` (query, array) - `state` (query, array) - `fulfillmentStatus` (query, array) - `returnStatus` (query, array) - `locationId` (query, string) - `orderIds` (query, array) - `customerId` (query, string) - `conciliated` (query, boolean) - `dateFrom` (query, string (date-time)) - `dateTo` (query, string (date-time)) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfOrderListItemDto - `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' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Queue a batch order status update Queues a status change over many orders. Returns a job; transitions that are not valid for an order are reported per order. Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/queue-a-batch-order-status-update ## Queue a batch order status update `POST /v1/orders/status/batch` Lifecycle: **stable** Queues a status change over many orders. Returns a job; transitions that are not valid for an order are reported per order. Required permissions (any): `order:update` ### Request body Content-Type: `application/json` · required #### Fields - `targetStatus` (OrderStatus, required) - `search` (string): Free-text filter. Which fields it covers depends on the resource. - `status` (null | OrderStatus) - `state` (null | OrderState) - `fulfillmentStatus` (null | OrderFulfillmentStatus) - `returnStatus` (null | OrderReturnStatus) - `locationId` (string) - `customerId` (string) - `conciliated` (boolean) - `dateFrom` (string (date-time)) - `dateTo` (string (date-time)) - `orderIds` (array) - `orderNumbers` (array) - `comment` (string) - `trackingNumber` (string) - `trackingLink` (string) - `carrierName` (string) - `invoiceNumber` (string) - `invoiceLink` (string) - `cancelReason` (string) - `cancelReasonType` (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/orders/status/batch' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Queue an orders export Queues an order export. Returns a job; the file becomes downloadable once it completes. Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/queue-an-orders-export ## Queue an orders export `POST /v1/orders/exports` Lifecycle: **stable** Queues an order export. Returns a job; the file becomes downloadable once it completes. Required permissions (any): `order: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` (null | OrderStatus) - `state` (null | OrderState) - `fulfillmentStatus` (null | OrderFulfillmentStatus) - `returnStatus` (null | OrderReturnStatus) - `locationId` (string) - `customerId` (string) - `conciliated` (boolean) - `dateFrom` (string (date-time)) - `dateTo` (string (date-time)) - `orderIds` (array) - `orderNumbers` (array) ### 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/orders/exports' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Return order Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/return-order ## Return order `POST /v1/orders/{orderId}/return` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `trackingNumber` (string, required) - `trackingLink` (string, required) - `comment` (string, required) - `evidenceUrls` (array, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/return' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Return order item Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/return-order-item ## Return order item `POST /v1/orders/{orderId}/items/{itemId}/return` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) - `itemId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `quantity` (number (double), required) - `trackingNumber` (string, required) - `trackingLink` (string, required) - `comment` (string, required) - `evidenceUrls` (array, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/items/{itemId}/return' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Save order item spreadsheet Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/save-order-item-spreadsheet ## Save order item spreadsheet `POST /v1/orders/items/spreadsheet/save` Lifecycle: **stable** Required permissions (any): `order: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/orders/items/spreadsheet/save' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Set order in progress Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/set-order-in-progress ## Set order in progress `POST /v1/orders/{orderId}/in-progress` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `comment` (string, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/in-progress' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Set order in transit Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/set-order-in-transit ## Set order in transit `POST /v1/orders/{orderId}/in-transit` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `trackingNumber` (string, required) - `trackingLink` (string, required) - `carrierName` (string) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/in-transit' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Set order item in transit Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/set-order-item-in-transit ## Set order item in transit `POST /v1/orders/{orderId}/items/{itemId}/in-transit` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) - `itemId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `trackingNumber` (string, required) - `trackingLink` (string, required) - `carrierName` (string) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/items/{itemId}/in-transit' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Set order package status Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/set-order-package-status ## Set order package status `POST /v1/orders/package-status` Lifecycle: **stable** Required permissions (any): `order:update` ### Request body Content-Type: `application/json` · required #### Fields - `trackingNumber` (string, required) - `state` (OrderPackageState, required) ### 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 POST \ --url 'https://api.ecomiq.pe/api/v1/orders/package-status' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Set order ready to pick up Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/set-order-ready-to-pick-up ## Set order ready to pick up `POST /v1/orders/{orderId}/ready-to-pickup` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `trackingNumber` (string, required) - `trackingLink` (string, required) - `carrierName` (string, required) - `comment` (string, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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}/ready-to-pickup' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update order claim status Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/update-order-claim-status ## Update order claim status `PATCH /v1/orders/claims/{claimId}/status` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `claimId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `status` (OrderClaimStatus, required) - `resolution` (string, required) ### Responses - `200`: OK — application/json, OrderClaimDetailsDto - `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/orders/claims/{claimId}/status' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update order notes Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/update-order-notes ## Update order notes `PATCH /v1/orders/{orderId}/notes` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `notes` (string, required) - `userAssigned` (string, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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/orders/{orderId}/notes' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update order return status Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/update-order-return-status ## Update order return status `PUT /v1/orders/{orderId}/return-status` Lifecycle: **stable** Required permissions (any): `order:update` ### Parameters - `orderId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `status` (null | OrderReturnStatus, required) - `comment` (string, required) ### Responses - `200`: OK — application/json, OrderDetailsDto - `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/orders/{orderId}/return-status' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update order shipment Canonical: https://docs.ecomiq.pe/en/docs/admin/orders/orders/update-order-shipment ## Update order shipment `POST /v1/orders/shipment` Lifecycle: **stable** Required permissions (any): `order:update` ### Request body Content-Type: `application/json` · required #### Fields - `storeId` (string, required) - `orderId` (string, required) - `trackingNumber` (string, required) - `trackingLink` (string, required) - `carrierName` (string, required) - `from` (string, required) - `to` (string, required) - `serviceType` (string, required) - `serviceCost` (number (double), required) - `state` (OrderPackageState, required) - `items` (array, required) ### 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 POST \ --url 'https://api.ecomiq.pe/api/v1/orders/shipment' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Payments & Finance Billing, credits, payment operations, sellers, and commissions. Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance - [Billing](/en/docs/admin/payments-and-finance/billing): Inspect plan usage and manage credits and billing flows. - [Payments](/en/docs/admin/payments-and-finance/payments): Inspect methods and perform captures, cancellations, and refunds. - [Sellers](/en/docs/admin/payments-and-finance/sellers): Manage sellers, commissions, members, invitations, roles, and permissions. --- # Billing Inspect plan usage and manage credits and billing flows. Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/billing/plans`](/en/docs/admin/payments-and-finance/billing/list-available-billing-plans) | List available billing plans | | `POST` | [`/v1/billing/current/plan-purchases`](/en/docs/admin/payments-and-finance/billing/create-a-billing-plan-purchase) | Create a billing plan purchase | | `GET` | [`/v1/billing/current/history`](/en/docs/admin/payments-and-finance/billing/list-current-billing-history) | List current billing history | | `GET` | [`/v1/billing/current/subscription`](/en/docs/admin/payments-and-finance/billing/get-the-current-billing-subscription) | Get the current billing subscription | | `GET` | [`/v1/billing/current/usage`](/en/docs/admin/payments-and-finance/billing/get-current-billing-usage) | Get current billing usage | | `POST` | [`/v1/billing/current/ai-credits/checkouts`](/en/docs/admin/payments-and-finance/billing/create-an-ai-credit-checkout) | Create an AI credit checkout | | `POST` | [`/v1/billing/current/subscription/cancel`](/en/docs/admin/payments-and-finance/billing/cancel-the-current-billing-subscription) | Cancel the current billing subscription | | `GET` | [`/v1/billing/current/ai-credits/activity`](/en/docs/admin/payments-and-finance/billing/list-ai-credit-activity) | List AI credit activity | | `GET` | [`/v1/billing/current/ai-credits/balance`](/en/docs/admin/payments-and-finance/billing/get-the-current-ai-credit-balance) | Get the current AI credit balance | | `GET` | [`/v1/billing/current/ai-credits/catalog`](/en/docs/admin/payments-and-finance/billing/get-the-current-ai-credit-catalog) | Get the current AI credit catalog | | `GET` | [`/v1/billing/current/checkouts/{sessionId}`](/en/docs/admin/payments-and-finance/billing/get-an-active-billing-checkout) | Get an active billing checkout | | `POST` | [`/v1/billing/current/checkouts/{sessionId}/confirm`](/en/docs/admin/payments-and-finance/billing/confirm-an-embedded-billing-checkout) | Confirm an embedded billing checkout | --- # Cancel the current billing subscription Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing/cancel-the-current-billing-subscription ## Cancel the current billing subscription `POST /v1/billing/current/subscription/cancel` Lifecycle: **stable** Required permissions (any): `billing:manage` ### Responses - `200`: OK — application/json, BillingSubscriptionDto - `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/billing/current/subscription/cancel' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Confirm an embedded billing checkout Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing/confirm-an-embedded-billing-checkout ## Confirm an embedded billing checkout `POST /v1/billing/current/checkouts/{sessionId}/confirm` Lifecycle: **stable** Required permissions (any): `billing:manage` ### Parameters - `sessionId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `token` (string, required) - `paymentMethodId` (string, required) - `installments` (integer (int32), required) - `issuerId` (string, required) - `identificationType` (string, required) - `identificationNumber` (string, required) - `payerEmail` (string) - `savedPaymentMethodId` (string) - `savePaymentMethod` (boolean) - `deviceSessionId` (string) ### Responses - `200`: OK — application/json, BillingCheckoutConfirmationDto - `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/billing/current/checkouts/{sessionId}/confirm' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Create a billing plan purchase Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing/create-a-billing-plan-purchase ## Create a billing plan purchase `POST /v1/billing/current/plan-purchases` Lifecycle: **stable** Required permissions (any): `billing:manage` ### Request body Content-Type: `application/json` · required #### Fields - `plan` (BillingPlanType, required) - `billingInterval` (string) ### Responses - `200`: OK — application/json, PlanPurchaseDto - `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/billing/current/plan-purchases' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Create an AI credit checkout Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing/create-an-ai-credit-checkout ## Create an AI credit checkout `POST /v1/billing/current/ai-credits/checkouts` Lifecycle: **stable** Required permissions (any): `billing:manage` ### Request body Content-Type: `application/json` · required #### Fields - `packCode` (string, required) - `customCredits` (integer (int64)) ### Responses - `200`: OK — application/json, AiCreditCheckoutDto - `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/billing/current/ai-credits/checkouts' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Get an active billing checkout Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing/get-an-active-billing-checkout ## Get an active billing checkout `GET /v1/billing/current/checkouts/{sessionId}` Lifecycle: **stable** Required permissions (any): `billing:manage` ### Parameters - `sessionId` (path, string, required) ### Responses - `200`: OK — application/json, BillingCheckoutDto - `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/billing/current/checkouts/{sessionId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get current billing usage Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing/get-current-billing-usage ## Get current billing usage `GET /v1/billing/current/usage` Lifecycle: **stable** Required permissions (any): `billing:read` ### Responses - `200`: OK — application/json, BillingUsageDto - `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/billing/current/usage' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get the current AI credit balance Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing/get-the-current-ai-credit-balance ## Get the current AI credit balance `GET /v1/billing/current/ai-credits/balance` Lifecycle: **stable** Required permissions (any): `billing:read` ### Responses - `200`: OK — application/json, AiCreditBalanceDto - `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/billing/current/ai-credits/balance' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get the current AI credit catalog Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing/get-the-current-ai-credit-catalog ## Get the current AI credit catalog `GET /v1/billing/current/ai-credits/catalog` Lifecycle: **stable** Required permissions (any): `billing:read` ### Responses - `200`: OK — application/json, AiCreditCatalogDto - `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/billing/current/ai-credits/catalog' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get the current billing subscription Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing/get-the-current-billing-subscription ## Get the current billing subscription `GET /v1/billing/current/subscription` Lifecycle: **stable** Required permissions (any): `billing:read` ### Responses - `200`: OK — application/json, CurrentBillingSubscriptionDto - `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/billing/current/subscription' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List AI credit activity Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing/list-ai-credit-activity ## List AI credit activity `GET /v1/billing/current/ai-credits/activity` Lifecycle: **stable** Required permissions (any): `billing: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`. ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfAiCreditActivityItemDto - `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/billing/current/ai-credits/activity' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List available billing plans Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing/list-available-billing-plans ## List available billing plans `GET /v1/billing/plans` Lifecycle: **stable** ### 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/billing/plans' ``` --- # List current billing history Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/billing/list-current-billing-history ## List current billing history `GET /v1/billing/current/history` Lifecycle: **stable** Required permissions (any): `billing: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`. ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfBillingHistoryItemDto - `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/billing/current/history' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Payments Inspect methods and perform captures, cancellations, and refunds. Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/payments | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/payments/refund`](/en/docs/admin/payments-and-finance/payments/refund-payment) | Refund payment | | `POST` | [`/v1/payments/start`](/en/docs/admin/payments-and-finance/payments/start-payment) | Start payment | | `POST` | [`/v1/payments/{paymentTransactionId}/capture`](/en/docs/admin/payments-and-finance/payments/capture-payment) | Capture payment | | `POST` | [`/v1/payments/{paymentTransactionId}/cancel`](/en/docs/admin/payments-and-finance/payments/cancel-payment) | Cancel payment | | `GET` | [`/v1/payments/methods`](/en/docs/admin/payments-and-finance/payments/list-payment-methods) | List payment methods | | `PUT` | [`/v1/payments/methods`](/en/docs/admin/payments-and-finance/payments/update-payment-methods) | Update payment methods | | `GET` | [`/v1/payments/settings`](/en/docs/admin/payments-and-finance/payments/get-payment-settings) | Get payment settings | | `PUT` | [`/v1/payments/settings`](/en/docs/admin/payments-and-finance/payments/update-payment-settings) | Update payment settings | --- # Cancel payment Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/payments/cancel-payment ## Cancel payment `POST /v1/payments/{paymentTransactionId}/cancel` Lifecycle: **stable** Required permissions (any): `payment:create` ### Parameters - `paymentTransactionId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `message` (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/payments/{paymentTransactionId}/cancel' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Capture payment Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/payments/capture-payment ## Capture payment `POST /v1/payments/{paymentTransactionId}/capture` Lifecycle: **stable** Required permissions (any): `payment:create` ### Parameters - `paymentTransactionId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `amount` (number (double), required) ### Responses - `200`: OK — application/json, StartPaymentResultModel - `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/payments/{paymentTransactionId}/capture' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Get payment settings Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/payments/get-payment-settings ## Get payment settings `GET /v1/payments/settings` Lifecycle: **stable** Required permissions (any): `payment:read` ### Responses - `200`: OK — application/json, PaymentSettingsModel - `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/payments/settings' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List payment methods Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/payments/list-payment-methods ## List payment methods `GET /v1/payments/methods` Lifecycle: **stable** Required permissions (any): `payment: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/payments/methods' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Refund payment Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/payments/refund-payment ## Refund payment `POST /v1/payments/refund` Lifecycle: **stable** Required permissions (any): `payment:create` ### Request body Content-Type: `application/json` · required #### Fields - `paymentTransactionId` (string, required) - `amount` (number (double), 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/payments/refund' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Start payment Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/payments/start-payment ## Start payment `POST /v1/payments/start` Lifecycle: **stable** Required permissions (any): `payment:create` ### Request body Content-Type: `application/json` · required #### Fields - `orderId` (string, required) - `orderGroup` (string, required) - `paymentMethodCode` (string, required) - `amount` (number (double), required) - `currency` (string, required) - `externalRef` (string, required) - `payerEmail` (string, required) - `lineItems` (array) - `receiptUrl` (string) - `token` (string) - `providerPaymentMethodId` (string) - `deviceSessionId` (string) ### Responses - `200`: OK — application/json, StartPaymentResultModel - `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/payments/start' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update payment methods Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/payments/update-payment-methods ## Update payment methods `PUT /v1/payments/methods` Lifecycle: **stable** Required permissions (any): `payment:create` ### Request body Content-Type: `application/json` · required #### Fields - `items` (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/payments/methods' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update payment settings Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/payments/update-payment-settings ## Update payment settings `PUT /v1/payments/settings` Lifecycle: **stable** Required permissions (any): `payment:create` ### Request body Content-Type: `application/json` · required #### Fields - `captureMode` (null | PaymentCaptureMode) - `defaultConnectionId` (string) - `manualPaymentsEnabled` (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/payments/settings' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Sellers Manage sellers, commissions, members, invitations, roles, and permissions. Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/sellers`](/en/docs/admin/payments-and-finance/sellers/create-seller) | Create seller | | `GET` | [`/v1/sellers`](/en/docs/admin/payments-and-finance/sellers/list-sellers) | List sellers | | `GET` | [`/v1/sellers/{id}`](/en/docs/admin/payments-and-finance/sellers/get-seller-by-id) | Get seller by ID | | `PUT` | [`/v1/sellers/{id}`](/en/docs/admin/payments-and-finance/sellers/update-a-seller) | Update a seller | | `DELETE` | [`/v1/sellers/{id}`](/en/docs/admin/payments-and-finance/sellers/delete-a-seller) | Delete a seller | | `GET` | [`/v1/sellers/{sellerId}/roles`](/en/docs/admin/payments-and-finance/sellers/list-seller-roles) | List seller roles | ### Commissions | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/sellers/{sellerId}/commissions`](/en/docs/admin/payments-and-finance/sellers/list-seller-commissions) | List seller commissions | | `PUT` | [`/v1/sellers/{sellerId}/commissions`](/en/docs/admin/payments-and-finance/sellers/replace-seller-commissions) | Replace seller commissions | ### Invitations | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/sellers/{sellerId}/invitations`](/en/docs/admin/payments-and-finance/sellers/invite-a-seller-member) | Invite a seller member | | `GET` | [`/v1/sellers/{sellerId}/invitations`](/en/docs/admin/payments-and-finance/sellers/list-seller-invitations) | List seller invitations | | `DELETE` | [`/v1/sellers/{sellerId}/invitations/{invitationId}`](/en/docs/admin/payments-and-finance/sellers/delete-a-seller-invitation) | Delete a seller invitation | | `POST` | [`/v1/sellers/{sellerId}/invitations/{invitationId}/resend`](/en/docs/admin/payments-and-finance/sellers/resend-a-seller-invitation) | Resend a seller invitation | ### Members | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/sellers/{sellerId}/members`](/en/docs/admin/payments-and-finance/sellers/list-seller-members) | List seller members | | `DELETE` | [`/v1/sellers/{sellerId}/members/{memberId}`](/en/docs/admin/payments-and-finance/sellers/remove-a-members-access-to-a-seller) | Remove a member's access to a seller | ### Scopes | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/sellers/{sellerId}/scopes`](/en/docs/admin/payments-and-finance/sellers/list-seller-scopes) | List seller scopes | | `PUT` | [`/v1/sellers/{sellerId}/scopes`](/en/docs/admin/payments-and-finance/sellers/replace-seller-scopes) | Replace seller scopes | --- # Create seller Create a new seller in the catalog Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/create-seller ## Create seller `POST /v1/sellers` Lifecycle: **stable** Create a new seller in the catalog Required permissions (any): `settings:create` ### Request body Content-Type: `application/json` · required #### Fields - `name` (string, required) - `slug` (string, required): URL-friendly identifier. - `countryCode` (string, required): ISO 3166-1 alpha-2 country code, for example `PE`. - `currencyCode` (string, required): ISO 4217 currency code, for example `PEN`. - `description` (string) - `phone` (string) - `emailNotification` (string) - `legalName` (string) - `taxId` (string) - `businessLicense` (string) - `legalAddress` (string) - `contactPerson` (string) - `contactEmail` (string) - `logo` (string) - `commissionPercent` (number (double)) - `exchangeRate` (number (double)) - `ownerEmail` (string) - `ownerFirstName` (string) - `ownerLastName` (string) - `billingInfo` (null | UpdateBillingInformationRequest) ### 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/sellers' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Delete a seller Delete an existing seller Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/delete-a-seller ## Delete a seller `DELETE /v1/sellers/{id}` Lifecycle: **stable** Delete an existing seller Required permissions (any): `settings:delete` ### 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/sellers/{id}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Delete a seller invitation Revokes a pending invitation. The link stops working. Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/delete-a-seller-invitation ## Delete a seller invitation `DELETE /v1/sellers/{sellerId}/invitations/{invitationId}` Lifecycle: **stable** Revokes a pending invitation. The link stops working. Required permissions (any): `member:delete` ### Parameters - `sellerId` (path, string, required) - `invitationId` (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 DELETE \ --url 'https://api.ecomiq.pe/api/v1/sellers/{sellerId}/invitations/{invitationId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get seller by ID Retrieve a specific seller by its ID Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/get-seller-by-id ## Get seller by ID `GET /v1/sellers/{id}` Lifecycle: **stable** Retrieve a specific seller by its ID Required permissions (any): `settings:read` ### Parameters - `id` (path, string, required): Unique identifier of the resource. ### Responses - `200`: OK — application/json, SellerDetailsDto - `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/sellers/{id}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Invite a seller member Invites someone to a seller with a given role. Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/invite-a-seller-member ## Invite a seller member `POST /v1/sellers/{sellerId}/invitations` Lifecycle: **stable** Invites someone to a seller with a given role. Required permissions (any): `member:invite` ### Parameters - `sellerId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `email` (string, required) - `roleId` (string, required) - `firstName` (string) - `lastName` (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/sellers/{sellerId}/invitations' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # List seller commissions Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/list-seller-commissions ## List seller commissions `GET /v1/sellers/{sellerId}/commissions` Lifecycle: **stable** Required permissions (any): `settings:read` ### Parameters - `sellerId` (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/sellers/{sellerId}/commissions' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List seller invitations Lists the pending invitations of a seller. Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/list-seller-invitations ## List seller invitations `GET /v1/sellers/{sellerId}/invitations` Lifecycle: **stable** Lists the pending invitations of a seller. Required permissions (any): `member:read` ### Parameters - `sellerId` (path, string, required) - `status` (query, array) ### 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/sellers/{sellerId}/invitations' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List seller members Lists the people with access to a seller. Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/list-seller-members ## List seller members `GET /v1/sellers/{sellerId}/members` Lifecycle: **stable** Lists the people with access to a seller. Required permissions (any): `member:read` ### Parameters - `sellerId` (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`. - `status` (query, array) - `emails` (query, array) - `names` (query, array) - `roles` (query, array) - `isOwner` (query, boolean) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfMemberItemDto - `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/sellers/{sellerId}/members' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List seller roles Lists the roles a seller member can hold. Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/list-seller-roles ## List seller roles `GET /v1/sellers/{sellerId}/roles` Lifecycle: **stable** Lists the roles a seller member can hold. Required permissions (any): `role:read` ### Parameters - `sellerId` (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/sellers/{sellerId}/roles' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List seller scopes Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/list-seller-scopes ## List seller scopes `GET /v1/sellers/{sellerId}/scopes` Lifecycle: **stable** Required permissions (any): `settings:read` ### Parameters - `sellerId` (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/sellers/{sellerId}/scopes' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List sellers Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/list-sellers ## List sellers `GET /v1/sellers` Lifecycle: **stable** 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`. - `status` (query, array) - `includeInternal` (query, boolean) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfSellerItemDto - `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/sellers' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Remove a member's access to a seller Removes a person's access to a seller. Their user account is not deleted. Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/remove-a-members-access-to-a-seller ## Remove a member's access to a seller `DELETE /v1/sellers/{sellerId}/members/{memberId}` Lifecycle: **stable** Removes a person's access to a seller. Their user account is not deleted. Required permissions (any): `member:delete` ### Parameters - `sellerId` (path, string, required) - `memberId` (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 DELETE \ --url 'https://api.ecomiq.pe/api/v1/sellers/{sellerId}/members/{memberId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Replace seller commissions Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/replace-seller-commissions ## Replace seller commissions `PUT /v1/sellers/{sellerId}/commissions` Lifecycle: **stable** Required permissions (any): `settings:update` ### Parameters - `sellerId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `commissions` (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 PUT \ --url 'https://api.ecomiq.pe/api/v1/sellers/{sellerId}/commissions' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Replace seller scopes Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/replace-seller-scopes ## Replace seller scopes `PUT /v1/sellers/{sellerId}/scopes` Lifecycle: **stable** Required permissions (any): `settings:update` ### Parameters - `sellerId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `scopes` (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 PUT \ --url 'https://api.ecomiq.pe/api/v1/sellers/{sellerId}/scopes' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Resend a seller invitation Sends the invitation email again and extends its expiry. Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/resend-a-seller-invitation ## Resend a seller invitation `POST /v1/sellers/{sellerId}/invitations/{invitationId}/resend` Lifecycle: **stable** Sends the invitation email again and extends its expiry. Required permissions (any): `member:invite` ### Parameters - `sellerId` (path, string, required) - `invitationId` (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 POST \ --url 'https://api.ecomiq.pe/api/v1/sellers/{sellerId}/invitations/{invitationId}/resend' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Update a seller Update an existing seller Canonical: https://docs.ecomiq.pe/en/docs/admin/payments-and-finance/sellers/update-a-seller ## Update a seller `PUT /v1/sellers/{id}` Lifecycle: **stable** Update an existing seller 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) - `slug` (string): URL-friendly identifier. - `description` (string) - `phone` (string) - `emailNotification` (string) - `deliveryPolicy` (string) - `privacyAndSecurityPolicy` (string) - `commissionPercent` (number (double)) - `exchangeRate` (number (double)) - `legalInfo` (null | UpdateLegalInformationRequest) - `billingInfo` (null | UpdateBillingInformationRequest) - `catalogSettings` (null | UpdateSellerCatalogSettingsRequest) - `shippingSettings` (null | UpdateSellerShippingSettingsRequest) - `profile` (null | UpdateSellerProfileRequest) - `fulfillment` (null | UpdateFulfillmentOptionsRequest) ### 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/sellers/{id}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Platform & Identity Organizations, stores, domains, settings, and API keys. Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity - [Organizations](/en/docs/admin/platform-and-identity/organizations): List the user's organizations and create new organizations. - [Stores](/en/docs/admin/platform-and-identity/stores): Create stores and manage selection, slug, domains, and settings. - [API Keys](/en/docs/admin/platform-and-identity/api-keys): Manage keys for UCP, an API that is not published yet. Admin, Storefront, and Auth use Bearer tokens. --- # API Keys Manage keys for UCP, an API that is not published yet. Admin, Storefront, and Auth use Bearer tokens. Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/api-keys | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/api-keys`](/en/docs/admin/platform-and-identity/api-keys/create-an-api-key) | Create an API key | | `GET` | [`/v1/api-keys`](/en/docs/admin/platform-and-identity/api-keys/list-api-keys) | List API keys | | `DELETE` | [`/v1/api-keys/{id}`](/en/docs/admin/platform-and-identity/api-keys/revoke-an-api-key) | Revoke an API key | --- # Create an API key Creates an API key and returns its plaintext value once. This does not create an OAuth application, and documented Admin, Storefront, and Auth operations do not accept this key. Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/api-keys/create-an-api-key ## Create an API key `POST /v1/api-keys` Lifecycle: **stable** Creates an API key and returns its plaintext value once. This does not create an OAuth application, and documented Admin, Storefront, and Auth operations do not accept this key. Required permissions (any): `api_key:create` ### Request body Content-Type: `application/json` · required #### Fields - `name` (string, required) - `isTestMode` (boolean, required) - `scopes` (array, required) - `allowedIps` (array, required) - `expiresAt` (string (date-time), required) - `applicationUrl` (string, required) #### Example ```json { "name": "ERP de producción", "isTestMode": false, "scopes": [ "api_admin" ], "allowedIps": [ "203.0.113.10" ], "expiresAt": null, "applicationUrl": "https://erp.example.com" } ``` ### Responses - `201`: Created — application/json, CreateApiKeyResponse - `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/api-keys' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data '{"name":"ERP de producción","isTestMode":false,"scopes":["api_admin"],"allowedIps":["203.0.113.10"],"expiresAt":null,"applicationUrl":"https://erp.example.com"}' ``` --- # List API keys Returns the API keys visible to the current user. Plaintext key values are never returned. Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/api-keys/list-api-keys ## List API keys `GET /v1/api-keys` Lifecycle: **stable** Returns the API keys visible to the current user. Plaintext key values are never returned. Required permissions (any): `api_key: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/api-keys' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Revoke an API key Revokes the selected API key so it can no longer authenticate requests. Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/api-keys/revoke-an-api-key ## Revoke an API key `DELETE /v1/api-keys/{id}` Lifecycle: **stable** Revokes the selected API key so it can no longer authenticate requests. Required permissions (any): `api_key: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 DELETE \ --url 'https://api.ecomiq.pe/api/v1/api-keys/{id}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Organizations List the user's organizations and create new organizations. Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/organizations | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/organizations`](/en/docs/admin/platform-and-identity/organizations/create-organization) | Create organization | | `GET` | [`/v1/organizations`](/en/docs/admin/platform-and-identity/organizations/list-organizations) | List organizations | --- # Create organization Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/organizations/create-organization ## Create organization `POST /v1/organizations` Lifecycle: **stable** ### Request body Content-Type: `application/json` · required #### Fields - `name` (string, required) - `storeName` (string, required) - `firstName` (string, required) - `lastName` (string, required) - `organizationId` (string, required) - `countryCode` (string, required): ISO 3166-1 alpha-2 country code, for example `PE`. - `currencyCode` (string, required): ISO 4217 currency code, for example `PEN`. - `languageCode` (string, required): ISO 639-1 language code, for example `es`. - `timeZone` (string, required): IANA time zone name, for example `America/Lima`. - `storeType` (string) - `createSampleData` (boolean) ### Responses - `200`: OK — application/json, OrganizationDetailsDto - `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/organizations' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # List organizations Returns the list of organizations for the current user Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/organizations/list-organizations ## List organizations `GET /v1/organizations` Lifecycle: **stable** Returns the list of organizations for the current user ### 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/organizations' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Stores Create stores and manage selection, slug, domains, and settings. Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/stores`](/en/docs/admin/platform-and-identity/stores/create-store) | Create store | | `GET` | [`/v1/stores`](/en/docs/admin/platform-and-identity/stores/list-stores) | List stores | | `GET` | [`/v1/stores/{slug}`](/en/docs/admin/platform-and-identity/stores/get-store-by-slug) | Get store by slug | | `GET` | [`/v1/stores/{storeId}`](/en/docs/admin/platform-and-identity/stores/get-store-by-id) | Get store by ID | | `PATCH` | [`/v1/stores/slug`](/en/docs/admin/platform-and-identity/stores/update-store-slug) | Update store slug | | `POST` | [`/v1/stores/{storeId}/select`](/en/docs/admin/platform-and-identity/stores/select-store) | Select store | | `GET` | [`/v1/stores/domain/{domain}`](/en/docs/admin/platform-and-identity/stores/get-store-by-domain) | Get store by domain | | `GET` | [`/v1/stores/exists/{slug}`](/en/docs/admin/platform-and-identity/stores/check-store-exists) | Check store exists | ### Domains | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/stores/domains`](/en/docs/admin/platform-and-identity/stores/create-store-domain) | Create store domain | | `GET` | [`/v1/stores/domains`](/en/docs/admin/platform-and-identity/stores/list-store-domains) | List store domains | | `DELETE` | [`/v1/stores/domains/{domainId}`](/en/docs/admin/platform-and-identity/stores/delete-store-domain) | Delete store domain | ### Settings | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/stores/settings`](/en/docs/admin/platform-and-identity/stores/get-store-settings) | Get store settings | | `PUT` | [`/v1/stores/settings`](/en/docs/admin/platform-and-identity/stores/update-store-settings) | Update store settings | | `POST` | [`/v1/stores/settings/snapshot/refresh`](/en/docs/admin/platform-and-identity/stores/refresh-store-settings-snapshot) | Refresh store settings snapshot | --- # Check store exists Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/check-store-exists ## Check store exists `GET /v1/stores/exists/{slug}` Lifecycle: **stable** ### Parameters - `slug` (path, string, required): URL-friendly identifier. ### Responses - `200`: OK — application/json, StoreSlugCheckDto - `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/stores/exists/{slug}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Create store Create a new store Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/create-store ## Create store `POST /v1/stores` Lifecycle: **stable** Create a new store ### Request body Content-Type: `application/json` · required #### Fields - `name` (string, required) - `slug` (string, required): URL-friendly identifier. - `description` (string, required) - `domain` (string, required) - `logo` (string, required) - `type` (string) ### Responses - `201`: Created — application/json, StoreItemDto - `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/stores' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Create store domain Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/create-store-domain ## Create store domain `POST /v1/stores/domains` Lifecycle: **stable** Required permissions (any): `settings:update` ### Request body Content-Type: `application/json` · required #### Fields - `domain` (string, required) ### Responses - `200`: OK — application/json, StoreDomainDto - `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/stores/domains' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Delete store domain Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/delete-store-domain ## Delete store domain `DELETE /v1/stores/domains/{domainId}` Lifecycle: **stable** Required permissions (any): `settings:update` ### Parameters - `domainId` (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/stores/domains/{domainId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get store by domain Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/get-store-by-domain ## Get store by domain `GET /v1/stores/domain/{domain}` Lifecycle: **stable** ### Parameters - `domain` (path, string, required) - `alternativeDomain` (query, string) ### Responses - `200`: OK — application/json, StoreContextDto - `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/stores/domain/{domain}' ``` --- # Get store by ID Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/get-store-by-id ## Get store by ID `GET /v1/stores/{storeId}` Lifecycle: **stable** ### Parameters - `storeId` (path, string, required) ### Responses - `200`: OK — application/json, StoreContextDto - `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/stores/{storeId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get store by slug Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/get-store-by-slug ## Get store by slug `GET /v1/stores/{slug}` Lifecycle: **stable** ### Parameters - `slug` (path, string, required): URL-friendly identifier. ### Responses - `200`: OK — application/json, StoreContextDto - `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/stores/{slug}' ``` --- # Get store settings Get store settings Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/get-store-settings ## Get store settings `GET /v1/stores/settings` Lifecycle: **stable** Get store settings Required permissions (any): `settings:read` ### Responses - `200`: OK — application/json, StoreSettingsDto - `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/stores/settings' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List store domains Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/list-store-domains ## List store domains `GET /v1/stores/domains` 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/stores/domains' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List stores Retrieve list of stores Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/list-stores ## List stores `GET /v1/stores` Lifecycle: **stable** Retrieve list of stores ### 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/stores' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Refresh store settings snapshot Refresh store settings snapshot in Redis and Cloudflare KV Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/refresh-store-settings-snapshot ## Refresh store settings snapshot `POST /v1/stores/settings/snapshot/refresh` Lifecycle: **stable** Refresh store settings snapshot in Redis and Cloudflare KV Required permissions (any): `settings:update` ### 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/stores/settings/snapshot/refresh' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Select store Retrieve list of stores Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/select-store ## Select store `POST /v1/stores/{storeId}/select` Lifecycle: **stable** Retrieve list of stores ### Parameters - `storeId` (path, string, required) ### 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/stores/{storeId}/select' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Update store settings Update store settings Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/update-store-settings ## Update store settings `PUT /v1/stores/settings` Lifecycle: **stable** Update store settings Required permissions (any): `settings:update` ### Request body Content-Type: `application/json` · required #### Fields - `id` (string): Unique identifier of the resource. - `name` (string) - `description` (string) - `slug` (string): URL-friendly identifier. - `domain` (string) - `logo` (string) - `icon` (string) - `visibility` (null | StoreVisibility) - `timeZone` (string): IANA time zone name, for example `America/Lima`. - `currency` (string) - `language` (string) - `favicon` (string) - `accessKey` (string) - `themeConfig` (null | StoreThemeSettings) - `featuresEnabled` (null | StoreFeatureFlags) - `checkoutSettings` (null | StoreCheckoutSettings) ### Responses - `200`: OK — application/json, StoreSettingsDto - `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/stores/settings' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update store slug Update store slug and its default platform subdomain Canonical: https://docs.ecomiq.pe/en/docs/admin/platform-and-identity/stores/update-store-slug ## Update store slug `PATCH /v1/stores/slug` Lifecycle: **stable** Update store slug and its default platform subdomain Required permissions (any): `settings:update` ### Request body Content-Type: `application/json` · required #### Fields - `slug` (string, required): URL-friendly identifier. ### Responses - `200`: OK — application/json, StoreSlugDto - `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 PATCH \ --url 'https://api.ecomiq.pe/api/v1/stores/slug' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Promotions Discounts, coupons, and promotional pricing rules. Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions - [Coupons](/en/docs/admin/promotions/coupons): Create and manage coupons shoppers can redeem. - [Discounts](/en/docs/admin/promotions/discounts): Create and manage discount rules. --- # Coupons Create and manage coupons shoppers can redeem. Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions/coupons | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/coupons`](/en/docs/admin/promotions/coupons/create-coupon) | Create coupon | | `GET` | [`/v1/coupons`](/en/docs/admin/promotions/coupons/list-coupons) | List coupons | | `GET` | [`/v1/coupons/{couponId}`](/en/docs/admin/promotions/coupons/get-coupon) | Get coupon | | `PUT` | [`/v1/coupons/{couponId}`](/en/docs/admin/promotions/coupons/update-coupon) | Update coupon | | `POST` | [`/v1/coupons/{couponId}/codes`](/en/docs/admin/promotions/coupons/create-coupon-code) | Create coupon code | | `POST` | [`/v1/coupons/{couponId}/codes/batch`](/en/docs/admin/promotions/coupons/queue-a-coupon-codes-batch-creation) | Queue a coupon codes batch creation | --- # Create coupon Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions/coupons/create-coupon ## Create coupon `POST /v1/coupons` Lifecycle: **stable** Required permissions (any): `promotion:create` ### Request body Content-Type: `application/json` · required #### Fields - `name` (string, required) - `description` (string) - `status` (PromotionStatus) - `type` (PromotionType) - `target` (PromotionTarget) - `amount` (number (double)) - `allocation` (PromotionAllocation) - `maxQuantity` (integer (int32)) - `applyAfterTaxes` (boolean) - `sellerId` (string) - `isAutomatic` (boolean) - `validFrom` (string (date-time)) - `validTo` (string (date-time)) - `usageLimit` (integer (int32)) - `customerUsageLimit` (integer (int32)) - `combineWithOtherDiscounts` (boolean) - `rules` (array) - `codes` (array) - `codeUsageLimit` (integer (int32)) ### Responses - `201`: Created — application/json, string (uuid) - `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/coupons' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Create coupon code Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions/coupons/create-coupon-code ## Create coupon code `POST /v1/coupons/{couponId}/codes` Lifecycle: **stable** Required permissions (any): `promotion:update` ### Parameters - `couponId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `code` (string, required) - `usageLimit` (integer (int32)) ### Responses - `201`: Created — application/json, PromotionCodeDto - `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/coupons/{couponId}/codes' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Get coupon Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions/coupons/get-coupon ## Get coupon `GET /v1/coupons/{couponId}` Lifecycle: **stable** Required permissions (any): `promotion:read` ### Parameters - `couponId` (path, string, required) ### Responses - `200`: OK — application/json, PromotionDetailsDto - `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/coupons/{couponId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List coupons Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions/coupons/list-coupons ## List coupons `GET /v1/coupons` Lifecycle: **stable** Required permissions (any): `promotion: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`. - `status` (query, array) - `type` (query, QueryEnumOfPromotionType) - `target` (query, QueryEnumOfPromotionTarget) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfPromotionItemDto - `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/coupons' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Queue a coupon codes batch creation Queues the generation of a batch of coupon codes. Returns a job; the codes are created in the background. Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions/coupons/queue-a-coupon-codes-batch-creation ## Queue a coupon codes batch creation `POST /v1/coupons/{couponId}/codes/batch` Lifecycle: **stable** Queues the generation of a batch of coupon codes. Returns a job; the codes are created in the background. Required permissions (any): `promotion:update` ### Parameters - `couponId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `codes` (array, required) - `usageLimit` (integer (int32)) ### Responses - `202`: Accepted — application/json, PromotionOperationDto - `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/coupons/{couponId}/codes/batch' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update coupon Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions/coupons/update-coupon ## Update coupon `PUT /v1/coupons/{couponId}` Lifecycle: **stable** Required permissions (any): `promotion:update` ### Parameters - `couponId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `name` (string, required) - `description` (string) - `status` (PromotionStatus) - `type` (PromotionType) - `target` (PromotionTarget) - `amount` (number (double)) - `allocation` (PromotionAllocation) - `maxQuantity` (integer (int32)) - `applyAfterTaxes` (boolean) - `sellerId` (string) - `isAutomatic` (boolean) - `validFrom` (string (date-time)) - `validTo` (string (date-time)) - `usageLimit` (integer (int32)) - `customerUsageLimit` (integer (int32)) - `combineWithOtherDiscounts` (boolean) - `rules` (array) - `codes` (array) - `codeUsageLimit` (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 - `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/coupons/{couponId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Discounts Create and manage discount rules. Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions/discounts | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/discounts`](/en/docs/admin/promotions/discounts/create-discount) | Create discount | | `GET` | [`/v1/discounts`](/en/docs/admin/promotions/discounts/list-discounts) | List discounts | | `GET` | [`/v1/discounts/{discountId}`](/en/docs/admin/promotions/discounts/get-discount) | Get discount | | `PUT` | [`/v1/discounts/{discountId}`](/en/docs/admin/promotions/discounts/update-discount) | Update discount | --- # Create discount Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions/discounts/create-discount ## Create discount `POST /v1/discounts` Lifecycle: **stable** Required permissions (any): `promotion:create` ### Request body Content-Type: `application/json` · required #### Fields - `name` (string, required) - `description` (string) - `status` (PromotionStatus) - `type` (PromotionType) - `target` (PromotionTarget) - `amount` (number (double)) - `allocation` (PromotionAllocation) - `maxQuantity` (integer (int32)) - `applyAfterTaxes` (boolean) - `sellerId` (string) - `isAutomatic` (boolean) - `validFrom` (string (date-time)) - `validTo` (string (date-time)) - `usageLimit` (integer (int32)) - `customerUsageLimit` (integer (int32)) - `combineWithOtherDiscounts` (boolean) - `rules` (array) - `codes` (array) - `codeUsageLimit` (integer (int32)) ### Responses - `201`: Created — application/json, string (uuid) - `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/discounts' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Get discount Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions/discounts/get-discount ## Get discount `GET /v1/discounts/{discountId}` Lifecycle: **stable** Required permissions (any): `promotion:read` ### Parameters - `discountId` (path, string, required) ### Responses - `200`: OK — application/json, PromotionDetailsDto - `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/discounts/{discountId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List discounts Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions/discounts/list-discounts ## List discounts `GET /v1/discounts` Lifecycle: **stable** Required permissions (any): `promotion: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`. - `status` (query, array) - `type` (query, QueryEnumOfPromotionType) - `target` (query, QueryEnumOfPromotionTarget) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfPromotionItemDto - `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/discounts' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Update discount Canonical: https://docs.ecomiq.pe/en/docs/admin/promotions/discounts/update-discount ## Update discount `PUT /v1/discounts/{discountId}` Lifecycle: **stable** Required permissions (any): `promotion:update` ### Parameters - `discountId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `name` (string, required) - `description` (string) - `status` (PromotionStatus) - `type` (PromotionType) - `target` (PromotionTarget) - `amount` (number (double)) - `allocation` (PromotionAllocation) - `maxQuantity` (integer (int32)) - `applyAfterTaxes` (boolean) - `sellerId` (string) - `isAutomatic` (boolean) - `validFrom` (string (date-time)) - `validTo` (string (date-time)) - `usageLimit` (integer (int32)) - `customerUsageLimit` (integer (int32)) - `combineWithOtherDiscounts` (boolean) - `rules` (array) - `codes` (array) - `codeUsageLimit` (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 - `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/discounts/{discountId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Webhooks Subscriptions, events, deliveries, retries, and operational control. Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks - [Subscriptions & deliveries](/en/docs/admin/webhooks/webhooks): Manage endpoints, inspect events, and retry failed deliveries. The event types you can subscribe to, their models, and your endpoint contract are in the [webhooks guide](/en/docs/guides/webhooks). --- # Subscriptions & deliveries Manage endpoints, inspect events, and retry failed deliveries. Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks ### Deliveries | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/webhooks/deliveries`](/en/docs/admin/webhooks/webhooks/list-webhook-deliveries) | List webhook deliveries | | `GET` | [`/v1/webhooks/deliveries/{id}`](/en/docs/admin/webhooks/webhooks/get-webhook-delivery) | Get webhook delivery | | `POST` | [`/v1/webhooks/deliveries/{id}/retry`](/en/docs/admin/webhooks/webhooks/retry-webhook-delivery) | Retry webhook delivery | ### Endpoints | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/webhooks/endpoints`](/en/docs/admin/webhooks/webhooks/create-webhook-endpoint) | Create webhook endpoint | | `GET` | [`/v1/webhooks/endpoints`](/en/docs/admin/webhooks/webhooks/list-webhook-endpoints) | List webhook endpoints | | `PUT` | [`/v1/webhooks/endpoints/{id}`](/en/docs/admin/webhooks/webhooks/update-webhook-endpoint) | Update webhook endpoint | | `DELETE` | [`/v1/webhooks/endpoints/{id}`](/en/docs/admin/webhooks/webhooks/delete-webhook-endpoint) | Delete webhook endpoint | | `POST` | [`/v1/webhooks/endpoints/{id}/disable`](/en/docs/admin/webhooks/webhooks/disable-webhook-endpoint) | Disable webhook endpoint | | `POST` | [`/v1/webhooks/endpoints/{id}/enable`](/en/docs/admin/webhooks/webhooks/enable-webhook-endpoint) | Enable webhook endpoint | | `POST` | [`/v1/webhooks/endpoints/{id}/pause`](/en/docs/admin/webhooks/webhooks/pause-webhook-endpoint) | Pause webhook endpoint | ### Events | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/webhooks/events`](/en/docs/admin/webhooks/webhooks/list-webhook-events) | List webhook events | | `GET` | [`/v1/webhooks/events/{eventType}`](/en/docs/admin/webhooks/webhooks/get-webhook-event) | Get webhook event | --- # Create webhook endpoint Register a new webhook endpoint to receive system events Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks/create-webhook-endpoint ## Create webhook endpoint `POST /v1/webhooks/endpoints` Lifecycle: **stable** Register a new webhook endpoint to receive system events Required permissions (any): `connection:update` ### Request body Content-Type: `application/json` · required #### Fields - `name` (string) - `url` (string, required) - `eventTypes` (array, required) - `secret` (string) - `auth` (null | WebhookAuth) - `headers` (object) #### Example ```json { "name": "Pedidos al ERP", "url": "https://erp.example.com/webhooks/ecomiq", "eventTypes": [ "order.confirmed", "catalog.product.updated" ], "secret": "whsec_replace_with_a_random_secret" } ``` ### 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/webhooks/endpoints' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data '{"name":"Pedidos al ERP","url":"https://erp.example.com/webhooks/ecomiq","eventTypes":["order.confirmed","catalog.product.updated"],"secret":"whsec_replace_with_a_random_secret"}' ``` --- # Delete webhook endpoint Delete a webhook endpoint Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks/delete-webhook-endpoint ## Delete webhook endpoint `DELETE /v1/webhooks/endpoints/{id}` Lifecycle: **stable** Delete a webhook endpoint Required permissions (any): `connection: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 DELETE \ --url 'https://api.ecomiq.pe/api/v1/webhooks/endpoints/{id}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Disable webhook endpoint Disable a webhook endpoint Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks/disable-webhook-endpoint ## Disable webhook endpoint `POST /v1/webhooks/endpoints/{id}/disable` Lifecycle: **stable** Disable a webhook endpoint Required permissions (any): `connection: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/webhooks/endpoints/{id}/disable' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Enable webhook endpoint Enable a webhook endpoint Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks/enable-webhook-endpoint ## Enable webhook endpoint `POST /v1/webhooks/endpoints/{id}/enable` Lifecycle: **stable** Enable a webhook endpoint Required permissions (any): `connection: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/webhooks/endpoints/{id}/enable' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get webhook delivery Get webhook delivery detail for the current store Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks/get-webhook-delivery ## Get webhook delivery `GET /v1/webhooks/deliveries/{id}` Lifecycle: **stable** Get webhook delivery detail for the current store Required permissions (any): `connection:read` ### Parameters - `id` (path, string, required): Unique identifier of the resource. ### Responses - `200`: OK — application/json, WebhookDeliveryDetailDto - `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/webhooks/deliveries/{id}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get webhook event Get the detail of a supported webhook event Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks/get-webhook-event ## Get webhook event `GET /v1/webhooks/events/{eventType}` Lifecycle: **stable** Get the detail of a supported webhook event Required permissions (any): `connection:read` ### Parameters - `eventType` (path, string, required) ### Responses - `200`: OK — application/json, WebhookEventModel - `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/webhooks/events/{eventType}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List webhook deliveries Get webhook delivery history for the current store Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks/list-webhook-deliveries ## List webhook deliveries `GET /v1/webhooks/deliveries` Lifecycle: **stable** Get webhook delivery history for the current store Required permissions (any): `connection: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`. - `endpointId` (query, string) - `status` (query, QueryEnumOfWebhookDeliveryStatus) - `eventType` (query, string) - `fromDate` (query, string (date-time)) - `toDate` (query, string (date-time)) - `sellerId` (query, string) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfWebhookDeliveryDto - `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/webhooks/deliveries' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List webhook endpoints Get all registered webhook endpoints for the current store Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks/list-webhook-endpoints ## List webhook endpoints `GET /v1/webhooks/endpoints` Lifecycle: **stable** Get all registered webhook endpoints for the current store Required permissions (any): `connection:read` ### Parameters - `sellerId` (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/webhooks/endpoints' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List webhook events Get all supported webhook events and their payload details Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks/list-webhook-events ## List webhook events `GET /v1/webhooks/events` Lifecycle: **stable** Get all supported webhook events and their payload details Required permissions (any): `connection: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/webhooks/events' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Pause webhook endpoint Pause a webhook endpoint without deleting it Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks/pause-webhook-endpoint ## Pause webhook endpoint `POST /v1/webhooks/endpoints/{id}/pause` Lifecycle: **stable** Pause a webhook endpoint without deleting it Required permissions (any): `connection: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/webhooks/endpoints/{id}/pause' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Retry webhook delivery Re-enqueue a failed webhook delivery with its original payload Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks/retry-webhook-delivery ## Retry webhook delivery `POST /v1/webhooks/deliveries/{id}/retry` Lifecycle: **stable** Re-enqueue a failed webhook delivery with its original payload Required permissions (any): `connection: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/webhooks/deliveries/{id}/retry' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Update webhook endpoint Update an existing webhook endpoint Canonical: https://docs.ecomiq.pe/en/docs/admin/webhooks/webhooks/update-webhook-endpoint ## Update webhook endpoint `PUT /v1/webhooks/endpoints/{id}` Lifecycle: **stable** Update an existing webhook endpoint Required permissions (any): `connection:update` ### Parameters - `id` (path, string, required): Unique identifier of the resource. ### Request body Content-Type: `application/json` · required #### Fields - `name` (string) - `url` (string, required) - `eventTypes` (array, required) - `secret` (string) - `auth` (null | WebhookAuth) - `headers` (object) ### 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/webhooks/endpoints/{id}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Auth API Register users, manage sessions, and issue OAuth 2.0 tokens. Canonical: https://docs.ecomiq.pe/en/docs/auth Use Auth API to register users, verify access, and issue credentials for the other APIs. ## API areas - [Token](/en/docs/auth/token): Exchange OAuth 2.0 credentials for an access token. - [Auth](/en/docs/auth/auth): Verify a step-up authentication challenge. - [Users](/en/docs/auth/users): Register users and manage sessions, profiles, and account recovery. --- # Auth Verify a step-up authentication challenge. Canonical: https://docs.ecomiq.pe/en/docs/auth/auth | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/auth/step-up/verify`](/en/docs/auth/identity/auth/verify-step-up) | Verify step up | --- # Verify step up Canonical: https://docs.ecomiq.pe/en/docs/auth/identity/auth/verify-step-up ## Verify step up `POST /v1/auth/step-up/verify` Lifecycle: **stable** ### Request body Content-Type: `application/json` · required #### Fields - `challengeId` (string (uuid), required) - `code` (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 POST \ --url 'https://auth.ecomiq.pe/v1/auth/step-up/verify' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Request an access token Exchanges an OAuth 2.0 grant for an access token and, when applicable, a refresh token. Canonical: https://docs.ecomiq.pe/en/docs/auth/identity/token/request-an-access-token ## Request an access token `POST /connect/token` Lifecycle: **stable** Exchanges an OAuth 2.0 grant for an access token and, when applicable, a refresh token. ### Request body Content-Type: `application/x-www-form-urlencoded` · required #### Fields - `grant_type` (string, required): OAuth 2.0 grant type. - `client_id` (string, required): OAuth application client ID. - `client_secret` (string): OAuth application secret. Required for confidential clients. - `scope` (string): Space-separated OAuth scopes. - `username` (string): User email for the password grant. - `password` (string (password)): User password for the password grant. - `refresh_token` (string): Refresh token for the refresh_token grant. - `code` (string): Authorization code returned by /connect/authorize. Required for the authorization_code grant. - `redirect_uri` (string (uri)): Redirect URI used in the authorization request, when that request included one. - `code_verifier` (string): PKCE verifier. Required for the authorization_code grant. - `identity_scope` (string): Identity scope for the password grant. Defaults to global. - `tenant_id` (string): Organization identifier. Required with tenant or store identity scope. - `store_id` (string): Store identifier. Required with store identity scope. #### Example ```text grant_type=client_credentials client_id=app_replace_with_your_client_id client_secret=replace_with_your_client_secret scope=api_admin ``` ### Responses - `200`: Token issued. — application/json, object - `400`: Invalid OAuth request or grant. — application/json, object - `401`: Client authentication failed. — application/json, object - `403`: Forbidden — application/problem+json, ProblemDetails - `404`: Not Found — application/problem+json, ProblemDetails - `500`: Internal Server Error — application/problem+json, ProblemDetails #### 200 Example ```json { "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 3600, "scope": "api_admin" } ``` ### Request ```bash curl --request POST \ --url 'https://auth.ecomiq.pe/connect/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=client_credentials' \ --data-urlencode 'client_id=app_replace_with_your_client_id' \ --data-urlencode 'client_secret=replace_with_your_client_secret' \ --data-urlencode 'scope=api_admin' ``` --- # Get the current user Returns the profile of the current authenticated user. Canonical: https://docs.ecomiq.pe/en/docs/auth/identity/users/get-the-current-user ## Get the current user `GET /v1/users/me` Lifecycle: **stable** Returns the profile of the current authenticated user. ### Responses - `200`: OK — application/json, UserDetailsDto - `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://auth.ecomiq.pe/v1/users/me' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Logout user Canonical: https://docs.ecomiq.pe/en/docs/auth/identity/users/logout-user ## Logout user `POST /v1/users/logout` Lifecycle: **stable** ### Responses - `200`: OK — 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 - `500`: Internal Server Error — application/problem+json, ProblemDetails ### Request ```bash curl --request POST \ --url 'https://auth.ecomiq.pe/v1/users/logout' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Register user Canonical: https://docs.ecomiq.pe/en/docs/auth/identity/users/register-user ## Register user `POST /v1/users` Lifecycle: **stable** ### Request body Content-Type: `application/json` · required #### Fields - `email` (string, required) - `clientId` (string, required) - `password` (string) - `firstName` (string) - `lastName` (string) - `role` (string) - `identityScope` (string) - `tenantId` (string) - `storeId` (string) #### Example ```json { "email": "andrea@example.com", "clientId": "app_replace_with_your_client_id", "password": "Example-Password-2026!", "firstName": "Andrea", "lastName": "Ramos" } ``` ### Responses - `200`: OK — application/json, UserCreatedDto - `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://auth.ecomiq.pe/v1/users' \ --header 'Content-Type: application/json' \ --data '{"email":"andrea@example.com","clientId":"app_replace_with_your_client_id","password":"Example-Password-2026!","firstName":"Andrea","lastName":"Ramos"}' ``` --- # Request login link Canonical: https://docs.ecomiq.pe/en/docs/auth/identity/users/request-login-link ## Request login link `POST /v1/users/login-link` Lifecycle: **stable** ### Request body Content-Type: `application/json` · required #### Fields - `email` (string, required) - `clientId` (string, required) - `identityScope` (string) - `tenantId` (string) - `storeId` (string) #### Example ```json { "email": "andrea@example.com", "clientId": "app_replace_with_your_client_id" } ``` ### 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://auth.ecomiq.pe/v1/users/login-link' \ --header 'Content-Type: application/json' \ --data '{"email":"andrea@example.com","clientId":"app_replace_with_your_client_id"}' ``` --- # Request password reset Canonical: https://docs.ecomiq.pe/en/docs/auth/identity/users/request-password-reset ## Request password reset `POST /v1/users/recovery-password` Lifecycle: **stable** ### Parameters - `X-Client-Id` (header, string) ### Request body Content-Type: `application/json` · required #### Fields - `email` (string, required) - `identityScope` (string) - `tenantId` (string) - `storeId` (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://auth.ecomiq.pe/v1/users/recovery-password' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Reset password Canonical: https://docs.ecomiq.pe/en/docs/auth/identity/users/reset-password ## Reset password `POST /v1/users/reset-password` Lifecycle: **stable** ### Request body Content-Type: `application/json` · required #### Fields - `userId` (string (uuid), required) - `token` (string, required) - `newPassword` (string, required) - `confirmPassword` (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 POST \ --url 'https://auth.ecomiq.pe/v1/users/reset-password' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update password Canonical: https://docs.ecomiq.pe/en/docs/auth/identity/users/update-password ## Update password `PUT /v1/users/me/password` Lifecycle: **stable** ### Request body Content-Type: `application/json` · required #### Fields - `currentPassword` (string, required) - `newPassword` (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 PUT \ --url 'https://auth.ecomiq.pe/v1/users/me/password' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update the current user Updates the profile information of the current authenticated user. Canonical: https://docs.ecomiq.pe/en/docs/auth/identity/users/update-the-current-user ## Update the current user `PUT /v1/users/me` Lifecycle: **stable** Updates the profile information of the current authenticated user. ### Request body Content-Type: `application/json` · required #### Fields - `firstName` (string, required) - `lastName` (string, required) - `birthDate` (string (date), required) - `gender` (null | GenderType, required) - `documentType` (null | DocumentType, required): Kind of identity or tax document. - `documentNumber` (string, required): National identity or tax document number. - `phoneNumber` (string, required) - `address` (string, required) - `countryCode` (string, required): ISO 3166-1 alpha-2 country code, for example `PE`. - `avatarUrl` (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 PUT \ --url 'https://auth.ecomiq.pe/v1/users/me' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Verify a login code Verifies a one-time login code and signs in the user. Canonical: https://docs.ecomiq.pe/en/docs/auth/identity/users/verify-a-login-code ## Verify a login code `POST /v1/users/verify-code` Lifecycle: **stable** Verifies a one-time login code and signs in the user. ### Request body Content-Type: `application/json` · required #### Fields - `email` (string, required) - `code` (string, required) - `identityScope` (string) - `tenantId` (string) - `storeId` (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://auth.ecomiq.pe/v1/users/verify-code' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Token Exchange OAuth 2.0 credentials for an access token. Canonical: https://docs.ecomiq.pe/en/docs/auth/token | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/connect/token`](/en/docs/auth/identity/token/request-an-access-token) | Request an access token | --- # Users Register users and manage sessions, profiles, and account recovery. Canonical: https://docs.ecomiq.pe/en/docs/auth/users | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/users`](/en/docs/auth/identity/users/register-user) | Register user | | `POST` | [`/v1/users/login-link`](/en/docs/auth/identity/users/request-login-link) | Request login link | | `POST` | [`/v1/users/logout`](/en/docs/auth/identity/users/logout-user) | Logout user | | `POST` | [`/v1/users/recovery-password`](/en/docs/auth/identity/users/request-password-reset) | Request password reset | | `POST` | [`/v1/users/reset-password`](/en/docs/auth/identity/users/reset-password) | Reset password | | `POST` | [`/v1/users/verify-code`](/en/docs/auth/identity/users/verify-a-login-code) | Verify a login code | | `GET` | [`/v1/users/me`](/en/docs/auth/identity/users/get-the-current-user) | Get the current user | | `PUT` | [`/v1/users/me`](/en/docs/auth/identity/users/update-the-current-user) | Update the current user | | `PUT` | [`/v1/users/me/password`](/en/docs/auth/identity/users/update-password) | Update password | --- # Overview Choose the guide for your API and integration task. Canonical: https://docs.ecomiq.pe/en/docs/guides [Admin](/en/docs/admin), [Storefront](/en/docs/storefront), and [Auth](/en/docs/auth) resolve authentication and context differently. Use the endpoint reference as the contract and these guides to implement the full workflow. ## Choose an API | API | What it is for | Main context | | --------------------------------- | ------------------------------------------------ | -------------------------------------------------------------- | | [Admin](/en/docs/admin) | Manage catalog, orders, inventory, and settings. | OAuth token plus store or seller context. | | [Storefront](/en/docs/storefront) | Read the store and run shopper flows. | Store domain; some operations also require a customer session. | | [Auth](/en/docs/auth) | Issue tokens and manage user accounts. | OAuth application or user session, depending on the operation. | The Auth token endpoint uses an OAuth form. Do not assume its errors or request body match Admin endpoints. ## Start here - [Set up an integration](/en/docs/guides/setup): Create an OAuth application, get a token, and call Admin. - [Authentication](/en/docs/guides/authentication): Use client credentials, protect the secret, and renew access. - [Context and hierarchy](/en/docs/guides/hierarchy): Resolve organization, store, and seller for each API. ## Implement the workflow - [Pagination](/en/docs/guides/pagination): Distinguish cursor, page/pageSize, and limit-only queries. - [Webhook events](/en/docs/guides/webhooks): Choose events, verify deliveries, and process retries. ## Operate safely - [Errors](/en/docs/guides/errors): Distinguish Problem Details, OAuth errors, and infrastructure failures. - [Error codes](/en/docs/guides/error-codes): Look up documented codes and the status that produces them. - [Rate limits](/en/docs/guides/rate-limits): Handle request-rate limits, concurrency limits, and 429 responses. - [Agent tools](/en/docs/guides/agent-tools): Combine Markdown and OpenAPI without inventing fields or permissions. ## Before you start 1. For an Admin integration, create an OAuth application in the dashboard. The application provides a `client_id` and `client_secret`; an API key is a different credential and does not replace them. 2. Identify the correct store. Storefront resolves it from its `*.ecomiq.app` or custom domain. Admin gets its context from token claims. 3. Read the endpoint page before coding. It defines authentication, parameters, pagination, request body, and responses. --- # Agent tools Give an agent the workflow and exact contract it must implement. Canonical: https://docs.ecomiq.pe/en/docs/guides/agent-tools Use Markdown to explain the task and OpenAPI to define the call. Neither replaces server-side validation. ## Available sources - [`llms.txt`](/llms.txt) lists the public APIs and guides. - [`llms-full.txt`](/llms-full.txt) collects public documentation in one file. - A page menu can copy or open its Markdown. ## OpenAPI contracts | API | Contract | | --------------------------------- | ---------------------------------------- | | [Admin](/en/docs/admin) | [Download JSON](/openapi/admin.openapi.json) | | [Storefront](/en/docs/storefront) | [Download JSON](/openapi/storefront.openapi.json) | | [Auth](/en/docs/auth) | [Download JSON](/openapi/auth.openapi.json) | Provide only the contract for the API the agent will use. Admin, Storefront, and Auth do not share every authentication, context, pagination, or error rule. ## What to take from each source | Source | Use it for | | -------------- | --------------------------------------------------------------------------- | | Markdown guide | Workflow order, decisions, and operating constraints. | | OpenAPI | Method, path, parameters, body, schemas, responses, and published security. | | Endpoint page | Readable presentation of that operation's contract. | If a permission, example, or rule is absent from these sources, the agent should mark it as unknown. It must not invent one from the endpoint name. ## Recommended instruction ```text Implement this operation from the attached guide and OpenAPI. Preserve the method, path, operationId, parameters, and schemas. Do not invent fields, permissions, responses, or examples. Distinguish Admin, Storefront, and Auth. Before retrying, check whether the operation is idempotent. ``` ## Workflow 1. Choose one API and one operation. 2. Attach the workflow guide and the OpenAPI fragment for that operation. 3. Ask for a typed client that uses only fields from the contract. 4. Run it with development credentials and data. 5. Compare the actual request and response with the published contract. An operation appearing in OpenAPI does not grant access. Use published security and the server response; do not assume permission names the contract does not declare. Do not share a `client_secret`, access token, personal data, or production response in the prompt. Replace values before attaching examples. --- # Authentication Request, use, and renew OAuth tokens without mixing applications and API keys. Canonical: https://docs.ecomiq.pe/en/docs/guides/authentication [Auth](/en/docs/auth) issues OAuth 2.0 tokens. Protected endpoints receive the token in `Authorization`; public endpoints do not need one. Check the security section for each operation in the reference. ## Application credentials An OAuth application created in the dashboard provides a `client_id` and `client_secret`. The secret identifies a server, so it must not reach a browser or a distributed application. An API key created with `POST /v1/api-keys` belongs to the UCP service, whose reference is not published yet. It cannot be used at `/connect/token`, and no [Admin](/en/docs/admin), [Storefront](/en/docs/storefront), or [Auth](/en/docs/auth) operation accepts it. Use the Bearer token shown by each operation for those APIs. ## Token for an Admin integration Use `client_credentials` and include the `api_admin` scope: ```bash curl -X POST https://auth.ecomiq.pe/connect/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials" \ -d "client_id=$ECOMIQ_CLIENT_ID" \ -d "client_secret=$ECOMIQ_CLIENT_SECRET" \ -d "scope=api_admin" ``` ```json { "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6...", "token_type": "Bearer", "expires_in": 3600 } ``` `expires_in` is the lifetime in seconds for that response. Calculate expiration from this value instead of assuming a fixed duration. ## Use the token ```bash curl "https://api.ecomiq.pe/api/v1/catalog/products?limit=25" \ -H "Authorization: Bearer $ECOMIQ_TOKEN" ``` Admin also needs store context and, when applicable, seller context. In the public workflow documented here, that context comes from token claims. See [Context and hierarchy](/en/docs/guides/hierarchy). ## Grants | Grant | Use | | -------------------- | ------------------------------------------------------------------------------------------------------- | | `client_credentials` | A server acts as the application. It requires a confidential client and does not create a user session. | | `authorization_code` | A user signs in and authorizes an application configured for this flow. | | `refresh_token` | Renews a session when the application and issued token support this grant. | | `password` | Only explicitly configured first-party clients. Do not use it for third-party integrations. | The application defines which grants and scopes it accepts. Do not send a grant only because it appears in this table. ## Renewal `client_credentials` does not need a refresh token: request another access token before the current one expires. Cache the token per process and use a short margin to avoid sending it while it expires. ```ts let cached: { token: string; expiresAt: number } | undefined; export async function getToken(): Promise { if (cached && Date.now() < cached.expiresAt - 60_000) { return cached.token; } const body = new URLSearchParams({ grant_type: "client_credentials", client_id: process.env.ECOMIQ_CLIENT_ID!, client_secret: process.env.ECOMIQ_CLIENT_SECRET!, scope: "api_admin", }); const response = await fetch("https://auth.ecomiq.pe/connect/token", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body, }); if (!response.ok) throw new Error(`OAuth HTTP ${response.status}`); const payload = await response.json(); cached = { token: payload.access_token, expiresAt: Date.now() + payload.expires_in * 1000, }; return cached.token; } ``` Coordinate renewal if several processes share credentials. This prevents a burst of simultaneous token requests. ## Authentication failures - `401` means the endpoint did not receive a valid credential. - `403` means the identity was accepted, but a policy, scope, permission, or context blocked the operation. - `/connect/token` returns OAuth errors such as `invalid_client` or `invalid_grant`; do not assume it uses Problem Details or a `code` field. Do not log the token, secret, or complete body of an OAuth response. --- # Changelog Evolution of Ecomiq public contracts and the documentation portal. Canonical: https://docs.ecomiq.pe/en/docs/guides/changelog ## July 2026 - New self-service portal for the [Admin](/en/docs/admin), [Storefront](/en/docs/storefront), and [Auth](/en/docs/auth) APIs. - Canonical Markdown per page, `llms.txt`, and downloadable OpenAPI contracts. - Lifecycle and visibility represented as explicit operation metadata. - Navigation organized by API, context, and resource. This log starts in July 2026 and does not reconstruct earlier changes. An operation's lifecycle label describes its current state; it does not establish a support or removal timeline by itself. --- # Error codes Partial catalog of application codes and their confirmed HTTP status. Canonical: https://docs.ecomiq.pe/en/docs/guides/error-codes It includes application codes explicitly associated with one HTTP status in a public Admin, Storefront, or Auth route. It is not exhaustive per endpoint: responses originating in dependent services, framework validation, OAuth, or infrastructure are excluded. 1 code was omitted because it is associated with more than one HTTP status; it will not be published until the contract is unambiguous. ## Brand | Code | HTTP | | --- | --- | | `Brand.AlreadyExists` | `409` | | `Brand.HasProducts` | `409` | | `Brand.NotFound` | `404` | ## Brands | Code | HTTP | | --- | --- | | `Brands.ImportSaveFailed` | `500` | ## Carts | Code | HTTP | | --- | --- | | `Carts.NotActive` | `400` | | `Carts.NotFound` | `404` | | `Carts.ReceiptEmpty` | `400` | | `Carts.ReceiptInvalidContent` | `400` | | `Carts.ReceiptInvalidType` | `400` | | `Carts.ReceiptTooLarge` | `400` | ## Catalog | Code | HTTP | | --- | --- | | `Catalog.InsufficientStock` | `400` | | `Catalog.ProductNotFound` | `404` | | `Catalog.SpreadsheetSaveQueueFailed` | `500` | | `Catalog.VariantNotFound` | `404` | ## Categories | Code | HTTP | | --- | --- | | `Categories.DuplicatedIds` | `400` | | `Categories.ImportSaveFailed` | `500` | | `Categories.InvalidHierarchy` | `400` | | `Categories.Mismatch` | `400` | | `Categories.NotFound` | `404` | | `Categories.PathUpdateFailed` | `400` | | `Categories.UpdateFailed` | `400` | ## Category | Code | HTTP | | --- | --- | | `Category.HasProducts` | `409` | | `Category.HasSubcategories` | `409` | | `Category.NotFound` | `404` | | `Category.SlugExists` | `409` | ## Channel | Code | HTTP | | --- | --- | | `Channel.Forbidden` | `403` | | `Channel.NotEnabled` | `400` | | `Channel.NotFound` | `404` | ## Collection | Code | HTTP | | --- | --- | | `Collection.Exists` | `409` | | `Collection.InvalidType` | `400` | | `Collection.NotFound` | `404` | | `Collection.SlugExists` | `409` | ## Collections | Code | HTTP | | --- | --- | | `Collections.ImportSaveFailed` | `500` | ## Common | Code | HTTP | | --- | --- | | `Common.BadRequest` | `400` | | `Common.Forbidden` | `403` | | `Common.NotFound` | `404` | ## Connector | Code | HTTP | | --- | --- | | `Connector.Error` | `500` | ## Customer | Code | HTTP | | --- | --- | | `Customer.EmailAlreadyExists` | `409` | | `Customer.EmailInUse` | `409` | | `Customer.NotFound` | `404` | ## CustomerAddress | Code | HTTP | | --- | --- | | `CustomerAddress.NotFound` | `404` | ## CustomerGroup | Code | HTTP | | --- | --- | | `CustomerGroup.AlreadyExists` | `409` | | `CustomerGroup.CustomersNotFound` | `404` | | `CustomerGroup.NotFound` | `404` | ## Customers | Code | HTTP | | --- | --- | | `Customers.NotFound` | `404` | | `Customers.ProfileRequired` | `400` | | `Customers.SpreadsheetSaveQueueFailed` | `500` | ## Export | Code | HTTP | | --- | --- | | `Export.InvalidFormat` | `400` | | `Export.SaveFailed` | `500` | ## FulfillmentOrders | Code | HTTP | | --- | --- | | `FulfillmentOrders.NoConnection` | `400` | | `FulfillmentOrders.NotFound` | `404` | | `FulfillmentOrders.TenantRequired` | `400` | | `FulfillmentOrders.UserRequired` | `400` | ## GetCustomerSpreadsheet | Code | HTTP | | --- | --- | | `GetCustomerSpreadsheet.NotFound` | `404` | ## GetOrderSpreadsheet | Code | HTTP | | --- | --- | | `GetOrderSpreadsheet.NotFound` | `404` | ## GetProductSpreadsheet | Code | HTTP | | --- | --- | | `GetProductSpreadsheet.NotFound` | `404` | ## GetVariantSpreadsheet | Code | HTTP | | --- | --- | | `GetVariantSpreadsheet.NotFound` | `404` | ## Holiday | Code | HTTP | | --- | --- | | `Holiday.NotFound` | `404` | ## Import | Code | HTTP | | --- | --- | | `Import.ContentTypeRequired` | `400` | | `Import.SaveFailed` | `500` | ## Inventory | Code | HTTP | | --- | --- | | `Inventory.AvailableUnderflow` | `400` | | `Inventory.Changed` | `409` | | `Inventory.ExportSaveFailed` | `500` | | `Inventory.ImportSaveFailed` | `500` | | `Inventory.NotFound` | `404` | | `Inventory.NotTracked` | `409` | | `Inventory.OnHandUnderflow` | `400` | | `Inventory.StockBatchQueueFailed` | `500` | | `Inventory.VariantNotFound` | `404` | ## Invitation | Code | HTTP | | --- | --- | | `Invitation.NotFound` | `404` | ## Listing | Code | HTTP | | --- | --- | | `Listing.AlreadyExists` | `409` | | `Listing.AlreadyPublished` | `400` | | `Listing.AlreadyUnpublished` | `400` | | `Listing.NotFound` | `404` | | `Listing.SyncInvariantFailed` | `500` | ## Listings | Code | HTTP | | --- | --- | | `Listings.TooManyProducts` | `400` | ## Location | Code | HTTP | | --- | --- | | `Location.CannotDeleteDefault` | `409` | | `Location.CodeExists` | `409` | | `Location.HasInventory` | `409` | | `Location.HasOpenFulfillment` | `409` | | `Location.NotFound` | `404` | ## Locations | Code | HTTP | | --- | --- | | `Locations.NotFound` | `404` | ## Member | Code | HTTP | | --- | --- | | `Member.NotFound` | `404` | | `Member.OwnerProtected` | `409` | | `Member.SelfDelete` | `409` | ## Moderation | Code | HTTP | | --- | --- | | `Moderation.ProductsNotFound` | `404` | | `Moderation.SellerNotAllowed` | `403` | ## ModifierGroup | Code | HTTP | | --- | --- | | `ModifierGroup.AlreadyExists` | `409` | | `ModifierGroup.NotFound` | `404` | ## ModifierOption | Code | HTTP | | --- | --- | | `ModifierOption.NotFound` | `400` | ## Order | Code | HTTP | | --- | --- | | `Order.NotFound` | `404` | ## OrderBump | Code | HTTP | | --- | --- | | `OrderBump.NotFound` | `404` | | `OrderBump.VariantNotFound` | `404` | ## OrderClaim | Code | HTTP | | --- | --- | | `OrderClaim.NotFound` | `404` | ## OrderDrafts | Code | HTTP | | --- | --- | | `OrderDrafts.AuthenticationRequired` | `401` | | `OrderDrafts.InvalidShareExpiration` | `400` | | `OrderDrafts.InvalidStatus` | `400` | | `OrderDrafts.ItemNotFound` | `404` | | `OrderDrafts.NotFound` | `404` | | `OrderDrafts.ShareNotAvailable` | `404` | | `OrderDrafts.ShareNotFound` | `404` | | `OrderDrafts.ShareTokenGenerationFailed` | `500` | ## Orders | Code | HTTP | | --- | --- | | `Orders.AlreadyExists` | `409` | | `Orders.BatchStatus.SaveFailed` | `500` | | `Orders.InvalidReturnTransition` | `409` | | `Orders.InvoicePermissionRequired` | `403` | | `Orders.ItemSpreadsheetSaveQueueFailed` | `500` | | `Orders.NotFound` | `404` | | `Orders.ReturnCompleted` | `409` | ## Package | Code | HTTP | | --- | --- | | `Package.InvalidState` | `400` | | `Package.NameExists` | `409` | | `Package.NotFound` | `404` | ## ParentCategory | Code | HTTP | | --- | --- | | `ParentCategory.NotFound` | `404` | ## Payments | Code | HTTP | | --- | --- | | `Payments.ConnectionNotFound` | `404` | | `Payments.DuplicateMethod` | `400` | | `Payments.MethodNotAvailable` | `400` | | `Payments.MethodNotFound` | `400` | | `Payments.MethodNotSupported` | `400` | | `Payments.MethodProviderNotAllowed` | `400` | | `Payments.ProviderMethodCodeNotSupported` | `400` | | `Payments.ProviderRequired` | `400` | ## PickupPoint | Code | HTTP | | --- | --- | | `PickupPoint.InvalidLocation` | `400` | | `PickupPoint.NotFound` | `404` | ## PriceList | Code | HTTP | | --- | --- | | `PriceList.InvalidCategory` | `400` | | `PriceList.InvalidProduct` | `400` | | `PriceList.InvalidVariant` | `400` | | `PriceList.NotFound` | `404` | ## Product | Code | HTTP | | --- | --- | | `Product.BundleItemsRequired` | `400` | | `Product.NotFound` | `404` | ## ProductReview | Code | HTTP | | --- | --- | | `ProductReview.AlreadyExists` | `409` | | `ProductReview.NotFound` | `404` | | `ProductReview.OrderInvalid` | `400` | | `ProductReview.OrderOwnerMismatch` | `400` | | `ProductReview.ProductNotPurchased` | `400` | ## Products | Code | HTTP | | --- | --- | | `Products.BatchDeleteCountMismatch` | `400` | | `Products.BatchDeleteSaveFailed` | `500` | | `Products.BatchPriceSaveFailed` | `500` | | `Products.BatchStatusSaveFailed` | `500` | | `Products.ImportOperationNotFound` | `500` | | `Products.SpreadsheetSaveQueueFailed` | `500` | ## Seller | Code | HTTP | | --- | --- | | `Seller.ContextInvalid` | `403` | | `Seller.NotFound` | `404` | | `Seller.OwnerEmailRequired` | `400` | | `Seller.SlugExists` | `409` | | `Seller.SlugInvalid` | `400` | | `Seller.StoreTypeInvalid` | `400` | ## SellerCommission | Code | HTTP | | --- | --- | | `SellerCommission.DuplicateBrand` | `400` | | `SellerCommission.DuplicateCategory` | `400` | | `SellerCommission.InvalidBrand` | `400` | | `SellerCommission.InvalidCategory` | `400` | ## Sellers | Code | HTTP | | --- | --- | | `Sellers.NotFound` | `404` | ## SellerScope | Code | HTTP | | --- | --- | | `SellerScope.DuplicateBrand` | `400` | | `SellerScope.DuplicateCategory` | `400` | | `SellerScope.InvalidBrand` | `400` | | `SellerScope.InvalidCategory` | `400` | ## Shipments | Code | HTTP | | --- | --- | | `Shipments.ConnectorFailed` | `500` | | `Shipments.LabelFailed` | `500` | | `Shipments.MultipleFulfillmentOrders` | `400` | | `Shipments.NoConnection` | `400` | | `Shipments.NoFulfillmentOrder` | `400` | | `Shipments.NotFound` | `404` | | `Shipments.TrackingFailed` | `500` | ## Shipping | Code | HTTP | | --- | --- | | `Shipping.CustomizationNotFound` | `404` | | `Shipping.DefaultProfileCannotBeDeleted` | `400` | | `Shipping.DisabledForSeller` | `403` | | `Shipping.InvalidLocations` | `400` | | `Shipping.MethodNotAllowedForSeller` | `403` | | `Shipping.ProfileExists` | `409` | | `Shipping.ProfileInUseByCustomizations` | `400` | | `Shipping.ProfileInUseByMethods` | `400` | | `Shipping.ProfileInUseByProducts` | `400` | | `Shipping.ProfileNotFound` | `404` | | `Shipping.ProfilesDisabledForSeller` | `403` | | `Shipping.RateAboveSellerMaximum` | `403` | | `Shipping.RateBelowSellerMinimum` | `403` | | `Shipping.RatesDisabledForSeller` | `403` | | `Shipping.TransitDaysExceeded` | `403` | ## ShippingMethod | Code | HTTP | | --- | --- | | `ShippingMethod.InvalidPickupPoints` | `400` | | `ShippingMethod.NoConnection` | `400` | | `ShippingMethod.NotFound` | `404` | ## ShippingMethods | Code | HTTP | | --- | --- | | `ShippingMethods.GroupNotFound` | `400` | | `ShippingMethods.GroupRequired` | `400` | | `ShippingMethods.InvalidType` | `400` | | `ShippingMethods.MethodNotAvailable` | `400` | | `ShippingMethods.NameRequired` | `400` | | `ShippingMethods.NoShippableItems` | `400` | | `ShippingMethods.NotFound` | `404` | | `ShippingMethods.OptionAmbiguous` | `400` | | `ShippingMethods.OptionNotFound` | `400` | | `ShippingMethods.RateMismatch` | `400` | | `ShippingMethods.RateNotFound` | `400` | | `ShippingMethods.Required` | `400` | | `ShippingMethods.SelectorRequired` | `400` | ## ShippingRate | Code | HTTP | | --- | --- | | `ShippingRate.NotFound` | `404` | ## ShippingRates | Code | HTTP | | --- | --- | | `ShippingRates.ImportAssetNotFound` | `404` | | `ShippingRates.ImportInvalidFile` | `400` | | `ShippingRates.ImportInvalidHeaders` | `400` | | `ShippingRates.ImportInvalidRows` | `400` | ## ShippingSettings | Code | HTTP | | --- | --- | | `ShippingSettings.InvalidDefaultLocation` | `400` | ## ShippingZone | Code | HTTP | | --- | --- | | `ShippingZone.CodeExists` | `409` | | `ShippingZone.NotFound` | `404` | ## SizeGuide | Code | HTTP | | --- | --- | | `SizeGuide.Forbidden` | `403` | | `SizeGuide.Inactive` | `400` | | `SizeGuide.NotFound` | `404` | | `SizeGuide.SellerMismatch` | `400` | ## SizeGuides | Code | HTTP | | --- | --- | | `SizeGuides.ImportSaveFailed` | `500` | ## Specification | Code | HTTP | | --- | --- | | `Specification.HasCategorySpecifications` | `409` | | `Specification.InUseByProducts` | `409` | | `Specification.InUseByVariants` | `409` | | `Specification.NotFound` | `404` | | `Specification.SellerNotAllowed` | `403` | ## Store | Code | HTTP | | --- | --- | | `Store.AccessContext` | `500` | | `Store.AccessDenied` | `401` | | `Store.AccessKeyNotConfigured` | `400` | | `Store.AccessKeyRequired` | `400` | | `Store.CustomerAccountsScopeInvalid` | `400` | | `Store.DomainAlreadyExists` | `400` | | `Store.DomainHostnameTaken` | `409` | | `Store.DomainInvalid` | `400` | | `Store.DomainNotFound` | `404` | | `Store.DomainSetupFailed` | `400` | | `Store.NotFound` | `404` | | `Store.SlugExists` | `409` | | `Store.SlugInvalid` | `400` | ## TaxOverride | Code | HTTP | | --- | --- | | `TaxOverride.NotFound` | `404` | ## TaxRegion | Code | HTTP | | --- | --- | | `TaxRegion.AlreadyExists` | `409` | | `TaxRegion.CountryExists` | `409` | | `TaxRegion.NotFound` | `404` | ## Template | Code | HTTP | | --- | --- | | `Template.DraftExists` | `409` | | `Template.Invalid` | `400` | | `Template.NotDraft` | `409` | | `Template.NotFound` | `404` | ## Tenant | Code | HTTP | | --- | --- | | `Tenant.Invalid` | `400` | ## User | Code | HTTP | | --- | --- | | `User.NotAuthenticated` | `401` | ## Variant | Code | HTTP | | --- | --- | | `Variant.NotFound` | `404` | ## VariantSpreadsheet | Code | HTTP | | --- | --- | | `VariantSpreadsheet.LocationNotFound` | `404` | ## WebhookEndpoint | Code | HTTP | | --- | --- | | `WebhookEndpoint.NotFound` | `404` | | `WebhookEndpoint.UrlExists` | `409` | ## Webhooks | Code | HTTP | | --- | --- | | `Webhooks.DeliveryNotFound` | `404` | | `Webhooks.DeliveryNotRetryable` | `409` | | `Webhooks.DeliveryPayloadMissing` | `409` | | `Webhooks.EndpointNotFound` | `404` | --- # Errors Distinguish application, OAuth, and infrastructure errors before retrying. Canonical: https://docs.ecomiq.pe/en/docs/guides/errors The format depends on what rejected the request. Errors produced by the application flow use Problem Details with a `code`; Auth, a limiter, or a gateway may return another structure. ## Application errors A domain or application error uses [Problem Details](https://www.rfc-editor.org/rfc/rfc9457): ```json { "title": "Not Found", "detail": "Product 7204558912004325377 does not exist.", "status": 404, "code": "Catalog.ProductNotFound" } ``` | Field | Use | | -------- | ---------------------------------------------------------- | | `title` | Human-readable error category. | | `detail` | Diagnostic explanation; it may change. | | `status` | Associated HTTP status. | | `code` | Application identifier for handling the case when present. | Use `code` to distinguish known cases and keep `status` as a fallback. Do not make decisions from the text in `detail`. ## Validation Validation errors may add an `errors` object with one or more messages per field: ```json { "title": "One or more validation errors occurred.", "status": 400, "code": "Common.Validation", "errors": { "limit": ["The limit must be between 1 and 200."] } } ``` Show these messages so the input can be fixed. Do not assume all endpoints accept the same range or use the same key. ## OAuth errors `POST /connect/token` follows the OAuth error format. A failure may look like this: ```json { "error": "invalid_client", "error_description": "The client credentials are invalid." } ``` Handle `error` and the HTTP status. Do not expect `title`, `status`, or `code` in this response. ## Infrastructure errors A gateway, request-rate limiter, or concurrency limiter may respond before the request reaches the application. Keep the status, headers, and any request identifier. Do not deserialize every error response into one mandatory model. Check the `Content-Type` and allow for an empty or different body. ## What to do by status | Status | Common meaning | First action | | ------ | -------------------------------------------------------------- | --------------------------------------------------------------- | | `400` | Invalid body, parameter, or transition. | Fix the request; do not repeat it unchanged. | | `401` | A valid credential is missing. | Get another credential and retry once if the operation is safe. | | `403` | A policy, scope, permission, or context blocked the operation. | Review authorization and context. | | `404` | The resource does not exist in the visible context. | Verify the identifier, store, and seller. | | `409` | Current state conflicts with the operation. | Read the resource and decide from the new state. | | `429` | A request-rate or concurrency limit was reached. | Honor `Retry-After` when present and wait. | | `5xx` | Temporary or internal failure. | Retry only when replaying the operation is safe. | The endpoint reference defines the meaning of a specific `code` and its declared responses. ## Retries A retryable status does not make the operation retryable. Before replaying, confirm the method is idempotent, an idempotency key exists, or you can check whether the first attempt completed. ```ts function mayRetry(response: Response, canReplay: boolean) { if (!canReplay) return false; return response.status === 429 || response.status >= 500; } ``` Use exponential backoff with jitter and a maximum number of attempts. Do not automatically retry a `POST` unless its contract documents idempotency. --- # Organization, store, and seller How Admin and Storefront determine the scope of each request. Canonical: https://docs.ecomiq.pe/en/docs/guides/hierarchy Commerce resources belong to an organization, a store, and, when applicable, a seller. The way you select that context depends on the API. ## The three levels **Organization.** Groups the account, plan, billing, users, and one or more stores. **Store.** Isolates catalog, orders, customers, and settings. It gets an `*.ecomiq.app` domain and may connect a custom domain. **Seller.** Identifies who owns an offer inside a store. A simple store usually has one seller; a marketplace may have several. ## How context is resolved | API | Store | Seller | | --------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------ | | [Admin](/en/docs/admin) | OAuth application and the token's `store_id` claim. | OAuth application and the token's `seller_id` claim. | | [Storefront](/en/docs/storefront) | Request host: an `*.ecomiq.app` subdomain or custom domain. | Determined by the store configuration. | | [Auth](/en/docs/auth) | Does not use a commerce domain to select a store. | Depends on the application or identity requesting the token. | A customer token on Storefront identifies the shopper when an operation needs one. It does not replace the domain that selects the store. ## Admin context An application bound to a store receives its authorized context in the token. Send that token as a bearer credential: ```bash curl "https://api.ecomiq.pe/api/v1/catalog/products?limit=25" \ -H "Authorization: Bearer $ECOMIQ_TOKEN" ``` The `store_id` and `seller_id` claims, when present, identify the authorized store and seller. To change stores, request a token with the OAuth application created for that other context. ## Storefront context Storefront resolves the store from the host: ```bash curl "https://mystore.ecomiq.app/api/v1/products?page=1&pageSize=24" ``` Use the assigned subdomain or the store's custom domain. Admin credentials do not select a public store. ## Identifiers and isolation An identifier is only useful inside its owning context. If a product exists but the request uses another store or seller, the operation must not expose it. After a `403` or `404`, verify the token, OAuth application, or Storefront domain before assuming the resource was deleted. You cannot move a resource between stores by changing its identifier. To replicate data, create or import the resource in the target store. ## Multiple stores Do not assume one token can operate on several stores. An OAuth application is usually bound to one store and seller. For another store, create an OAuth application with explicit access in that store and request a token with its credentials. Changing the domain does not change Admin context. ## Marketplaces In Admin, the authorized seller belongs to the application's context and, when applicable, appears in the `seller_id` claim. No query parameter expands this scope. In Storefront, the store and its configuration determine which offers are published. A shopper session cannot select an administrative seller. --- # Pagination Identify and walk the pagination strategy defined by each endpoint. Canonical: https://docs.ecomiq.pe/en/docs/guides/pagination Ecomiq does not use one pagination strategy. An operation may use `cursor`, `page` and `pageSize`, only `limit`, or no pagination. ## Identify the strategy Read the endpoint parameters and response schema. Do not send parameters that are absent from its contract. | Strategy | Common parameters | How to continue | | ------------- | ------------------ | ------------------------------------------------------------- | | Cursor | `cursor`, `limit` | Send the cursor returned by the previous response. | | Page | `page`, `pageSize` | Increase `page` until you reach the last page. | | Limit | `limit` | Returns a subset; it does not imply that a next page exists. | | No pagination | None | The operation returns its bounded collection in one response. | Filters, sorting, ranges, and defaults also vary by endpoint. The presence of `limit` does not guarantee cursor support. ## Cursor traversal A cursor response may include `data`, `hasNextPage`, and `nextCursor`. Use these fields only when they are part of the published schema. ```ts async function* walkByCursor(firstUrl: URL, token: string) { let cursor: string | undefined; do { const url = new URL(firstUrl); if (cursor) url.searchParams.set("cursor", cursor); const response = await fetch(url, { headers: { Authorization: `Bearer ${token}` }, }); if (!response.ok) throw new Error(`HTTP ${response.status}`); const page = await response.json(); yield* page.data; cursor = undefined; if (page.hasNextPage) { cursor = page.nextCursor; } } while (cursor); } ``` Send `nextCursor` back without parsing, changing, or constructing it. Do not use it with other filters, another store, or a different query. If the response does not publish `hasNextPage`, follow the condition documented for that endpoint. Do not infer the end from `totalCount` when that field may be null. ## Page traversal Storefront includes operations with `page` and `pageSize`. Keep the filters fixed and advance the page number according to the response fields. ```bash curl "https://mystore.ecomiq.app/api/v1/products?page=1&pageSize=24" ``` Do not replace `page` with a cursor or send `pageSize` to an operation that only declares `limit`. ## Limit-only queries An operation with `limit` may return recent records or a bounded list without a continuation mechanism. If you need more data, find a dedicated paginated operation; repeating the same request does not advance. ## Changes during traversal Keep filters, order, and context unchanged. If they change, start a new traversal. A collection may change while you traverse it. If you need a snapshot, check whether the endpoint offers a cutoff time, version, or export; pagination alone does not promise that isolation. --- # Rate limits Handle request-rate and concurrency limits without duplicating operations. Canonical: https://docs.ecomiq.pe/en/docs/guides/rate-limits Ecomiq does not apply one quota to every operation. The limit depends on the API and the policy attached to the endpoint. ## What can produce 429 | Limit type | What it controls | | ------------ | ------------------------------------------------------------------------ | | Global | Overall request volume from a client or address. | | Per endpoint | Sensitive flows such as authentication, writes, analytics, or callbacks. | | Concurrency | How many expensive operations may run at the same time. | A `429 Too Many Requests` response may come from any of these layers. Do not infer a universal number from one endpoint or environment. When the response includes `Retry-After`, use it as the minimum wait. Otherwise, use exponential backoff with random jitter. ## Safe retry ```ts async function retryAfter429( request: () => Promise, canReplay: boolean, ) { for (let attempt = 0; attempt < 4; attempt += 1) { const response = await request(); if (response.status !== 429 || !canReplay) return response; const retryAfter = response.headers.get("retry-after"); const fallback = Math.min(30_000, 500 * 2 ** attempt); let delay = fallback + Math.random() * 250; if (retryAfter !== null) { const seconds = Number(retryAfter); if (Number.isFinite(seconds)) { delay = seconds * 1000; } } await new Promise((resolve) => setTimeout(resolve, delay)); } throw new Error("Rate limit persisted after 4 attempts"); } ``` `canReplay` must come from the operation contract. Enable it only for a read, an idempotent operation, or a write protected by an idempotency key. Also cap the total number of attempts. If several workers share credentials, coordinate their wait so they do not send the same burst again. ## Imports An accepted import runs asynchronously. Keep its identifier and query the status endpoint; do not upload the file again to check progress. Submitting or validating an import can return `429`, including from a concurrency limit. Wait and retry only after confirming that the operation was not accepted. ## Reduce pressure - Use the largest page size supported by that endpoint. - Limit client concurrency; a local queue is often enough. - Cache data that changes infrequently, such as categories or zones. - Use [webhooks](/en/docs/guides/webhooks) when the event you need exists. - Avoid fixed-interval polling; increase the interval when nothing changes. Published defaults and headers may vary across APIs. Build the client around the actual response, not an assumed shared quota. --- # Set up a server integration Create an OAuth application, request api_admin, and make your first Admin call. Canonical: https://docs.ecomiq.pe/en/docs/guides/setup This guide configures a server-to-server [Admin](/en/docs/admin) integration. You need access to the Ecomiq dashboard and a store the application is allowed to operate on. ## 1. Select the store Open the store in the [Ecomiq dashboard](https://admin.ecomiq.pe). The OAuth application you create will be bound to the context authorized for that store. The public store gets an `*.ecomiq.app` subdomain and may use a custom domain. That domain selects Storefront context, not Admin context. ## 2. Create an OAuth application Create an integration application from the selected store. The dashboard provides two credentials: | Credential | Use | | --------------- | --------------------------------------------------- | | `client_id` | Identifies the OAuth application. | | `client_secret` | Authenticates your server when it requests a token. | Store them in a secrets manager. Never put `client_secret` in browser JavaScript, a mobile app, versioned files, or application logs. `POST /v1/api-keys` creates an API key. It does not create an OAuth application, and its value cannot be used as a `client_id` or `client_secret` at `/connect/token`. These keys belong to the UCP service, whose reference is not published yet. The [Admin](/en/docs/admin), [Storefront](/en/docs/storefront), and [Auth](/en/docs/auth) APIs use Bearer tokens. ## 3. Request a token Send a form to [Auth](/en/docs/auth/token) with the `client_credentials` grant and the `api_admin` scope: ```bash curl -X POST https://auth.ecomiq.pe/connect/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials" \ -d "client_id=$ECOMIQ_CLIENT_ID" \ -d "client_secret=$ECOMIQ_CLIENT_SECRET" \ -d "scope=api_admin" ``` ```json { "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6...", "token_type": "Bearer", "expires_in": 3600 } ``` Use `expires_in` to calculate expiration. Do not hard-code the token lifetime. ## 4. Call Admin Send the token as a bearer credential: ```bash curl "https://api.ecomiq.pe/api/v1/catalog/products?limit=25" \ -H "Authorization: Bearer $ECOMIQ_TOKEN" ``` Admin gets its authorized context from the application and token claims such as `store_id` and `seller_id`. The Admin host does not select the store. To operate on another store, create an OAuth application there with its own access. ## Verification - The token request includes `scope=api_admin`. - The secret exists only on the server or in a secrets manager. - The application was created in the correct store and context. - The implementation uses the parameters and responses in the endpoint reference. ## Next steps - [Authentication](/en/docs/guides/authentication): Renewal, grants, and OAuth failures. - [Context](/en/docs/guides/hierarchy): How Admin and Storefront select a store. - [Admin API](/en/docs/admin): Published operations and schemas. --- # Webhooks Webhook endpoint setup, delivery behavior, and event payload fields. Canonical: https://docs.ecomiq.pe/en/docs/guides/webhooks You can subscribe to 37 events across 5 categories. Each JSON body matches the model shown for that event; there is no shared envelope. ## Configure the endpoint Register an endpoint for the store with `POST /v1/webhooks/endpoints`. The URL must use HTTPS, be publicly reachable, and not resolve to a private or local network. On creation, Ecomiq sends `webhook.endpoint.test`. The endpoint is saved only when that request returns `2xx` within the 15-second timeout. | Requirement | Value | | --- | --- | | Scheme | `https` | | Maximum length | 2048 characters | | Uniqueness | The same URL cannot repeat in the current store and seller scope | | Successful response | Any `2xx` | | Timeout | 15 seconds | ### Delivery headers | Header | Content | | --- | --- | | `X-Ecomiq-Event` | Event type, such as `catalog.product.created` | | `X-Ecomiq-Delivery` | Delivery UUID | | `X-Ecomiq-Timestamp` | Attempt time in Unix seconds | | `X-Ecomiq-Signature` | `sha256=`, only when a secret is configured | ### Verify the signature When you configure a `secret`, Ecomiq signs the raw body with HMAC-SHA256 and encodes the result as lowercase hexadecimal. Verify the signature before parsing JSON. ```ts import { createHmac, timingSafeEqual } from "node:crypto" export function isValidSignature(rawBody: string, header: string, secret: string) { const expected = createHmac("sha256", secret).update(rawBody).digest("hex") const received = header.replace(/^sha256=/, "") const a = Buffer.from(expected, "hex") const b = Buffer.from(received, "hex") return a.length === b.length && timingSafeEqual(a, b) } ``` ### Additional authentication You can configure credentials for Ecomiq to include on every request. You can also add fixed headers with `headers`. | Type | Required configuration | | --- | --- | | `Basic` | `Username` and `Password` | | `Bearer` | `Token` | | `OAuth2` | Public HTTPS `TokenUrl`, `ClientId`, and `ClientSecret` | ## Delivery and retries Delivery is at least once. A failure can repeat the same event with the same `X-Ecomiq-Delivery`; process it idempotently and store that identifier only after your work completes. A successful response resets the failure counter. After 10 consecutive failed attempts, Ecomiq pauses the endpoint. Fix the receiver, then call `POST /v1/webhooks/endpoints/{id}/enable`. Re-enqueue a failed delivery with `POST /v1/webhooks/deliveries/{id}/retry`. A manual retry keeps the original body and creates a new `X-Ecomiq-Delivery`. ## Available events ### Catalog | Event | Model | | --- | --- | | `catalog.product.created` | [`ProductChangedWebhookModel`](#payload-product-changed-webhook-model) | | `catalog.product.updated` | [`ProductChangedWebhookModel`](#payload-product-changed-webhook-model) | | `catalog.product.deleted` | [`ProductDeletedWebhookModel`](#payload-product-deleted-webhook-model) | | `catalog.product.status_changed` | [`ProductStatusChangedWebhookModel`](#payload-product-status-changed-webhook-model) | | `catalog.stock.changed` | [`StockChangedWebhookModel`](#payload-stock-changed-webhook-model) | | `catalog.inventory.batch_processed` | [`InventoryBatchProcessedWebhookModel`](#payload-inventory-batch-processed-webhook-model) | | `catalog.price.changed` | [`PriceChangedWebhookModel`](#payload-price-changed-webhook-model) | | `catalog.brand.created` | [`BrandWebhookModel`](#payload-brand-webhook-model) | | `catalog.brand.updated` | [`BrandWebhookModel`](#payload-brand-webhook-model) | | `catalog.brand.deleted` | [`BrandDeletedWebhookModel`](#payload-brand-deleted-webhook-model) | | `catalog.category.created` | [`CategoryWebhookModel`](#payload-category-webhook-model) | | `catalog.category.updated` | [`CategoryWebhookModel`](#payload-category-webhook-model) | | `catalog.category.deleted` | [`CategoryDeletedWebhookModel`](#payload-category-deleted-webhook-model) | | `catalog.collection.created` | [`CollectionWebhookModel`](#payload-collection-webhook-model) | | `catalog.collection.updated` | [`CollectionWebhookModel`](#payload-collection-webhook-model) | | `catalog.collection.deleted` | [`CollectionDeletedWebhookModel`](#payload-collection-deleted-webhook-model) | ### Channels | Event | Model | | --- | --- | | `channel.listing.published` | [`ListingPublishedWebhookModel`](#payload-listing-published-webhook-model) | | `channel.listing.price_changed` | [`ListingPriceChangedWebhookModel`](#payload-listing-price-changed-webhook-model) | | `channel.created` | [`ChannelCreatedWebhookModel`](#payload-channel-created-webhook-model) | | `channel.sales.enabled` | [`ChannelStateWebhookModel`](#payload-channel-state-webhook-model) | | `channel.deleted` | [`ChannelDeletedWebhookModel`](#payload-channel-deleted-webhook-model) | ### Customers | Event | Model | | --- | --- | | `customer.created` | [`CustomerWebhookModel`](#payload-customer-webhook-model) | ### Carts | Event | Model | | --- | --- | | `cart.created` | [`CartCreatedWebhookModel`](#payload-cart-created-webhook-model) | | `cart.updated` | [`CartUpdatedWebhookModel`](#payload-cart-updated-webhook-model) | | `cart.completed` | [`CartCompletedWebhookModel`](#payload-cart-completed-webhook-model) | | `cart.item_added` | [`CartItemWebhookModel`](#payload-cart-item-webhook-model-cart-item-added) | | `cart.item_removed` | [`CartItemWebhookModel`](#payload-cart-item-webhook-model-cart-item-removed) | ### Orders | Event | Model | | --- | --- | | `order.confirmed` | [`OrderWebhookModel`](#payload-order-webhook-model) | | `order.invoiced` | [`OrderWebhookModel`](#payload-order-webhook-model) | | `order.in_progress` | [`OrderWebhookModel`](#payload-order-webhook-model) | | `order.ready_to_pick_up` | [`OrderWebhookModel`](#payload-order-webhook-model) | | `order.in_transit` | [`OrderWebhookModel`](#payload-order-webhook-model) | | `order.delivered` | [`OrderWebhookModel`](#payload-order-webhook-model) | | `order.cancelled` | [`OrderWebhookModel`](#payload-order-webhook-model) | | `order.returned` | [`OrderWebhookModel`](#payload-order-webhook-model) | | `order.closed` | [`OrderWebhookModel`](#payload-order-webhook-model) | | `order.invalidated` | [`OrderWebhookModel`](#payload-order-webhook-model) | ## Payload fields The current runtime uses `PascalCase` names and serializes snowflake IDs as JSON `int64` numbers. In JavaScript, use a parser that preserves 64-bit integers: `Number` can lose precision. ### ProductChangedWebhookModel Events: `catalog.product.created` · `catalog.product.updated` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `SellerId` | `integer (int64)` | Yes | Seller identifier when the product belongs to a seller | | `ProductId` | `integer (int64)` | No | Product identifier | | `Product` | `object` | No | Product payload | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | | `TargetChannelIds` | `integer[] (int64)` | No | Channels targeted by the product event | | `ChangeType` | `string` | No | Whether the change was created or updated | ### ProductDeletedWebhookModel Events: `catalog.product.deleted` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `ProductId` | `integer (int64)` | No | Product identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `SellerId` | `integer (int64)` | No | Seller identifier | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### ProductStatusChangedWebhookModel Events: `catalog.product.status_changed` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `ProductId` | `integer (int64)` | No | Product identifier | | `SellerId` | `integer (int64)` | No | Seller identifier | | `IsActive` | `boolean` | No | Whether the product is active | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### StockChangedWebhookModel Events: `catalog.stock.changed` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `ProductId` | `integer (int64)` | No | Product identifier | | `VariantId` | `integer (int64)` | No | Variant identifier | | `LocationId` | `integer (int64)` | No | Location identifier | | `AvailableQuantity` | `integer` | No | Available stock quantity | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### InventoryBatchProcessedWebhookModel Events: `catalog.inventory.batch_processed` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `Mode` | `string` | No | Batch adjustment mode | | `AdjustmentsCount` | `integer` | No | Number of adjusted inventory lines | | `ProductsCount` | `integer` | No | Number of affected products | | `VariantsCount` | `integer` | No | Number of affected variants | | `LocationsCount` | `integer` | No | Number of affected locations | | `Lines` | `array` | No | Adjusted inventory lines | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### PriceChangedWebhookModel Events: `catalog.price.changed` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `ProductId` | `integer (int64)` | No | Product identifier | | `SellerId` | `integer (int64)` | No | Seller identifier | | `Price` | `number (decimal)` | No | Current product price | | `CompareAtPrice` | `number (decimal)` | Yes | Original comparison price | | `Currency` | `string` | No | Currency code | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### BrandWebhookModel Events: `catalog.brand.created` · `catalog.brand.updated` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `BrandId` | `integer (int64)` | No | Brand identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `Name` | `string` | No | Brand name | | `Slug` | `string` | No | Brand slug | | `IsActive` | `boolean` | Yes | Whether the brand is active | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### BrandDeletedWebhookModel Events: `catalog.brand.deleted` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `BrandId` | `integer (int64)` | No | Brand identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### CategoryWebhookModel Events: `catalog.category.created` · `catalog.category.updated` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `CategoryId` | `integer (int64)` | No | Category identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `Name` | `string` | No | Category name | | `Slug` | `string` | No | Category slug | | `ParentId` | `integer (int64)` | Yes | Parent category identifier | | `IsActive` | `boolean` | Yes | Whether the category is active | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### CategoryDeletedWebhookModel Events: `catalog.category.deleted` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `CategoryId` | `integer (int64)` | No | Category identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### CollectionWebhookModel Events: `catalog.collection.created` · `catalog.collection.updated` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `CollectionId` | `integer (int64)` | No | Collection identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `Name` | `string` | No | Collection name | | `Slug` | `string` | No | Collection slug | | `Description` | `string` | Yes | Collection description | | `Status` | `string` | No | Collection status | | `Type` | `string` | No | Collection type | | `DynamicOperator` | `string` | No | Dynamic rule operator | | `ValidFrom` | `string (date-time)` | Yes | Collection start date | | `ValidTo` | `string (date-time)` | Yes | Collection end date | | `ImageUrl` | `string` | Yes | Collection image URL | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### CollectionDeletedWebhookModel Events: `catalog.collection.deleted` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `CollectionId` | `integer (int64)` | No | Collection identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### ListingPublishedWebhookModel Events: `channel.listing.published` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `ListingId` | `integer (int64)` | No | Listing identifier | | `ChannelId` | `integer (int64)` | No | Channel identifier | | `ProductId` | `integer (int64)` | No | Product identifier | | `ExternalId` | `string` | No | External listing identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `SellerId` | `integer (int64)` | No | Seller identifier | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### ListingPriceChangedWebhookModel Events: `channel.listing.price_changed` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `ListingId` | `integer (int64)` | No | Listing identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `SellerId` | `integer (int64)` | No | Seller identifier | | `ChannelId` | `integer (int64)` | No | Channel identifier | | `ProductId` | `integer (int64)` | No | Product identifier | | `ExternalId` | `string` | Yes | External listing identifier | | `OldPrice` | `number (decimal)` | No | Previous listing price | | `NewPrice` | `number (decimal)` | No | New listing price | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### ChannelCreatedWebhookModel Events: `channel.created` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `ChannelId` | `integer (int64)` | No | Channel identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `SellerId` | `integer (int64)` | Yes | Seller identifier | | `Name` | `string` | No | Channel name | | `IntegrationId` | `string` | No | Provider identifier | | `ChannelType` | `string` | No | Channel type | | `IsPrincipal` | `boolean` | No | Whether the channel is the principal channel | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### ChannelStateWebhookModel Events: `channel.sales.enabled` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `ChannelId` | `integer (int64)` | No | Channel identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `SellerId` | `integer (int64)` | Yes | Seller identifier | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### ChannelDeletedWebhookModel Events: `channel.deleted` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `ChannelId` | `integer (int64)` | No | Channel identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `SellerId` | `integer (int64)` | Yes | Seller identifier | | `ConnectionId` | `integer (int64)` | No | Connection identifier | | `ProviderId` | `string` | No | Provider identifier | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### CustomerWebhookModel Events: `customer.created` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `CustomerId` | `integer (int64)` | No | Customer identifier | | `Email` | `string` | Yes | Customer email | | `FirstName` | `string` | Yes | Customer first name | | `LastName` | `string` | Yes | Customer last name | | `CustomerType` | `string` | No | Customer type | | `CustomerStatus` | `string` | No | Customer status | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### CartCreatedWebhookModel Events: `cart.created` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `CartId` | `integer (int64)` | No | Cart identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `CurrencyCode` | `string` | No | Currency code | | `CreatedBy` | `string (uuid)` | No | Actor identifier | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### CartUpdatedWebhookModel Events: `cart.updated` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `CartId` | `integer (int64)` | No | Cart identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `UpdatedBy` | `string (uuid)` | No | Actor identifier | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### CartCompletedWebhookModel Events: `cart.completed` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `CartId` | `integer (int64)` | No | Cart identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `TotalAmount` | `number (decimal)` | No | Cart total amount | | `CurrencyCode` | `string` | No | Currency code | | `CompletedBy` | `string (uuid)` | No | Actor identifier | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### CartItemWebhookModel — `cart.item_added` Events: `cart.item_added` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `CartId` | `integer (int64)` | No | Cart identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `CartItemId` | `integer (int64)` | No | Cart item identifier | | `ProductId` | `integer (int64)` | No | Product identifier | | `VariantId` | `integer (int64)` | No | Variant identifier | | `Quantity` | `integer` | No | Quantity added | | `UnitPrice` | `number (decimal)` | No | Unit price | | `ActorId` | `string (uuid)` | Yes | Actor identifier | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### CartItemWebhookModel — `cart.item_removed` Events: `cart.item_removed` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `CartId` | `integer (int64)` | No | Cart identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `CartItemId` | `integer (int64)` | No | Cart item identifier | | `ProductId` | `integer (int64)` | No | Product identifier | | `VariantId` | `integer (int64)` | No | Variant identifier | | `Quantity` | `integer` | Yes | Always null when an item is removed | | `UnitPrice` | `number (decimal)` | Yes | Always null when an item is removed | | `ActorId` | `string (uuid)` | Yes | Actor identifier | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | ### OrderWebhookModel Events: `order.confirmed` · `order.invoiced` · `order.in_progress` · `order.ready_to_pick_up` · `order.in_transit` · `order.delivered` · `order.cancelled` · `order.returned` · `order.closed` · `order.invalidated` | Field | JSON type | Nullable | Description | | --- | --- | --- | --- | | `OrderId` | `integer (int64)` | No | Order identifier | | `TenantId` | `integer (int64)` | No | Tenant identifier | | `StoreId` | `integer (int64)` | No | Store identifier | | `SellerId` | `integer (int64)` | Yes | Seller identifier when the order belongs to a seller | | `CustomerId` | `integer (int64)` | Yes | Customer identifier | | `OrderNumber` | `string` | No | Order number | | `OrderGroup` | `string` | Yes | Order group identifier | | `Status` | `string` | No | Legacy order status for compatibility | | `State` | `string` | No | Current order lifecycle state | | `FulfillmentStatus` | `string` | No | Current fulfillment status | | `ReturnStatus` | `string` | No | Current return status | | `CurrencyCode` | `string` | No | Currency code | | `SubTotal` | `number (decimal)` | No | Order subtotal | | `Shipping` | `number (decimal)` | No | Shipping amount | | `Tax` | `number (decimal)` | No | Tax amount | | `Total` | `number (decimal)` | No | Order total | | `Email` | `string` | Yes | Customer email | | `FirstName` | `string` | Yes | Customer first name | | `LastName` | `string` | Yes | Customer last name | | `CancelReason` | `string` | Yes | Cancellation reason | | `TrackingCode` | `string` | Yes | Tracking number | | `TrackingUrl` | `string` | Yes | Tracking URL | | `CarrierName` | `string` | Yes | Carrier name | | `OrderDate` | `string (date-time)` | No | Order date | | `OccurredOn` | `string (date-time)` | No | Event occurrence date | --- # Storefront SDK Our React micro-framework for building Ecomiq stores with SSR routes, Storefront API, checkout, and Cloudflare Workers deployment. Canonical: https://docs.ecomiq.pe/en/docs/sdk `@ecomiq/storefront` is our micro-framework for building Ecomiq stores with React. It generates routes and the SSR server from `pages/`; its loaders and server functions call the Storefront API. It also includes providers and hooks for store settings, menus, and cart, plus flows for checkout, authentication, customer accounts, and CMS pages. The CLI handles the local environment, production builds, and deployment to Cloudflare Workers. You maintain this project structure: The CLI generates `.ecomiq/` with the router, SSR server, and build configuration. Do not edit or commit that directory. ## What it includes - SSR routes generated from `pages/`, with a global layout and file-based parameters. - Loaders and server functions that call Storefront API through `serverApi`. - Providers and hooks for settings, menus, cart, and authentication. - Included flows for checkout, CMS pages, and the account area. - Commands for development, builds, cleanup, and deployment to Cloudflare Workers. ## Public imports | Import | Use it for | | ------------------------------- | -------------------------------------------------------------------- | | `@ecomiq/storefront` | Pages, layout, data, providers, hooks, types, and authentication. | | `@ecomiq/storefront/config` | `defineConfig` and complete configuration types. | | `@ecomiq/storefront/ui` | `Button`, `Card`, `Badge`, `Skeleton`, `Separator`, and other bases. | | `@ecomiq/storefront/styles.css` | Framework styles; the CLI includes them automatically. | The `@ecomiq/storefront/internal/*` imports are for code generated in `.ecomiq/`. Do not use them in a store. ## Basic workflow 1. [Install the package](/en/docs/sdk/installation). 2. Set the store `domain` in [configuration](/en/docs/sdk/configuration). 3. Create pages with `definePage`. 4. Run `ecomiq dev`. 5. Publish with `ecomiq deploy`. `domain` identifies the store consumed by the project. The name, SEO, currency, menus, and checkout rules come from [Storefront API](/en/docs/storefront) through [`GET /v1/settings`](/en/docs/storefront/content-and-storefront/settings/all-store-settings). --- # Customer accounts Configure Better Auth, sign-in, registration, and generated account routes. Canonical: https://docs.ecomiq.pe/en/docs/sdk/account Accounts are optional for browsing and guest checkout. Sign-in, profiles, addresses, and orders require Better Auth and the same-origin proxy. ## 1. Authentication server ```ts title="lib/auth.ts" import { createStorefrontAuth } from "@ecomiq/storefront"; export const auth = createStorefrontAuth(); ``` Expose its handler: ```ts title="pages/api/auth.$.ts" import { auth } from "../../lib/auth"; type ApiHandlerArgs = { request: Request; }; async function handle({ request }: ApiHandlerArgs) { return auth.handler(request); } export const GET = handle; export const POST = handle; ``` You must also create `pages/api/$.ts` with `proxyStorefrontRequest`, as shown in [pages and routes](/en/docs/sdk/pages). ## 2. Client and provider ```ts title="lib/auth-client.ts" import { createStorefrontAuthClient } from "@ecomiq/storefront"; export const authClient = createStorefrontAuthClient(); ``` The layout must mount `AuthProvider`. If you use cart and checkout, mount both: ```tsx title="layout.tsx" import { AuthProvider, CartProvider, defineLayout } from "@ecomiq/storefront"; import { authClient } from "./lib/auth-client"; export default defineLayout(({ children, settings }) => ( {children} )); ``` The default layout does not install these providers. ## 3. Session ```tsx import { useAuth } from "@ecomiq/storefront"; export function SessionButton({ email, password, }: { email: string; password: string; }) { const { session, isPending, signIn, signOut } = useAuth(); if (isPending) return Loading…; if (!session?.user) { return ( ); } return ; } ``` ## 4. Registration `registerCustomer` requires the proxy client: ```ts import { createStorefrontProxyApi, registerCustomer } from "@ecomiq/storefront"; await registerCustomer(createStorefrontProxyApi(), { email: "andrea@example.com", password: "a-secure-password", firstName: "Andrea", lastName: "Ramos", countryIsoCode: "US", phone: "+1 555 0100", }); ``` After registration, call `signIn` to create the session. ## Account routes The framework generates and protects: - `/account/` — profile. - `/account/addresses` — addresses. - `/account/orders` and `/account/orders/:orderId` — orders. - `/account/devices` — informational screen; the devices endpoint does not exist yet. `/login` and `/register` are not generated. You must create them under `pages/`. The `getCustomerMe`, `patchCustomer`, `getCustomerAddresses`, `createCustomerAddress`, `updateCustomerAddress`, `deleteCustomerAddress`, `getCustomerOrders`, and `getCustomerOrder` helpers receive an `Api` first: ```ts import { createStorefrontProxyApi, getCustomerMe } from "@ecomiq/storefront"; const customer = await getCustomerMe(createStorefrontProxyApi()); ``` ## Server variables | Variable | Use | | --------------------------- | ----------------------------------------------------------------- | | `BETTER_AUTH_SECRET` | Session secret; configure it as a production secret. | | `STOREFRONT_API_URL` | API used for sign-in; defaults to `https://storefront.ecomiq.pe`. | | `BETTER_AUTH_TRUSTED_HOSTS` | Comma-separated allowed hosts; normally optional. | `api.baseUrl` in `ecomiq.config.js` configures `serverApi`, but Better Auth sign-in uses `STOREFRONT_API_URL`. When targeting another environment, point both values to the same API. --- # Cart Mount CartProvider and manage the cart persisted in Storefront API. Canonical: https://docs.ecomiq.pe/en/docs/sdk/cart The SDK cart is not a separate local store. `CartProvider` keeps the session identifier in `localStorage` and loads the real cart from Storefront API. ## 1. Mount the provider ```tsx title="layout.tsx" import { CartProvider, defineLayout } from "@ecomiq/storefront"; export default defineLayout(({ children, settings }) => ( {children} )); ``` The local key is `ecomiq:cart:v1:{storeId}`, so the session is isolated by store. Only the identifier is persisted; prices, inventory, and totals are reloaded from the API. ## 2. Add a variant ```tsx import { useCart } from "@ecomiq/storefront"; export function AddToCartButton({ variantId }: { variantId: string }) { const { addItem, mutation, error } = useCart(); const isAdding = mutation?.kind === "adding"; return ( <> {error ?

{error}

: null} ); } ``` `variantId` is the positive decimal ID returned on a `ProductDetail` variant. ## 3. Create the cart page `/cart` is not a framework-owned route; create your own UI: ```tsx title="pages/cart.tsx" import { definePage, Link, useCart } from "@ecomiq/storefront"; export default definePage({ meta: () => ({ title: "Cart", noIndex: true }), component: CartPage, }); function CartPage() { const { cart, itemCount, loadStatus, removeItem } = useCart(); if (loadStatus === "loading") return

Loading…

; if (!cart?.items.length) return

Your cart is empty.

; return (

{itemCount} products

{cart.items.map((item) => (
{item.title} × {item.quantity}
))} Go to checkout
); } ``` ## useCart contract | Field or action | Use | | ------------------- | ---------------------------------- | | `cart`, `cartId` | Loaded cart and active identifier. | | `itemCount` | Sum of item quantities. | | `loadStatus` | `loading`, `ready`, or `error`. | | `mutation`, `error` | State of the latest operation. | | `addItem` | Adds `{ variantId, quantity }`. | | `setItemQuantity` | Changes a line's quantity. | | `removeItem` | Removes a line. | | `reload` | Reloads the cart from the API. | | `clearCart` | Deletes the current local session. | To use the included checkout, also add `AuthProvider` as described in the [checkout guide](/en/docs/sdk/checkout). --- # Checkout Use the framework-generated checkout and understand its actual requirements. Canonical: https://docs.ecomiq.pe/en/docs/sdk/checkout The framework already generates these routes: - `/checkout/` redirects to `/cart`. - `/checkout/:checkoutId` renders the purchase flow. - `/thank-you` renders the confirmation. Do not create `pages/checkout.*` or `pages/thank-you.tsx`; those routes are reserved. ## Requirements Checkout always calls `useAuth` and `useCart`, even when the store allows guest checkout. Your layout must mount both providers: ```tsx title="layout.tsx" import { AuthProvider, CartProvider, defineLayout } from "@ecomiq/storefront"; import { authClient } from "./lib/auth-client"; export default defineLayout(({ children, settings }) => ( {children} )); ``` You also need: - `lib/auth-client.ts` with `createStorefrontAuthClient`. - The `pages/api/$.ts` proxy. - The `pages/api/auth.$.ts` handler. The [accounts guide](/en/docs/sdk/account) includes those files. ## Send the shopper to checkout ```tsx import { Link, useCart } from "@ecomiq/storefront"; export function CheckoutButton() { const { cart } = useCart(); if (!cart) return null; return ( Continue to checkout ); } ``` Checkout reads `settings.store.checkoutSettings.general.allowGuestCheckout`. If guest checkout is disabled and no session exists, it redirects to `/login?redirect=/checkout/{id}`. You must create the `/login` and `/register` pages. ## Low-level API For an alternative flow, `serverApi` exposes the real operations. Each receives one object that includes `cartId`: ```ts await serverApi.patchCartBuyer({ cartId, email: "andrea@example.com", firstName: "Andrea", lastName: "Ramos", phone: "+1 555 0100", }); const shipping = await serverApi.getShippingOptions({ cartId, postalCode: "10001", }); const rate = shipping.groups[0]?.rates[0]; if (rate) { await serverApi.putCartShippingMethod({ cartId, rateId: rate.rateId, shippingMethodId: rate.shippingMethodId, }); } const result = await serverApi.checkoutCart({ cartId, paymentMethodCode: "bank_transfer", externalRef: crypto.randomUUID(), }); ``` `getCartCheckout`, `patchCartAddresses`, `uploadPaymentReceipt`, `addCartPromotionCode`, and `removeCartPromotionCode` are also available. The included UI opens a redirect URL when returned by the API and supports manual receipts. It does not yet mount an embedded Stripe or Mercado Pago UI when the provider returns only a `clientSecret`. Test the selected payment method end to end before publishing. --- # CLI Run, build, deploy, and clean an Ecomiq store. Canonical: https://docs.ecomiq.pe/en/docs/sdk/cli The package installs the `ecomiq` binary. Run it from the project root, where `ecomiq.config.js` and `pages/` are located. | Command | What it does | | --------------- | ---------------------------------------------------- | | `ecomiq dev` | Generates the internal app and starts SSR with HMR. | | `ecomiq build` | Builds for Cloudflare Workers in `.ecomiq/dist`. | | `ecomiq deploy` | Builds again and publishes the Worker with Wrangler. | | `ecomiq clean` | Deletes only the generated `.ecomiq` directory. | With the recommended scripts: ```bash pnpm dev pnpm build pnpm deploy pnpm clean ``` You can also invoke the binary directly: ```bash pnpm exec ecomiq dev ``` ## Development `ecomiq dev` uses Node, port `3000`, and HTTP by default. Change those values in `ecomiq.config.js`, not with flags: ```js dev: { port: 3100, runtime: "workerd", https: true, } ``` The CLI watches `pages/` and regenerates routes when files are created, renamed, or deleted. It ignores hidden files, `__tests__`, and `*.test.*` or `*.spec.*` files. ## Generated files `.ecomiq/` contains the router, server entry, styles, route manifest, and Wrangler configuration. It is a disposable build artifact. If it becomes stale after a version change: ```bash pnpm clean pnpm dev ``` The current CLI has no `init`, `create`, or flags such as `--port` or `--name`. Configure the project in `ecomiq.config.js`. --- # Configuration The real ecomiq.config.js reference for store, API, theme, development, and deployment. Canonical: https://docs.ecomiq.pe/en/docs/sdk/configuration The CLI loads `ecomiq.config.js` from the project root and validates its default export. `defineConfig` is recommended because it adds types and runs the same validation. ```js title="ecomiq.config.js" import { defineConfig } from "@ecomiq/storefront/config"; export default defineConfig({ domain: "marketplace", api: { baseUrl: "https://storefront.ecomiq.pe", version: "v1", timeoutMs: 10_000, }, theme: { primary: "oklch(0.45 0.15 165)", primaryForeground: "white", radius: "0.75rem", }, dev: { port: 3000, runtime: "node", https: true, }, deploy: { target: "cloudflare", name: "andina-market", routes: [{ pattern: "shop.example.com", custom_domain: true }], }, env: { PUBLIC_SUPPORT_EMAIL: "support@example.com", }, }); ``` ## Fields | Field | Required | Use | | -------- | -------- | ------------------------------------------------------------- | | `domain` | Yes | Identity sent as `x-Store-Domain`; accepts a slug or domain. | | `api` | No | Storefront API URL, version, additional headers, and timeout. | | `theme` | No | Visual variables that override the design system. | | `dev` | No | Port, local API, runtime, and HTTPS for `ecomiq dev`. | | `deploy` | No | Cloudflare Worker name and routes. | | `env` | No | Non-secret variables written to the Worker's `vars`. | `domain` is not the store name, editorial slug, or SEO configuration. Those values come from `/v1/settings`. ## API and defaults | Field | Default | | --------------- | -------------------------------- | | `api.baseUrl` | `https://storefront.ecomiq.pe` | | `api.version` | `v1` | | `api.timeoutMs` | `10000` ms | | `dev.port` | `3000` | | `dev.runtime` | `node` | | `dev.https` | `false` | | `deploy.target` | `cloudflare` | | `deploy.name` | A normalized version of `domain` | `dev.apiBaseUrl` overrides `api.baseUrl` only in development. `dev.runtime: "workerd"` emulates Cloudflare locally; build and deploy always use `workerd`. For HTTPS, use an automatic certificate or provide PEM files: ```js dev: { https: true, } ``` ```js dev: { https: { cert: "./certs/localhost.pem", key: "./certs/localhost-key.pem", }, } ``` ## Theme `theme` accepts only `primary`, `primaryForeground`, `background`, `foreground`, `accent`, and `radius`. The CLI turns them into CSS variables. ## What reaches the browser The client bundle receives only: ```ts type PublicEcomiqConfig = { domain: string; theme?: EcomiqThemeConfig; }; ``` `api`, `dev`, `deploy`, and `env` remain on the server. `env` is written as plain text to the generated Wrangler configuration. Use Cloudflare Secrets for keys, tokens, and `BETTER_AUTH_SECRET`. --- # Build and deployment Build and publish a store to Cloudflare Workers with the CLI. Canonical: https://docs.ecomiq.pe/en/docs/sdk/deploy Cloudflare Workers is the available target. `ecomiq build` and `ecomiq deploy` always build with the `workerd` runtime, even when development uses Node. ## Configuration ```js title="ecomiq.config.js" import { defineConfig } from "@ecomiq/storefront/config"; export default defineConfig({ domain: "marketplace", deploy: { target: "cloudflare", name: "andina-market", routes: [{ pattern: "shop.example.com", custom_domain: true }], }, env: { PUBLIC_SUPPORT_EMAIL: "support@example.com", }, }); ``` When `deploy.name` is omitted, the CLI derives the name from `domain`. `deploy.routes` accepts the same shapes as Wrangler's `routes`: - A string. - `{ pattern, zone_id, custom_domain? }`. - `{ pattern, zone_name, custom_domain? }`. - `{ pattern, custom_domain, enabled?, previews_enabled? }`. ## Build ```bash pnpm build ``` The output is written to `.ecomiq/dist`. The CLI also generates the server entry and Wrangler configuration. Do not edit them. ## Deployment Authenticate Wrangler with a local session or `CLOUDFLARE_API_TOKEN`, then run: ```bash pnpm deploy ``` `deploy` performs a fresh build and then runs `wrangler deploy` with the generated configuration. ## Variables and secrets `env` is written to the Worker's `vars` and is visible as plain-text configuration. Use it only for non-sensitive values. Configure tokens, private keys, and `BETTER_AUTH_SECRET` as Cloudflare Secrets, not inside `ecomiq.config.js`. ## Health checks The generated Worker responds on: | Route | Use | | ------------------ | ------------------------------------------ | | `/ping` | Simple check; returns `ok`. | | `/__ecomiq/health` | Also verifies that settings can be loaded. | There is no `--name`, `--env`, `--route`, or `--dry-run`. Declare the name, routes, and variables in `ecomiq.config.js`. --- # Installation Create the minimum structure for an @ecomiq/storefront project. Canonical: https://docs.ecomiq.pe/en/docs/sdk/installation ## 1. Install dependencies ```bash npm install @ecomiq/storefront react react-dom npm install --save-dev typescript @types/node @types/react @types/react-dom ``` ```bash pnpm add @ecomiq/storefront react react-dom pnpm add -D typescript @types/node @types/react @types/react-dom ``` The package requires React 19. Use ESM and add the CLI scripts to `package.json`: ```json title="package.json" { "private": true, "type": "module", "scripts": { "dev": "ecomiq dev", "build": "ecomiq build", "deploy": "ecomiq deploy", "clean": "ecomiq clean" } } ``` ## 2. Identify the store The CLI looks specifically for `ecomiq.config.js` at the project root: ```js title="ecomiq.config.js" import { defineConfig } from "@ecomiq/storefront/config"; export default defineConfig({ domain: "marketplace", }); ``` `domain` can be a slug (`marketplace`) or a domain (`marketplace.ecomiq.app` or `marketplace.com`). ## 3. Create the first page ```tsx title="pages/index.tsx" import { definePage } from "@ecomiq/storefront"; export default definePage({ meta: () => ({ title: "Home" }), component: ({ settings }) => (

{settings.store.name}

{settings.store.description}

), }); ``` ## 4. Start the server ```bash npm run dev ``` ```bash pnpm dev ``` The CLI generates `.ecomiq/` and serves the store with SSR and HMR. Add the directory to `.gitignore`: ```text title=".gitignore" .ecomiq/ ``` The CLI has no `init` or `create` command. The project must contain `ecomiq.config.js` and at least one `.tsx` or `.jsx` page under `pages/`. --- # Pages and routes Create SSR routes with pages/, definePage, and serverApi. Canonical: https://docs.ecomiq.pe/en/docs/sdk/pages The CLI turns files under `pages/` into routes. Do not configure TanStack Router or Vite manually. | File | Route | | --------------------------------- | ------------------------ | | `pages/index.tsx` | `/` | | `pages/products.index.tsx` | `/products/` | | `pages/products.$productSlug.tsx` | `/products/:productSlug` | | `pages/api/$.ts` | `/api/*` | UI pages use `.tsx` or `.jsx`. API routes use `.ts` and can export `GET`, `POST`, `PUT`, `PATCH`, and `DELETE` handlers. ## Page with data ```tsx title="pages/products.$productSlug.tsx" import { definePage, serverApi, stripHtml, z, type ProductDetail, } from "@ecomiq/storefront"; const SearchSchema = z.object({ sellerId: z.string().uuid().optional(), }); type ProductSearch = z.infer; export default definePage< ProductDetail, { productSlug: string }, ProductSearch >({ validateSearch: (raw) => SearchSchema.parse(raw), loader: ({ params, search }) => serverApi.getProductBySlug(params.productSlug, { sellerId: search.sellerId, }), meta: ({ data }) => ({ title: data.name, description: stripHtml(data.description).slice(0, 155), ogImage: data.images[0]?.url || data.imageUrl, }), component: ({ data, settings }) => (

{settings.store.name}

{data.name}

{data.price} {settings.store.currency}

), }); ``` `loader` receives `{ params, search, config }`. `component` receives `{ data, params, search, settings }`. URL search changes rerun the loader by default; use `reloadOnSearch: false` when handling them on the client. `definePage` also accepts: - `preload` - `loading` - `error` - `meta` with `title`, `description`, `ogImage`, `noIndex`, `meta`, and `jsonLd` ## Global layout `layout.tsx` is optional. When present, it replaces the framework's basic layout: ```tsx title="layout.tsx" import { defineLayout, Link, useMenu } from "@ecomiq/storefront"; export default defineLayout(({ children, settings }) => { const main = useMenu("main"); return ( <>
{settings.store.name}
{children}
); }); ``` ## Same-origin proxy Customer accounts use an `/api/*` proxy. The starter defines it as follows: ```ts title="pages/api/$.ts" import { proxyStorefrontRequest } from "@ecomiq/storefront"; type ApiHandlerArgs = { request: Request; params: { _splat?: string }; }; async function handle({ request, params }: ApiHandlerArgs) { return proxyStorefrontRequest(request, params._splat); } export const GET = handle; export const POST = handle; export const PUT = handle; export const PATCH = handle; export const DELETE = handle; ``` ## Reserved routes The framework generates and protects these routes: - `/checkout/` and `/checkout/:checkoutId` - `/thank-you` - `/pages/:pageSlug` - `/account/`, `/account/addresses`, and `/account/orders` - `/account/orders/:orderId` and `/account/devices` Do not create files under `pages/` that try to replace them. `/account/devices` is currently an informational screen: there is no endpoint for listing devices yet. --- # Catalog and search Query products, facets, details, related items, and autocomplete with serverApi. Canonical: https://docs.ecomiq.pe/en/docs/sdk/search `serverApi` runs Storefront API queries as server functions. Use it in loaders to return HTML with data in the first response. ## Results page ```tsx title="pages/products.index.tsx" import { definePage, serverApi, z, type ProductsResponse, } from "@ecomiq/storefront"; const ProductSearchSchema = z.object({ q: z.string().optional(), page: z.coerce.number().int().positive().catch(1), }); type ProductSearch = z.infer; export default definePage< ProductsResponse, Record, ProductSearch >({ validateSearch: (raw) => ProductSearchSchema.parse(raw), loader: ({ search }) => serverApi.getProducts({ search: search.q, page: search.page, pageSize: 24, }), meta: ({ search }) => ({ title: search.q ? `Results for ${search.q}` : "Products", }), component: ({ data }) => (

{data.totalCount} products

{data.products.map((product) => (

{product.name}

{product.price}

))}
), }); ``` ## Methods | Method | Result | | ------------------------------------------- | ------------------------------ | | `serverApi.getProducts(params)` | Paginated products and facets. | | `serverApi.getProductBySlug(slug, params?)` | Product details. | | `serverApi.getRelatedProducts(params)` | Related products. | | `serverApi.autocompleteProducts(params)` | Short search suggestions. | | `serverApi.getCollections()` | Visible collections. | | `serverApi.getCollectionBySlug(slug)` | One collection by slug. | ## Product filters `getProducts` accepts: - `page` — defaults to `1`. - `pageSize` — defaults to `24`, maximum `100`. - `sort` — `price_asc`, `price_desc`, `name_asc`, `name_desc`, or `newest`. - `search`, `sellerId`, and `locationId`. - `collection`, `collections`, and `collectionId`. - `category`, `categories`, `brand`, and `brands`. - `productType`, `productTypes`, `tag`, and `tags`. - `filters`, `inStock`, `minPrice`, and `maxPrice`. The response contains `pageIndex`, `pageSize`, `totalCount`, `totalPages`, `products`, and `filters`. ## Autocomplete ```ts const suggestions = await serverApi.autocompleteProducts({ search: "cof", limit: 8, }); ``` `search` must contain 2 to 80 characters. `limit` defaults to `8` and cannot exceed `20`. In Ecomiq pages, prefer `serverApi`. It keeps the upstream URL and operational headers out of the client bundle. --- # Store, menus, and CMS Read the /v1/settings snapshot and the store's published content. Canonical: https://docs.ecomiq.pe/en/docs/sdk/settings The generated root loads `/v1/settings` before rendering. That snapshot is available to every page and layout; you do not need to create a provider. ## Snapshot structure | Field | Content | | --------------- | --------------------------------------------------------------------- | | `schemaVersion` | Contract version `1` or `2`. | | `generatedAt` | Generation date. | | `store` | Identity, domains, currency, language, theme, features, and checkout. | | `cms.settings` | Branding, SEO, contact, tracking, and scripts. | | `cms.pages` | CMS pages included in the snapshot. | | `cms.menus` | Published menus. | ## In a page `settings` is passed directly to `component`: ```tsx title="pages/about.tsx" import { definePage } from "@ecomiq/storefront"; export default definePage({ component: ({ settings }) => (

{settings.store.name}

{settings.store.description}

{settings.store.currency}

), }); ``` ## In a component Use `useSettings` inside the generated application tree: ```tsx import { useSettings } from "@ecomiq/storefront"; export function StoreLogo() { const settings = useSettings(); const logo = settings.cms.settings.branding.logoUrl ?? settings.store.logo; return logo ? ( {settings.store.name} ) : ( {settings.store.name} ); } ``` ## Menus `useMenu` finds a menu by `key`, excludes items with `visible: false`, and sorts them by `order`: ```tsx import { Link, useMenu } from "@ecomiq/storefront"; export function MainMenu() { const items = useMenu("main"); return items.map((item) => ( {item.label} )); } ``` ## CMS pages To find a published page inside the snapshot: ```ts import { findStorefrontCmsPageBySlug } from "@ecomiq/storefront"; const page = findStorefrontCmsPageBySlug(settings, "home"); ``` To request a page by slug from Storefront API: ```ts import { serverApi } from "@ecomiq/storefront"; const page = await serverApi.getPageBySlug("about"); ``` The reserved `/pages/:pageSlug` route uses `getPageBySlug`; it does not rely only on the snapshot. `ecomiq.config.js` contains operational settings. The store name, SEO, menus, currency, and business rules belong to `/v1/settings`. --- # Storefront API Query the public catalog and operate carts, checkout, and customer accounts. Canonical: https://docs.ecomiq.pe/en/docs/storefront Query the public catalog and operate carts, customers, fulfillment, and orders for a store. ## API areas - [Content & Storefront](/en/docs/storefront/content-and-storefront): Public catalog, search, navigation, and storefront settings. - [Carts & Checkout](/en/docs/storefront/orders-and-checkout): Carts, checkout, drafts, and customer order lookup. - [Customers](/en/docs/storefront/customers): Customer profile, addresses, login, registration, and password recovery. - [Geography](/en/docs/storefront/fulfillment-and-shipping): Countries, departments, provinces, districts, and other areas in the geographic catalog. - [Analytics](/en/docs/storefront/analytics-and-operations): Product views, cart actions, and checkout events recorded for merchant analytics. --- # Analytics Product views, cart actions, and checkout events recorded for merchant analytics. Canonical: https://docs.ecomiq.pe/en/docs/storefront/analytics-and-operations - [Analytics](/en/docs/storefront/analytics-and-operations/analytics): Record storefront browsing and commerce events. --- # Analytics Record storefront browsing and commerce events. Canonical: https://docs.ecomiq.pe/en/docs/storefront/analytics-and-operations/analytics | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/analytics/events`](/en/docs/storefront/analytics-and-operations/analytics/track-commerce-analytics-events) | Track commerce analytics events | --- # Track commerce analytics events Records commerce events from the storefront — product views, add to cart, checkout steps — that feed the merchant's analytics. Canonical: https://docs.ecomiq.pe/en/docs/storefront/analytics-and-operations/analytics/track-commerce-analytics-events ## Track commerce analytics events `POST /v1/analytics/events` Lifecycle: **stable** Records commerce events from the storefront — product views, add to cart, checkout steps — that feed the merchant's analytics. ### Request body Content-Type: `application/json` · required #### Fields - `events` (array) ### Responses - `202`: Accepted — application/json, AnalyticsTrackEventsResponse - `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://storefront.ecomiq.pe/api/v1/analytics/events' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Content & Storefront Public catalog, search, navigation, and storefront settings. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront - [Products](/en/docs/storefront/content-and-storefront/products): Search published products and inspect details, related items, and reviews. - [Categories](/en/docs/storefront/content-and-storefront/categories): List the categories visible in the storefront. - [Collections](/en/docs/storefront/content-and-storefront/collections): List published collections and retrieve one by slug. - [Brands](/en/docs/storefront/content-and-storefront/brands): List the brands visible in the storefront. - [Search](/en/docs/storefront/content-and-storefront/search): Get product suggestions while the shopper types. - [Menus](/en/docs/storefront/content-and-storefront/menus): List active menus and retrieve one by key. - [Pages](/en/docs/storefront/content-and-storefront/pages): List published CMS pages and retrieve one by slug. - [Site Settings](/en/docs/storefront/content-and-storefront/site-settings): Read the site's active CMS settings. - [Settings](/en/docs/storefront/content-and-storefront/settings): Read the storefront's public operational settings. - [Store Locations](/en/docs/storefront/content-and-storefront/store-locations): List public store locations and inspect their details. - [Access](/en/docs/storefront/content-and-storefront/access): Validate the access password for a private storefront. --- # Access Validate the access password for a private storefront. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/access | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/access/unlock`](/en/docs/storefront/content-and-storefront/access/unlock-private-storefront) | Unlock private storefront | --- # Unlock private storefront Grants access to a storefront that is not public yet. Used for stores behind a password while they are being prepared. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/access/unlock-private-storefront ## Unlock private storefront `POST /v1/access/unlock` Lifecycle: **stable** Grants access to a storefront that is not public yet. Used for stores behind a password while they are being prepared. ### Request body Content-Type: `application/json` · required #### Fields - `accessKey` (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 POST \ --url 'https://storefront.ecomiq.pe/api/v1/access/unlock' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Brands List the brands visible in the storefront. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/brands | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/brands`](/en/docs/storefront/content-and-storefront/brands/list-storefront-brands) | List storefront brands | --- # List storefront brands Lists the brands present in the published catalog. Useful to build a brand filter outside the facets of a search. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/brands/list-storefront-brands ## List storefront brands `GET /v1/brands` Lifecycle: **stable** Lists the brands present in the published catalog. Useful to build a brand filter outside the facets of a search. ### Parameters - `SellerId` (query, string) - `Search` (query, string) - `Sort` (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://storefront.ecomiq.pe/api/v1/brands' ``` --- # Categories List the categories visible in the storefront. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/categories | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/categories`](/en/docs/storefront/content-and-storefront/categories/list-storefront-categories) | List storefront categories | --- # List storefront categories Lists the categories of the published catalog, in the hierarchy the merchant defined. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/categories/list-storefront-categories ## List storefront categories `GET /v1/categories` Lifecycle: **stable** Lists the categories of the published catalog, in the hierarchy the merchant defined. ### Parameters - `SellerId` (query, string) - `Search` (query, string) - `Sort` (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://storefront.ecomiq.pe/api/v1/categories' ``` --- # Collections List published collections and retrieve one by slug. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/collections | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/collections`](/en/docs/storefront/content-and-storefront/collections/list-storefront-collections) | List storefront collections | | `GET` | [`/v1/collections/{slug}`](/en/docs/storefront/content-and-storefront/collections/get-storefront-collection-by-slug) | Get storefront collection by slug | --- # Get storefront collection by slug Returns one collection with its name, description and media. The products it contains are fetched from the catalog search using the collection filter. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/collections/get-storefront-collection-by-slug ## Get storefront collection by slug `GET /v1/collections/{slug}` Lifecycle: **stable** Returns one collection with its name, description and media. The products it contains are fetched from the catalog search using the collection filter. ### Parameters - `slug` (path, string, required): URL-friendly identifier. - `sellerId` (query, string) ### Responses - `200`: OK — application/json, CollectionItem - `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://storefront.ecomiq.pe/api/v1/collections/{slug}' ``` --- # List storefront collections Lists the published collections. They drive the navigation menu and the landing pages of the store. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/collections/list-storefront-collections ## List storefront collections `GET /v1/collections` Lifecycle: **stable** Lists the published collections. They drive the navigation menu and the landing pages of the store. ### Parameters - `SellerId` (query, string) - `Search` (query, string) - `Sort` (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://storefront.ecomiq.pe/api/v1/collections' ``` --- # Menus List active menus and retrieve one by key. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/menus | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/menus`](/en/docs/storefront/content-and-storefront/menus/list-active-menus) | List active menus | | `GET` | [`/v1/menus/{key}`](/en/docs/storefront/content-and-storefront/menus/get-active-menu-by-key) | Get active menu by key | --- # Get active menu by key Returns one menu by its key, with its items in order. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/menus/get-active-menu-by-key ## Get active menu by key `GET /v1/menus/{key}` Lifecycle: **stable** Returns one menu by its key, with its items in order. ### Parameters - `key` (path, string, required) ### Responses - `200`: OK — application/json, Item - `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://storefront.ecomiq.pe/api/v1/menus/{key}' ``` --- # List active menus Lists the active menus. They also arrive inside the store settings snapshot. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/menus/list-active-menus ## List active menus `GET /v1/menus` Lifecycle: **stable** Lists the active menus. They also arrive inside the store settings snapshot. ### 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://storefront.ecomiq.pe/api/v1/menus' ``` --- # Pages List published CMS pages and retrieve one by slug. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/pages | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/pages`](/en/docs/storefront/content-and-storefront/pages/list-published-pages) | List published pages | | `GET` | [`/v1/pages/{slug}`](/en/docs/storefront/content-and-storefront/pages/get-published-page-by-slug) | Get published page by slug | --- # Get published page by slug Returns a published page by its slug, with its sections and blocks. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/pages/get-published-page-by-slug ## Get published page by slug `GET /v1/pages/{slug}` Lifecycle: **stable** Returns a published page by its slug, with its sections and blocks. ### Parameters - `slug` (path, string, required): URL-friendly identifier. ### Responses - `200`: OK — application/json, CmsPageDetailsDto - `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://storefront.ecomiq.pe/api/v1/pages/{slug}' ``` --- # List published pages Lists the published CMS pages. They also arrive inside the store settings snapshot. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/pages/list-published-pages ## List published pages `GET /v1/pages` Lifecycle: **stable** Lists the published CMS pages. They also arrive inside the store settings snapshot. ### 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://storefront.ecomiq.pe/api/v1/pages' ``` --- # Products Search published products and inspect details, related items, and reviews. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/products | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/products`](/en/docs/storefront/content-and-storefront/products/search-storefront-products) | Search storefront products | | `GET` | [`/v1/products/{slug}`](/en/docs/storefront/content-and-storefront/products/get-storefront-product-by-slug) | Get storefront product by slug | | `GET` | [`/v1/products/{productId}/related`](/en/docs/storefront/content-and-storefront/products/list-related-products) | List related products | | `POST` | [`/v1/products/{productId}/reviews`](/en/docs/storefront/content-and-storefront/products/create-storefront-product-review) | Create storefront product review | | `GET` | [`/v1/products/{productId}/reviews`](/en/docs/storefront/content-and-storefront/products/list-storefront-product-reviews) | List storefront product reviews | --- # Create storefront product review Submits a review for a product. It is not published immediately: the merchant moderates it first. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/products/create-storefront-product-review ## Create storefront product review `POST /v1/products/{productId}/reviews` Lifecycle: **stable** Submits a review for a product. It is not published immediately: the merchant moderates it first. ### 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) - `orderId` (string, required) ### Responses - `200`: OK — application/json, StorefrontReviewDto - `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://storefront.ecomiq.pe/api/v1/products/{productId}/reviews' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Get storefront product by slug Returns the full product page data: variants, media, specifications and stock. The slug is the one used in the storefront URL. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/products/get-storefront-product-by-slug ## Get storefront product by slug `GET /v1/products/{slug}` Lifecycle: **stable** Returns the full product page data: variants, media, specifications and stock. The slug is the one used in the storefront URL. ### Parameters - `slug` (path, string, required): URL-friendly identifier. - `sellerId` (query, string) ### Responses - `200`: OK — application/json, ProductDetail - `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://storefront.ecomiq.pe/api/v1/products/{slug}' ``` --- # List related products Returns products related to the given one, for the recommendation block of a product page. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/products/list-related-products ## List related products `GET /v1/products/{productId}/related` Lifecycle: **stable** Returns products related to the given one, for the recommendation block of a product page. ### Parameters - `productId` (path, string, required) - `limit` (query, integer (int32)): Maximum number of results to return. - `sellerId` (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://storefront.ecomiq.pe/api/v1/products/{productId}/related' ``` --- # List storefront product reviews Returns the approved reviews of a product, paginated by cursor. Reviews awaiting moderation are not included. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/products/list-storefront-product-reviews ## List storefront product reviews `GET /v1/products/{productId}/reviews` Lifecycle: **stable** Returns the approved reviews of a product, paginated by cursor. Reviews awaiting moderation are not included. ### 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`. - `rating` (query, integer (int32)) ### Responses - `200`: OK — application/json, CursorPaginatedItemsOfStorefrontReviewDto - `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://storefront.ecomiq.pe/api/v1/products/{productId}/reviews' ``` --- # Search storefront products Returns one page of the published catalog together with the facets that apply to it, so a filter panel needs no second call. Every filter is optional and they combine. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/products/search-storefront-products ## Search storefront products `GET /v1/products` Lifecycle: **stable** Returns one page of the published catalog together with the facets that apply to it, so a filter panel needs no second call. Every filter is optional and they combine. ### Parameters - `SellerId` (query, string) - `Search` (query, string) - `Category` (query, string) - `categories` (query, array) - `Brand` (query, string) - `brands` (query, array) - `Collection` (query, string) - `collections` (query, array) - `CollectionId` (query, string) - `ProductType` (query, string) - `productTypes` (query, array) - `Tag` (query, string) - `tags` (query, array) - `filters` (query, array) - `LocationId` (query, string) - `InStock` (query, boolean) - `MinPrice` (query, number (double)) - `MaxPrice` (query, number (double)) - `Page` (query, integer (int32), required) - `PageSize` (query, integer (int32), required) - `Sort` (query, string) ### Responses - `200`: OK — application/json, SearchResult - `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://storefront.ecomiq.pe/api/v1/products' ``` --- # Search Get product suggestions while the shopper types. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/search | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/search/autocomplete`](/en/docs/storefront/content-and-storefront/search/autocomplete-storefront-products) | Autocomplete storefront products | --- # Autocomplete storefront products Returns suggestions while the shopper types. Built for a search box, not for a listing: use the product search endpoint for results pages. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/search/autocomplete-storefront-products ## Autocomplete storefront products `GET /v1/search/autocomplete` Lifecycle: **stable** Returns suggestions while the shopper types. Built for a search box, not for a listing: use the product search endpoint for results pages. ### Parameters - `SellerId` (query, string) - `Search` (query, string, required) - `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://storefront.ecomiq.pe/api/v1/search/autocomplete' ``` --- # Settings Read the storefront's public operational settings. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/settings | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/settings`](/en/docs/storefront/content-and-storefront/settings/all-store-settings) | All Store settings | --- # All Store settings Returns everything the storefront needs to render in a single snapshot: store, checkout, theme, features, CMS settings, pages and menus. Fetch it once per request instead of calling the individual settings endpoints. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/settings/all-store-settings ## All Store settings `GET /v1/settings` Lifecycle: **stable** Returns everything the storefront needs to render in a single snapshot: store, checkout, theme, features, CMS settings, pages and menus. Fetch it once per request instead of calling the individual settings endpoints. ### Responses - `200`: OK — application/json, StoreSettingsSnapshotDto - `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://storefront.ecomiq.pe/api/v1/settings' ``` --- # Site Settings Read the site's active CMS settings. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/site-settings | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/site-settings`](/en/docs/storefront/content-and-storefront/site-settings/get-active-storefront-cms-settings) | Get active storefront CMS settings | --- # Get active storefront CMS settings Returns the CMS settings on their own. Prefer the full store settings snapshot unless you only need this slice. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/site-settings/get-active-storefront-cms-settings ## Get active storefront CMS settings `GET /v1/site-settings` Lifecycle: **stable** Returns the CMS settings on their own. Prefer the full store settings snapshot unless you only need this slice. ### Responses - `200`: OK — application/json, CmsSiteSettingsDto - `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://storefront.ecomiq.pe/api/v1/site-settings' ``` --- # Store Locations List public store locations and inspect their details. Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/store-locations | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/store-locations`](/en/docs/storefront/content-and-storefront/store-locations/list-public-store-locations) | List public store locations | | `GET` | [`/v1/store-locations/{id}`](/en/docs/storefront/content-and-storefront/store-locations/get-public-store-location) | Get public store location | --- # Get public store location Retrieve a public physical store location by ID Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/store-locations/get-public-store-location ## Get public store location `GET /v1/store-locations/{id}` Lifecycle: **stable** Retrieve a public physical store location by ID ### 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://storefront.ecomiq.pe/api/v1/store-locations/{id}' ``` --- # List public store locations Retrieve public physical store locations Canonical: https://docs.ecomiq.pe/en/docs/storefront/content-and-storefront/store-locations/list-public-store-locations ## List public store locations `GET /v1/store-locations` Lifecycle: **stable** Retrieve public physical store locations ### 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`. ### 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://storefront.ecomiq.pe/api/v1/store-locations' ``` --- # Customers Customer profile, addresses, login, registration, and password recovery. Canonical: https://docs.ecomiq.pe/en/docs/storefront/customers - [Customer](/en/docs/storefront/customers/customer): Manage the current customer's profile, addresses, and access. --- # Customer Manage the current customer's profile, addresses, and access. Canonical: https://docs.ecomiq.pe/en/docs/storefront/customers/customer | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/customer`](/en/docs/storefront/customers/customer/get-customer) | Get customer | | `PATCH` | [`/v1/customer`](/en/docs/storefront/customers/customer/update-customer) | Update customer | | `POST` | [`/v1/customer/login`](/en/docs/storefront/customers/customer/log-in-a-customer-and-return-access-tokens) | Log in a customer and return access tokens | | `POST` | [`/v1/customer/recovery-password`](/en/docs/storefront/customers/customer/request-a-password-recovery-email-for-a-customer) | Request a password recovery email for a customer | | `POST` | [`/v1/customer/register`](/en/docs/storefront/customers/customer/register-customer) | Register customer | | `POST` | [`/v1/customer/addresses`](/en/docs/storefront/customers/customer/create-customer-address) | Create customer address | | `GET` | [`/v1/customer/addresses`](/en/docs/storefront/customers/customer/list-customer-addresses) | List customer addresses | | `PUT` | [`/v1/customer/addresses/{addressId}`](/en/docs/storefront/customers/customer/update-customer-address) | Update customer address | | `DELETE` | [`/v1/customer/addresses/{addressId}`](/en/docs/storefront/customers/customer/delete-customer-address) | Delete customer address | | `POST` | [`/v1/customer/addresses/{addressId}/default`](/en/docs/storefront/customers/customer/set-default-address) | Set default address | --- # Create customer address Canonical: https://docs.ecomiq.pe/en/docs/storefront/customers/customer/create-customer-address ## Create customer address `POST /v1/customer/addresses` Lifecycle: **stable** ### 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, 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://storefront.ecomiq.pe/api/v1/customer/addresses' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Delete customer address Canonical: https://docs.ecomiq.pe/en/docs/storefront/customers/customer/delete-customer-address ## Delete customer address `DELETE /v1/customer/addresses/{addressId}` Lifecycle: **stable** ### Parameters - `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 — application/problem+json, ProblemDetails - `500`: Internal Server Error — application/problem+json, ProblemDetails ### Request ```bash curl --request DELETE \ --url 'https://storefront.ecomiq.pe/api/v1/customer/addresses/{addressId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get customer Canonical: https://docs.ecomiq.pe/en/docs/storefront/customers/customer/get-customer ## Get customer `GET /v1/customer` Lifecycle: **stable** ### 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://storefront.ecomiq.pe/api/v1/customer' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List customer addresses Canonical: https://docs.ecomiq.pe/en/docs/storefront/customers/customer/list-customer-addresses ## List customer addresses `GET /v1/customer/addresses` Lifecycle: **stable** ### 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://storefront.ecomiq.pe/api/v1/customer/addresses' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Log in a customer and return access tokens Exchanges the customer's credentials for access tokens. The storefront normally keeps the session in an HttpOnly cookie rather than handing the token to page scripts. Canonical: https://docs.ecomiq.pe/en/docs/storefront/customers/customer/log-in-a-customer-and-return-access-tokens ## Log in a customer and return access tokens `POST /v1/customer/login` Lifecycle: **stable** Exchanges the customer's credentials for access tokens. The storefront normally keeps the session in an HttpOnly cookie rather than handing the token to page scripts. ### Request body Content-Type: `application/json` · required #### Fields - `email` (string, required) - `password` (string, required) ### Responses - `200`: OK — application/json, CustomerLoginResponseDto - `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://storefront.ecomiq.pe/api/v1/customer/login' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Register customer Creates a shopper account for this store. Accounts are scoped to the store: the same person registering on two storefronts gets two independent accounts. Canonical: https://docs.ecomiq.pe/en/docs/storefront/customers/customer/register-customer ## Register customer `POST /v1/customer/register` Lifecycle: **stable** Creates a shopper account for this store. Accounts are scoped to the store: the same person registering on two storefronts gets two independent accounts. ### Request body Content-Type: `application/json` · required #### Fields - `email` (string, required) - `firstName` (string, required) - `lastName` (string, required) - `countryIsoCode` (string, required) - `password` (string, required) - `phone` (string) ### Responses - `200`: OK — 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://storefront.ecomiq.pe/api/v1/customer/register' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Request a password recovery email for a customer Sends the customer a link to set a new password. Responds 200 whether or not the address belongs to an account, so the endpoint cannot be used to discover which emails are registered. Canonical: https://docs.ecomiq.pe/en/docs/storefront/customers/customer/request-a-password-recovery-email-for-a-customer ## Request a password recovery email for a customer `POST /v1/customer/recovery-password` Lifecycle: **stable** Sends the customer a link to set a new password. Responds 200 whether or not the address belongs to an account, so the endpoint cannot be used to discover which emails are registered. ### Request body Content-Type: `application/json` · required #### Fields - `email` (string, required) ### 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://storefront.ecomiq.pe/api/v1/customer/recovery-password' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Set default address Marks one of the customer's saved addresses as the default. The previous default is cleared in the same operation. Canonical: https://docs.ecomiq.pe/en/docs/storefront/customers/customer/set-default-address ## Set default address `POST /v1/customer/addresses/{addressId}/default` Lifecycle: **stable** Marks one of the customer's saved addresses as the default. The previous default is cleared in the same operation. ### Parameters - `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 — application/problem+json, ProblemDetails - `500`: Internal Server Error — application/problem+json, ProblemDetails ### Request ```bash curl --request POST \ --url 'https://storefront.ecomiq.pe/api/v1/customer/addresses/{addressId}/default' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Update customer Canonical: https://docs.ecomiq.pe/en/docs/storefront/customers/customer/update-customer ## Update customer `PATCH /v1/customer` Lifecycle: **stable** ### 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 PATCH \ --url 'https://storefront.ecomiq.pe/api/v1/customer' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update customer address Canonical: https://docs.ecomiq.pe/en/docs/storefront/customers/customer/update-customer-address ## Update customer address `PUT /v1/customer/addresses/{addressId}` Lifecycle: **stable** ### Parameters - `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, 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://storefront.ecomiq.pe/api/v1/customer/addresses/{addressId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Geography Countries, departments, provinces, districts, and other areas in the geographic catalog. Canonical: https://docs.ecomiq.pe/en/docs/storefront/fulfillment-and-shipping - [Geo](/en/docs/storefront/fulfillment-and-shipping/geo): Look up geographic data used for addresses and delivery. --- # Geo Look up geographic data used for addresses and delivery. Canonical: https://docs.ecomiq.pe/en/docs/storefront/fulfillment-and-shipping/geo | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/geo/countries`](/en/docs/storefront/fulfillment-and-shipping/geo/list-countries) | List countries | | `GET` | [`/v1/geo/departments`](/en/docs/storefront/fulfillment-and-shipping/geo/list-departments) | List departments | | `GET` | [`/v1/geo/districts`](/en/docs/storefront/fulfillment-and-shipping/geo/list-districts) | List districts | | `GET` | [`/v1/geo/provinces`](/en/docs/storefront/fulfillment-and-shipping/geo/list-provinces) | List provinces | | `GET` | [`/v1/geo/resolve`](/en/docs/storefront/fulfillment-and-shipping/geo/resolve-area-by-source-code) | Resolve area by source code | | `GET` | [`/v1/geo/areas`](/en/docs/storefront/fulfillment-and-shipping/geo/list-areas) | List areas | | `GET` | [`/v1/geo/areas/{id}`](/en/docs/storefront/fulfillment-and-shipping/geo/get-area) | Get area | --- # Get area Returns one delivery area with the districts it covers. Canonical: https://docs.ecomiq.pe/en/docs/storefront/fulfillment-and-shipping/geo/get-area ## Get area `GET /v1/geo/areas/{id}` Lifecycle: **stable** Returns one delivery 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://storefront.ecomiq.pe/api/v1/geo/areas/{id}' ``` --- # List areas Lists the delivery areas the store has defined. Areas group districts to price shipping without listing every district. Canonical: https://docs.ecomiq.pe/en/docs/storefront/fulfillment-and-shipping/geo/list-areas ## List areas `GET /v1/geo/areas` Lifecycle: **stable** Lists the delivery areas the store has defined. Areas group districts to price shipping without listing every district. ### 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://storefront.ecomiq.pe/api/v1/geo/areas' ``` --- # List countries Lists the countries the store ships to. First step of an address form. Canonical: https://docs.ecomiq.pe/en/docs/storefront/fulfillment-and-shipping/geo/list-countries ## List countries `GET /v1/geo/countries` Lifecycle: **stable** Lists the countries the store ships to. First step of an address form. ### Parameters - `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://storefront.ecomiq.pe/api/v1/geo/countries' ``` --- # List departments Lists the departments of a country. Second step of a Peruvian address form. Canonical: https://docs.ecomiq.pe/en/docs/storefront/fulfillment-and-shipping/geo/list-departments ## List departments `GET /v1/geo/departments` Lifecycle: **stable** Lists the departments of a country. Second step of a Peruvian address form. ### Parameters - `countryCode` (query, string): ISO 3166-1 alpha-2 country code, for example `PE`. - `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://storefront.ecomiq.pe/api/v1/geo/departments' ``` --- # List districts Lists the districts of a province. Last step of a Peruvian address form, and the level shipping rates are calculated from. Canonical: https://docs.ecomiq.pe/en/docs/storefront/fulfillment-and-shipping/geo/list-districts ## List districts `GET /v1/geo/districts` Lifecycle: **stable** Lists the districts of a province. Last step of a Peruvian address form, and the level shipping rates are calculated from. ### Parameters - `countryCode` (query, string): ISO 3166-1 alpha-2 country code, for example `PE`. - `provinceId` (query, string) - `provinceCode` (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://storefront.ecomiq.pe/api/v1/geo/districts' ``` --- # List provinces Lists the provinces of a department. Third step of a Peruvian address form. Canonical: https://docs.ecomiq.pe/en/docs/storefront/fulfillment-and-shipping/geo/list-provinces ## List provinces `GET /v1/geo/provinces` Lifecycle: **stable** Lists the provinces of a department. Third step of a Peruvian address form. ### Parameters - `countryCode` (query, string): ISO 3166-1 alpha-2 country code, for example `PE`. - `departmentId` (query, string) - `departmentCode` (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://storefront.ecomiq.pe/api/v1/geo/provinces' ``` --- # Resolve area by source code Finds which delivery area a location belongs to. Use it to resolve an area from a postal or district code before asking for shipping options. Canonical: https://docs.ecomiq.pe/en/docs/storefront/fulfillment-and-shipping/geo/resolve-area-by-source-code ## Resolve area by source code `GET /v1/geo/resolve` Lifecycle: **stable** Finds which delivery area a location belongs to. Use it to resolve an area from a postal or district code before asking for shipping options. ### Parameters - `countryCode` (query, string, required): ISO 3166-1 alpha-2 country code, for example `PE`. - `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://storefront.ecomiq.pe/api/v1/geo/resolve' ``` --- # Carts & Checkout Carts, checkout, drafts, and customer order lookup. Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout - [Carts](/en/docs/storefront/orders-and-checkout/carts): Create and update carts, calculate delivery, and complete checkout. - [Order Drafts](/en/docs/storefront/orders-and-checkout/order-drafts): Retrieve an order draft through its shared link. - [Customer orders](/en/docs/storefront/orders-and-checkout/customer): Read the customer's order history, details, and status. --- # Carts Create and update carts, calculate delivery, and complete checkout. Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/carts`](/en/docs/storefront/orders-and-checkout/carts/create-cart) | Create cart | | `GET` | [`/v1/carts/{cartToken}`](/en/docs/storefront/orders-and-checkout/carts/get-storefront-cart) | Get storefront cart | | `POST` | [`/v1/carts/{cartToken}/payment-receipt`](/en/docs/storefront/orders-and-checkout/carts/upload-cart-payment-receipt) | Upload cart payment receipt | | `GET` | [`/v1/carts/shipping/slots`](/en/docs/storefront/orders-and-checkout/carts/get-shipping-slots) | Get shipping slots | | `GET` | [`/v1/carts/{cartToken}/order`](/en/docs/storefront/orders-and-checkout/carts/get-cart-order-group) | Get cart order group | | `PATCH` | [`/v1/carts/{cartToken}/addresses`](/en/docs/storefront/orders-and-checkout/carts/update-cart-addresses) | Update cart addresses | | `PATCH` | [`/v1/carts/{cartToken}/buyer`](/en/docs/storefront/orders-and-checkout/carts/update-cart-buyer) | Update cart buyer | ### Checkout | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/carts/{cartToken}/checkout`](/en/docs/storefront/orders-and-checkout/carts/start-checkout) | Start checkout | | `GET` | [`/v1/carts/{cartToken}/checkout`](/en/docs/storefront/orders-and-checkout/carts/get-checkout) | Get checkout | ### Items | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/carts/{cartToken}/items`](/en/docs/storefront/orders-and-checkout/carts/add-item-to-cart) | Add item to cart | | `PATCH` | [`/v1/carts/{cartToken}/items/{cartItemId}`](/en/docs/storefront/orders-and-checkout/carts/update-cart-item-quantity) | Update cart item quantity | | `DELETE` | [`/v1/carts/{cartToken}/items/{cartItemId}`](/en/docs/storefront/orders-and-checkout/carts/remove-item-from-cart) | Remove item from cart | ### Promotion Codes | Method | Endpoint | Operation | | --- | --- | --- | | `POST` | [`/v1/carts/{cartToken}/promotion-codes`](/en/docs/storefront/orders-and-checkout/carts/add-promotion-code) | Add promotion code | | `DELETE` | [`/v1/carts/{cartToken}/promotion-codes/{code}`](/en/docs/storefront/orders-and-checkout/carts/remove-promotion-code) | Remove promotion code | ### Shipping Method | Method | Endpoint | Operation | | --- | --- | --- | | `PUT` | [`/v1/carts/{cartToken}/shipping-method`](/en/docs/storefront/orders-and-checkout/carts/set-cart-shipping-method) | Set cart shipping method | | `DELETE` | [`/v1/carts/{cartToken}/shipping-method`](/en/docs/storefront/orders-and-checkout/carts/clear-cart-shipping-method) | Clear cart shipping method | ### Shipping Options | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/carts/{cartToken}/shipping-options`](/en/docs/storefront/orders-and-checkout/carts/list-cart-shipping-options) | List cart shipping options | | `GET` | [`/v1/carts/{cartToken}/shipping-options/{rateId}/slots`](/en/docs/storefront/orders-and-checkout/carts/get-cart-shipping-option-slots) | Get cart shipping option slots | --- # Add item to cart Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/add-item-to-cart ## Add item to cart `POST /v1/carts/{cartToken}/items` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. ### Request body Content-Type: `application/json` · required #### Fields - `variantId` (string, required) - `quantity` (integer (int32), required) - `modifiers` (array) #### Example ```json { "variantId": "7204558912004325377", "quantity": 2 } ``` ### Responses - `200`: OK — application/json, StorefrontCartDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/items' \ --header 'Content-Type: application/json' \ --data '{"variantId":"7204558912004325377","quantity":2}' ``` --- # Add promotion code Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/add-promotion-code ## Add promotion code `POST /v1/carts/{cartToken}/promotion-codes` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. ### Request body Content-Type: `application/json` · required #### Fields - `code` (string, required) ### Responses - `200`: OK — application/json, StorefrontCartDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/promotion-codes' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Clear cart shipping method Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/clear-cart-shipping-method ## Clear cart shipping method `DELETE /v1/carts/{cartToken}/shipping-method` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. - `sellerId` (query, string) - `shippingProfileId` (query, string) ### Responses - `200`: OK — application/json, StorefrontCartDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/shipping-method' ``` --- # Create cart Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/create-cart ## Create cart `POST /v1/carts` Lifecycle: **stable** ### Request body Content-Type: `application/json` · required #### Fields - `currencyCode` (string): ISO 4217 currency code, for example `PEN`. - `salesChannelId` (string) - `email` (string) #### Example ```json { "currencyCode": "PEN", "email": "andrea@example.com" } ``` ### Responses - `200`: OK — application/json, StorefrontCartDto - `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://storefront.ecomiq.pe/api/v1/carts' \ --header 'Content-Type: application/json' \ --data '{"currencyCode":"PEN","email":"andrea@example.com"}' ``` --- # Get cart order group Returns the orders a completed cart produced. A cart with items from several sellers becomes several orders under one group. Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/get-cart-order-group ## Get cart order group `GET /v1/carts/{cartToken}/order` Lifecycle: **stable** Returns the orders a completed cart produced. A cart with items from several sellers becomes several orders under one group. ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. ### Responses - `200`: OK — application/json, CartOrderSummaryDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/order' ``` --- # Get cart shipping option slots Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/get-cart-shipping-option-slots ## Get cart shipping option slots `GET /v1/carts/{cartToken}/shipping-options/{rateId}/slots` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. - `rateId` (path, string, required) - `SellerId` (query, string) - `ShippingProfileId` (query, string) - `LocationId` (query, string) - `PickupPointId` (query, string) - `ServiceCode` (query, string) - `Date` (query, 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 GET \ --url 'https://storefront.ecomiq.pe/api/v1/carts/{cartToken}/shipping-options/{rateId}/slots' ``` --- # Get checkout Returns the current state of the checkout: which steps are complete, the totals and the payment methods the merchant has enabled. Poll it when the payment settles outside the storefront. Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/get-checkout ## Get checkout `GET /v1/carts/{cartToken}/checkout` Lifecycle: **stable** Returns the current state of the checkout: which steps are complete, the totals and the payment methods the merchant has enabled. Poll it when the payment settles outside the storefront. ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. ### Responses - `200`: OK — application/json, StorefrontCheckoutDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/checkout' ``` --- # Get shipping slots Returns the delivery windows available for a shipping method. Only relevant when the merchant offers scheduled delivery. Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/get-shipping-slots ## Get shipping slots `GET /v1/carts/shipping/slots` Lifecycle: **stable** Returns the delivery windows available for a shipping method. Only relevant when the merchant offers scheduled delivery. ### Parameters - `ShippingMethodId` (query, string, required) - `LocationId` (query, string) - `PickupPointId` (query, string) - `PostalCode` (query, string) - `Latitude` (query, number (double)) - `Longitude` (query, number (double)) - `Date` (query, 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 GET \ --url 'https://storefront.ecomiq.pe/api/v1/carts/shipping/slots' ``` --- # Get storefront cart Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/get-storefront-cart ## Get storefront cart `GET /v1/carts/{cartToken}` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. ### Responses - `200`: OK — application/json, StorefrontCartDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}' ``` --- # List cart shipping options Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/list-cart-shipping-options ## List cart shipping options `GET /v1/carts/{cartToken}/shipping-options` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. - `postalCode` (query, string) - `scheduledDate` (query, string (date)) - `scheduledTime` (query, string (time)) ### Responses - `200`: OK — application/json, CartShippingOptionsDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/shipping-options' ``` --- # Remove item from cart Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/remove-item-from-cart ## Remove item from cart `DELETE /v1/carts/{cartToken}/items/{cartItemId}` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. - `cartItemId` (path, string, required) ### Responses - `200`: OK — application/json, StorefrontCartDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/items/{cartItemId}' ``` --- # Remove promotion code Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/remove-promotion-code ## Remove promotion code `DELETE /v1/carts/{cartToken}/promotion-codes/{code}` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. - `code` (path, string, required) ### Responses - `200`: OK — application/json, StorefrontCartDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/promotion-codes/{code}' ``` --- # Set cart shipping method Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/set-cart-shipping-method ## Set cart shipping method `PUT /v1/carts/{cartToken}/shipping-method` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. ### Request body Content-Type: `application/json` · required #### Fields - `sellerId` (string) - `shippingProfileId` (string) - `shippingMethodId` (string) - `rateId` (string) - `locationId` (string) - `pickupPointId` (string) - `scheduledDate` (string (date)) - `scheduledTime` (string (time)) - `serviceCode` (string) ### Responses - `200`: OK — application/json, StorefrontCartDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/shipping-method' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Start checkout Turns the cart into an order. The cart must already carry buyer, addresses and a shipping method; the response points to the resulting order. Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/start-checkout ## Start checkout `POST /v1/carts/{cartToken}/checkout` Lifecycle: **stable** Turns the cart into an order. The cart must already carry buyer, addresses and a shipping method; the response points to the resulting order. ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. ### Request body Content-Type: `application/json` · required #### Fields - `paymentMethodCode` (string) - `externalRef` (string) - `receiptUrl` (string) ### Responses - `200`: OK — application/json, StorefrontCheckoutResultDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/checkout' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update cart addresses Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/update-cart-addresses ## Update cart addresses `PATCH /v1/carts/{cartToken}/addresses` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. ### Request body Content-Type: `application/json` · required #### Fields - `shippingAddress` (null | StorefrontAddressDto) - `billingAddress` (null | StorefrontAddressDto) ### Responses - `200`: OK — application/json, StorefrontCartDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/addresses' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update cart buyer Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/update-cart-buyer ## Update cart buyer `PATCH /v1/carts/{cartToken}/buyer` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. ### Request body Content-Type: `application/json` · required #### Fields - `email` (string) - `phone` (string) - `firstName` (string) - `lastName` (string) - `identificationType` (string) - `identificationNumber` (string) - `entityTaxId` (string) - `entityName` (string) ### Responses - `200`: OK — application/json, StorefrontCartDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/buyer' \ --header 'Content-Type: application/json' \ --data-binary @request.json ``` --- # Update cart item quantity Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/update-cart-item-quantity ## Update cart item quantity `PATCH /v1/carts/{cartToken}/items/{cartItemId}` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. - `cartItemId` (path, string, required) ### Request body Content-Type: `application/json` · required #### Fields - `quantity` (integer (int32), required) #### Example ```json { "quantity": 3 } ``` ### Responses - `200`: OK — application/json, StorefrontCartDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/items/{cartItemId}' \ --header 'Content-Type: application/json' \ --data '{"quantity":3}' ``` --- # Upload cart payment receipt Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/carts/upload-cart-payment-receipt ## Upload cart payment receipt `POST /v1/carts/{cartToken}/payment-receipt` Lifecycle: **stable** ### Parameters - `cartToken` (path, string, required): Opaque token identifying the cart. ### Request body Content-Type: `multipart/form-data` · required #### Fields - `file` (IFormFile, required) ### Responses - `200`: OK — application/json, CartPaymentReceiptDto - `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://storefront.ecomiq.pe/api/v1/carts/{cartToken}/payment-receipt' \ --header 'Content-Type: multipart/form-data' ``` --- # Customer orders Read the customer's order history, details, and status. Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/customer | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/customer/orders`](/en/docs/storefront/orders-and-checkout/customer/list-customer-orders) | List customer orders | | `GET` | [`/v1/customer/orders/{orderId}`](/en/docs/storefront/orders-and-checkout/customer/get-customer-order) | Get customer order | | `GET` | [`/v1/customer/orders/{orderId}/status`](/en/docs/storefront/orders-and-checkout/customer/get-order-status) | Get order status | | `GET` | [`/v1/customer/orders/group/{orderGroup}`](/en/docs/storefront/orders-and-checkout/customer/get-orders-by-group) | Get orders by group | --- # Get customer order Customer order detail with items, shipping, payments and status timeline Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/customer/get-customer-order ## Get customer order `GET /v1/customer/orders/{orderId}` Lifecycle: **stable** Customer order detail with items, shipping, payments and status timeline ### Parameters - `orderId` (path, string, required) ### Responses - `200`: OK — application/json, CustomerOrderDetailsDto - `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://storefront.ecomiq.pe/api/v1/customer/orders/{orderId}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get order status Returns the current status of one of the customer's orders, for an order tracking page. Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/customer/get-order-status ## Get order status `GET /v1/customer/orders/{orderId}/status` Lifecycle: **stable** Returns the current status of one of the customer's orders, for an order tracking page. ### Parameters - `orderId` (path, string, required) ### Responses - `200`: OK — application/json, CustomerOrderStatusDto - `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://storefront.ecomiq.pe/api/v1/customer/orders/{orderId}/status' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Get orders by group Returns the orders of one group for the signed-in customer. A purchase split across sellers produces several orders under the same group. Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/customer/get-orders-by-group ## Get orders by group `GET /v1/customer/orders/group/{orderGroup}` Lifecycle: **stable** Returns the orders of one group for the signed-in customer. A purchase split across sellers produces several orders under the same group. ### Parameters - `orderGroup` (path, string, required) ### Responses - `200`: OK — application/json, OrderGroupDetailsDto - `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://storefront.ecomiq.pe/api/v1/customer/orders/group/{orderGroup}' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # List customer orders Customer order history with items, shipping address and payment totals Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/customer/list-customer-orders ## List customer orders `GET /v1/customer/orders` Lifecycle: **stable** Customer order history with items, shipping address and payment totals ### 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://storefront.ecomiq.pe/api/v1/customer/orders' \ --header 'Authorization: Bearer $ECOMIQ_TOKEN' ``` --- # Order Drafts Retrieve an order draft through its shared link. Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/order-drafts | Method | Endpoint | Operation | | --- | --- | --- | | `GET` | [`/v1/order-drafts/share/{shareToken}`](/en/docs/storefront/orders-and-checkout/order-drafts/get-order-draft-share) | Get order draft share | --- # Get order draft share Canonical: https://docs.ecomiq.pe/en/docs/storefront/orders-and-checkout/order-drafts/get-order-draft-share ## Get order draft share `GET /v1/order-drafts/share/{shareToken}` Lifecycle: **stable** ### Parameters - `shareToken` (path, string, required) ### Responses - `200`: OK — application/json, OrderDraftDetailsDto - `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://storefront.ecomiq.pe/api/v1/order-drafts/share/{shareToken}' ```