Catalog referentials
Brands, categories, suppliers, and tags are the shared referentials that products point to. This page covers the Brands, Categories, Suppliers, and Product Tags tags.
Brands
A brand is uniquely identified by its code. Products link to a brand via brand_id (see Products).
- Name
GET /brands- Description
Lists brands. Filters:
search,is_active,has_products,include_deleted,order_by,order_dir,page,page_size.
- Name
GET /brands/{brand_id}- Description
Retrieves a single brand.
- Name
POST /brands- Description
Creates a brand.
- Name
PUT /brands/{brand_id}- Description
Updates a brand.
- Name
DELETE /brands/{brand_id}- Description
Deletes a brand. Query
permanent=trueto bypass the soft-delete.
- Name
GET /brands/search- Description
Lightweight typeahead search (
q,limit) used to populate pickers.
- Name
GET /brands/stats, GET /brands/dashboard- Description
Aggregate brand statistics / dashboard widgets.
- Name
GET /brands/export-csv, POST /brands/import-csv, POST /brands/import-from-odoo- Description
CSV export/import and Odoo brand import.
- Name
POST /brands/update-products-count- Description
Recomputes the cached product count for a brand (
brand_idquery param).
Body parameters — POST / PUT /brands
- Name
code- Type
- string
- Description
Unique brand code.
- Name
name- Type
- string
- Description
Brand name.
- Name
display_name- Type
- string
- Description
Official display name — overrides
namefor UI/exports.
- Name
logo_url- Type
- string
- Description
Brand logo URL.
- Name
website- Type
- string
- Description
Brand website URL.
- Name
description- Type
- string
- Description
Brand description.
- Name
is_active- Type
- boolean
- Description
Whether the brand is active.
Aliases
- Name
GET /brands/{brand_id}/aliases- Description
Lists known name aliases for a brand (e.g. supplier-specific spellings).
- Name
POST /brands/{brand_id}/aliases- Description
Adds an alias. Body:
alias(required),source.
- Name
DELETE /brands/{brand_id}/aliases/{alias_id}- Description
Removes an alias.
Request
curl -X POST https://api.pixeepim.com/api/v1/brands \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{
"code": "ACME",
"name": "Acme",
"website": "https://acme.example",
"is_active": true
}'
Response
{
"id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
"code": "ACME",
"name": "Acme",
"is_active": true,
"created_at": "2026-09-17T09:00:00Z"
}
Brand deduplication
Brands arrive from multiple suppliers with inconsistent spelling. These endpoints detect and reconcile duplicates.
- Name
GET /brands/duplicates- Description
Detects likely duplicate brands. Query:
min_similarity,limit.
- Name
POST /brands/auto-merge-case-duplicates- Description
Automatically merges brands that differ only by letter case.
- Name
POST /brands/merge- Description
Merges one or more source brands into a target brand, optionally creating aliases from the source names.
- Name
GET /brands/merge-history- Description
Lists past merges. Query:
target_brand_id,page,page_size.
- Name
POST /brands/match- Description
Matches a free-text brand name to an existing brand (used when ingesting supplier data).
- Name
POST /brands/match/batch- Description
Batch version of
/brands/match.
- Name
POST /brands/suggest-matches- Description
Suggests brand matches for review. Query:
limit.
Body parameters — POST /brands/merge
- Name
source_brand_ids- Type
- array
- Description
Brands to merge — deleted after the merge.
- Name
target_brand_id- Type
- string
- Description
Brand to keep; receives the merged data.
- Name
merge_reason- Type
- string
- Description
Free-text reason, kept for audit.
- Name
create_aliases- Type
- boolean
- Description
Create aliases from the source brand names (default varies — pass explicitly).
Body parameters — POST /brands/match
- Name
name- Type
- string
- Description
Brand name to match.
- Name
supplier_code- Type
- string
- Description
Supplier code, used as matching context.
Pending brands (supplier ingestion queue)
- Name
GET /brands/pending- Description
Lists brand names awaiting validation, typically created during a supplier import. Filters:
status,search,supplier_code,order_by,order_dir,page,page_size.
- Name
GET /brands/pending/{pending_id}- Description
Retrieves a single pending brand.
- Name
POST /brands/pending/{pending_id}/validate- Description
Resolves one pending brand: body
action(e.g.assignto an existingbrand_id, or create new),create_alias,notes.
- Name
POST /brands/pending/bulk-validate- Description
Resolves several pending brands at once: body
pending_ids,action,brand_id(forassign),create_alias.
Request
curl -X POST https://api.pixeepim.com/api/v1/brands/merge \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{
"source_brand_ids": ["11111111-1111-1111-1111-111111111111"],
"target_brand_id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
"create_aliases": true
}'
Request
curl -X POST https://api.pixeepim.com/api/v1/brands/pending/22222222-2222-2222-2222-222222222222/validate \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{
"action": "assign",
"brand_id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
"create_alias": true
}'
Categories
Categories live under one or more taxonomies (e.g. your internal tree, Google Product Taxonomy, Amazon Browse Nodes). categories-manager/* manages your own editable taxonomies; the read-only reference trees are exposed separately under categories/* (Amazon, Google, and a generic "web" tree).
Your taxonomies
- Name
GET /categories-manager/taxonomies- Description
Lists taxonomies. Query:
is_active.
- Name
POST /categories-manager/taxonomies- Description
Creates a taxonomy (body:
TaxonomySourceCreate—code,name,locale,source_type,sync_url,sync_method,sync_cron,is_active,config).
- Name
GET /categories-manager/taxonomies/{taxonomy_id}- Description
Retrieves a taxonomy.
- Name
PUT /categories-manager/taxonomies/{taxonomy_id}- Description
Updates a taxonomy.
- Name
DELETE /categories-manager/taxonomies/{taxonomy_id}- Description
Deletes a taxonomy.
- Name
POST /categories-manager/taxonomies/{taxonomy_id}/sync- Description
Re-syncs a taxonomy from its configured source.
- Name
POST /categories-manager/taxonomies/{taxonomy_id}/sync-and-map- Description
Syncs and immediately runs auto-mapping against another taxonomy.
- Name
GET /categories-manager/taxonomies/{taxonomy_id}/export-csv- Description
Exports the taxonomy tree as CSV.
Categories within a taxonomy
- Name
GET /categories-manager/taxonomies/{taxonomy_id}/categories- Description
Lists categories in a taxonomy. Filters:
parent_id,level,search,is_active,flat(flatten the tree),page,page_size.
- Name
POST /categories-manager/taxonomies/{taxonomy_id}/categories- Description
Creates a category. Body (
CategoryCreate):name(required),external_id,slug,parent_id,is_active,sort_order,metadata.
- Name
GET /categories-manager/categories/{category_id}- Description
Retrieves a category.
- Name
PUT /categories-manager/categories/{category_id}- Description
Updates a category (
CategoryUpdate:name,external_id,slug,is_active,sort_order,metadata).
- Name
DELETE /categories-manager/categories/{category_id}- Description
Deletes a category.
- Name
PUT /categories-manager/categories/{category_id}/active- Description
Toggles the node's enabled flag. Body:
{ "is_active": true|false }.
- Name
GET /categories-manager/categories/{category_id}/tree- Description
Retrieves the subtree rooted at this category.
- Name
GET /categories-manager/categories/search- Description
Typeahead search across a taxonomy. Query:
q,taxonomy_source_id,limit,offset,source_code.
- Name
GET /categories-manager/categories/dashboard, GET /categories-manager/categories/stats- Description
Dashboard widgets and aggregate stats.
- Name
POST /categories-manager/categories/import-csv, POST /categories-manager/categories/import-url- Description
Bulk-imports categories from a CSV file or a URL (body:
ImportUrlRequest).
Translations & attributes
- Name
GET /categories-manager/categories/{category_id}/translations- Description
Lists per-locale translations of a category name.
- Name
PUT /categories-manager/categories/{category_id}/translations- Description
Writes a translation (body:
TaxonomyCategoryTranslationWrite).
- Name
GET /categories-manager/categories/{category_id}/attributes- Description
Lists the attributes applicable to a category.
- Name
GET /categories-manager/attributes, POST, PUT /{attribute_id}, DELETE /{attribute_id}- Description
CRUD for taxonomy attributes (body
AttributeCreate/AttributeUpdate:taxonomy_category_id,name,display_name,attribute_type,unit,is_required,is_filterable,sort_order).
- Name
POST /categories-manager/attributes/{attribute_id}/values- Description
Adds a selectable value to an attribute.
- Name
GET /categories-manager/attributes/translations, PUT- Description
Reads/writes attribute-label translations. Query:
scope,key.
- Name
POST /categories-manager/attributes/import-csv- Description
Bulk-imports attributes.
Reference trees (read-only)
- Name
GET /categories/amazon- Description
Amazon Browse Node reference categories. Query:
limit,offset,search.
- Name
GET /categories/google- Description
Google Product Taxonomy reference categories. Query:
limit,offset,category_id.
- Name
GET /categories/web- Description
Generic web/internal category tree. Query:
limit,offset,parent_id,include_hierarchy.
- Name
GET /categories/{category_id}/tree, /children, /parents- Description
Subtree, children, or ancestor chain for a reference category.
- Name
GET /categories/{category_id}/translations, PUT- Description
Reads/writes a reference category's translation.
Request
curl -X POST https://api.pixeepim.com/api/v1/categories-manager/taxonomies/6ba7b810-9dad-11d1-80b4-00c04fd430c8/categories \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{
"name": "Casques audio",
"parent_id": null,
"is_active": true,
"sort_order": 10
}'
Request
curl -X PUT https://api.pixeepim.com/api/v1/categories-manager/categories/9f8e7d6c-5b4a-3210-9876-543210fedcba/active \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{"is_active": false}'
Taxonomies & mappings
Mappings link a category in one taxonomy to its equivalent in another (e.g. your internal category → the matching Google category), so exports and feeds can translate automatically.
- Name
GET /categories-manager/mappings- Description
Lists mappings. Filters:
source_taxonomy_id,target_taxonomy_id,status,mapping_type,page,page_size.
- Name
POST /categories-manager/mappings- Description
Creates a mapping. Body:
source_category_id,target_category_id(required),mapping_type,confidence_score,status.
- Name
PUT /categories-manager/mappings/{mapping_id}/status- Description
Approves/rejects a mapping (body:
MappingStatusUpdate).
- Name
DELETE /categories-manager/mappings/{mapping_id}- Description
Deletes a mapping.
- Name
POST /categories-manager/mappings/auto-match- Description
Runs automatic matching between two taxonomies. Body:
source_taxonomy_id,target_taxonomy_id(required),min_confidence,limit.
- Name
GET /categories-manager/mappings/suggestions- Description
Suggests mapping candidates for review. Query:
taxonomy_source_id,limit.
- Name
GET /categories-manager/mappings/export-csv- Description
Exports mappings as CSV.
- Name
POST /categories-manager/mappings/import-from-legacy- Description
Imports mappings from the legacy category system.
- Name
GET /categories-manager/sync/reconcile- Description
Reconciles a taxonomy against its source, reporting drift. Query:
source_id.
Request
curl -X POST https://api.pixeepim.com/api/v1/categories-manager/mappings/auto-match \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{
"source_taxonomy_id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
"target_taxonomy_id": "11111111-1111-1111-1111-111111111111",
"min_confidence": 0.8,
"limit": 100
}'
Product ↔ category assignment
Assigns products to taxonomy categories, with one category per shop/taxonomy flagged primary.
- Name
GET /categories-manager/products/{product_id}/categories- Description
Lists a product's category assignments.
- Name
POST /categories-manager/products/{product_id}/assign- Description
Assigns a product to a category. Body:
taxonomy_category_id(required),assigned_by,confidence,is_primary.
- Name
POST /categories-manager/products/bulk-assign- Description
Assigns many products to the same category at once. Body:
product_ids,taxonomy_category_id(required),assigned_by,confidence,is_primary.
- Name
DELETE /categories-manager/products/{product_id}/categories/{assignment_id}- Description
Removes an assignment.
- Name
PUT /categories-manager/products/{product_id}/categories/{assignment_id}/primary- Description
Sets/unsets the primary flag for one assignment. Body:
{ "is_primary": true|false }.
- Name
POST /categories-manager/products/sync-categories-from-odoo- Description
Bulk-syncs product categories from Odoo.
- Name
POST /categories-manager/categories/migrate-product-categories- Description
One-off migration of legacy category assignments into the taxonomy model.
- Name
POST /categories-manager/import-odoo-attributes- Description
Imports Odoo 18 product attributes into the taxonomy attribute model.
Request
curl -X POST https://api.pixeepim.com/api/v1/categories-manager/products/bulk-assign \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{
"product_ids": ["550e8400-e29b-41d4-a716-446655440000", "6ba7b810-9dad-11d1-80b4-00c04fd430c8"],
"taxonomy_category_id": "9f8e7d6c-5b4a-3210-9876-543210fedcba",
"is_primary": true
}'
Suppliers
- Name
GET /suppliers/- Description
Lists suppliers. Filters:
search,is_active,page,per_page.
- Name
GET /suppliers/{supplier_id}- Description
Retrieves a supplier.
- Name
POST /suppliers/- Description
Creates a supplier. Body:
name,code(required),contact_email,contact_phone,address,country,is_active.
- Name
PUT /suppliers/{supplier_id}- Description
Updates a supplier.
- Name
DELETE /suppliers/{supplier_id}- Description
Deletes a supplier.
- Name
DELETE /suppliers/bulk- Description
Deletes multiple suppliers at once. Body:
{ "supplier_ids": [...] }.
- Name
GET /suppliers/active- Description
Shortcut list of active suppliers only, for pickers.
- Name
GET /suppliers/stats, GET /suppliers/stats/summary, GET /suppliers/list/with-automation- Description
Aggregate supplier statistics and connector-automation status.
- Name
POST /suppliers/test-connection- Description
Validates a source connection before saving. Body:
source_type,connection_config(required).
- Name
GET /suppliers/{supplier_id}/with-config, POST /suppliers/with-config, PUT /suppliers/{supplier_id}/with-config- Description
Reads/creates/updates a supplier together with its import/connector configuration in one call (
UnifiedSupplierRequest/UnifiedSupplierUpdateRequest).
Request
curl -X POST https://api.pixeepim.com/api/v1/suppliers/ \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Distribution",
"code": "ACME-DIST",
"contact_email": "orders@acme.example",
"country": "FR",
"is_active": true
}'
Response
{
"id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
"name": "Acme Distribution",
"code": "ACME-DIST",
"country": "FR",
"is_active": true
}
Supplier history
Historical data captured from supplier feed imports: catalog snapshots, price/stock history, sync logs, and EAN resolution review.
- Name
GET /supplier-history/{supplier_code}/catalog- Description
The supplier's catalog as last imported. Filters:
search,ean,is_active,page,per_page.
- Name
GET /supplier-history/{supplier_code}/prices- Description
Price history over time for the supplier (optionally scoped to
product_id), withstart_date/end_date.
- Name
GET /supplier-history/{supplier_code}/stocks- Description
Stock-level history, same filters as prices.
- Name
GET /supplier-history/{supplier_code}/files- Description
Import files received from this supplier. Filters:
file_type,start_date,limit.
- Name
GET /supplier-history/{supplier_code}/sync-logs- Description
Sync run logs. Filters:
status,operation,start_date,limit.
- Name
GET /supplier-history/{supplier_code}/stats- Description
Aggregate stats for the supplier's import history.
- Name
GET /supplier-history/ean-resolutions- Description
Lists EAN resolutions awaiting or under review. Filters:
page,per_page,status,supplier_code,search,sort_by,sort_order.
- Name
PATCH /supplier-history/ean-resolutions/{resolution_id}- Description
Updates a resolution. Body:
resolved_ean,status,resolution_source.
- Name
DELETE /supplier-history/ean-resolutions/{resolution_id}- Description
Deletes a resolution record.
Request
curl "https://api.pixeepim.com/api/v1/supplier-history/ACME-DIST/catalog?is_active=true&per_page=50" \
-H "Authorization: Bearer {api_key}"
Product tags
Freeform labels for merchandising and filtering.
- Name
GET /tags/tags- Description
Lists tags. Filters:
search,is_active,page,per_page.
- Name
POST /tags/tags- Description
Creates a tag. Body:
name(required),description,color.
- Name
POST /tags/tags/bulk- Description
Creates multiple tags at once. Body:
{ "tags": [...] }.
- Name
PUT /tags/tags/{tag_id}- Description
Updates a tag (
name,description,color,is_active).
- Name
DELETE /tags/tags/{tag_id}- Description
Deletes a tag.
- Name
POST /tags/tags/merge- Description
Merges one or more source tags into a target tag. Body:
source_tag_ids,target_tag_id(required).
The public API does not expose a per-product tag-assignment endpoint (e.g. POST /products/{id}/tags) as of this spec — tag management is limited to the tag registry itself.
Request
curl -X POST https://api.pixeepim.com/api/v1/tags/tags \
-H "Authorization: Bearer {api_key}" \
-H "Content-Type: application/json" \
-d '{
"name": "Best-seller",
"color": "#22c55e"
}'
Response
{
"id": "9f8e7d6c-5b4a-3210-9876-543210fedcba",
"name": "Best-seller",
"color": "#22c55e",
"is_active": true
}