Connectors

Connectors sync your Pixee PIM catalog with e-commerce platforms, marketplaces, and headless commerce engines.

Supported platforms (15): Shopify, BigCommerce, Salesforce Commerce Cloud (SFCC), SAP Commerce, Wizishop, Cdiscount, Fnac, Sylius, Squarespace, Google Merchant Center, Mirakl, Medusa, Shopware 6, Saleor, Amazon SP-API.


Platform catalog

Before creating a connector, browse the static platform registry to discover a platform's id, required credentials, and field mapping.

List platforms

Returns all 15 supported platforms with their tier, auth type, and capabilities.

Query parameters

  • Name
    tier
    Type
    integer
    Description

    Filter by tier: 1 (high), 2 (medium), 3 (FR market), 4 (extra).

  • Name
    category
    Type
    string
    Description

    Filter by category: e-commerce, marketplace, or enterprise.

Request

GET
/connectors/platforms
curl "https://api.pixeepim.com/api/v1/connectors/platforms?tier=1" \
  -H "X-API-Key: {api_key}"

Response

[
  {
    "id": "shopify",
    "name": "Shopify",
    "tier": 1,
    "auth_type": "api_key",
    "capabilities": [
      "push_products", "pull_products", "push_stock", "pull_stock",
      "push_prices", "push_images", "push_categories", "receive_webhook"
    ],
    "description": "Plateforme e-commerce hébergée. Auth via Private App Access Token.",
    "logo_path": "/static/logos/shopify.svg",
    "webhook_path": "/api/v1/connectors/shopify/webhook",
    "is_marketplace": false,
    "category": "e-commerce"
  }
]

Get a platform

Returns the full definition of a single platform, including its config_schema (the credential fields required to create a connector for it).

Path parameters

  • Name
    platform_id
    Type
    string
    Description

    Platform identifier (e.g. shopify, amazon_sp_api, google_merchant_center).

Request

GET
/connectors/platforms/{platform_id}
curl https://api.pixeepim.com/api/v1/connectors/platforms/shopify \
  -H "X-API-Key: {api_key}"

Platform field map

Returns the default field mapping between Pixee PIM fields and the platform's own field names (e.g. title → variants[0].barcode for Shopify's EAN).

Path parameters

  • Name
    platform_id
    Type
    string
    Description

    Platform identifier.

Request

GET
/connectors/platforms/{platform_id}/field-map
curl https://api.pixeepim.com/api/v1/connectors/platforms/shopify/field-map \
  -H "X-API-Key: {api_key}"

Platform guide

Returns the platform's integration guide (setup steps, where to find API credentials).

Path parameters

  • Name
    platform_id
    Type
    string
    Description

    Platform identifier.

Query parameters

  • Name
    format
    Type
    string
    Description

    Response format, e.g. markdown.

Request

GET
/connectors/platforms/{platform_id}/guide
curl "https://api.pixeepim.com/api/v1/connectors/platforms/shopify/guide?format=markdown" \
  -H "X-API-Key: {api_key}"

Sync status (dashboard)

Returns an aggregated sync status for your active connectors — a compact feed suited to a dashboard widget.

Query parameters

  • Name
    limit
    Type
    integer
    Description

    Maximum number of connectors to return.

Request

GET
/connectors/sync-status
curl "https://api.pixeepim.com/api/v1/connectors/sync-status?limit=10" \
  -H "X-API-Key: {api_key}"

Response

[
  {
    "id": "550e8400-e29b-41d4-a716-000000000010",
    "platform_id": "shopify",
    "name": "My Shopify Store",
    "is_active": true,
    "status": "active",
    "last_sync_at": "2026-09-14T08:00:00Z",
    "last_job": {
      "job_type": "push_products",
      "status": "completed",
      "pushed": 1250,
      "errors": 0
    }
  }
]

/connectors

Connectors

List connectors

Returns all connectors configured on your account, as a plain array (not paginated).

Request

GET
/connectors/
curl https://api.pixeepim.com/api/v1/connectors/ \
  -H "X-API-Key: {api_key}"

Response

[
  {
    "id": "550e8400-e29b-41d4-a716-000000000010",
    "platform_id": "shopify",
    "name": "My Shopify Store",
    "description": "EU storefront",
    "is_active": true,
    "status": "active",
    "status_message": null,
    "last_tested_at": "2026-09-14T07:55:00Z",
    "last_sync_at": "2026-09-14T08:00:00Z",
    "created_at": "2026-01-15T00:00:00Z"
  }
]

Create a connector

Creates a connector instance for a platform. credentials follows the config_schema returned by Get a platform.

Body parameters

  • Name
    platform_id
    Type
    string
    Description

    Platform identifier (see List platforms).

  • Name
    name
    Type
    string
    Description

    Descriptive name for this connector instance.

  • Name
    description
    Type
    string
    Description

    Optional free-text description.

  • Name
    credentials
    Type
    object
    Description

    Platform-specific credentials (API key, shop domain, OAuth tokens, etc.). Stored Fernet-encrypted.

  • Name
    sync_options
    Type
    object
    Description

    Platform-specific sync options (default: {}).

Request

POST
/connectors/
curl -X POST https://api.pixeepim.com/api/v1/connectors/ \
  -H "X-API-Key: {api_key}" \
  -H "Content-Type: application/json" \
  -d '{
    "platform_id": "shopify",
    "name": "My Shopify Store",
    "credentials": {
      "shop_domain": "my-store.myshopify.com",
      "access_token": "shpat_..."
    }
  }'

Response

{
  "id": "550e8400-e29b-41d4-a716-000000000010",
  "platform_id": "shopify",
  "name": "My Shopify Store",
  "is_active": true,
  "status": "pending",
  "created_at": "2026-09-17T10:00:00Z"
}

Get a connector

Returns a specific connector and its current status.

Path parameters

  • Name
    connector_id
    Type
    string
    Description

    The connector ID.

Request

GET
/connectors/{connector_id}
curl https://api.pixeepim.com/api/v1/connectors/550e8400-e29b-41d4-a716-000000000010 \
  -H "X-API-Key: {api_key}"

Response

{
  "id": "550e8400-e29b-41d4-a716-000000000010",
  "platform_id": "shopify",
  "name": "My Shopify Store",
  "description": "EU storefront",
  "is_active": true,
  "status": "active",
  "status_message": null,
  "last_tested_at": "2026-09-14T07:55:00Z",
  "last_sync_at": "2026-09-14T08:00:00Z",
  "created_at": "2026-01-15T00:00:00Z"
}

Update a connector

Updates a connector's name, description, credentials, sync options, or active flag. All fields are optional — only supplied fields are changed.

Path parameters

  • Name
    connector_id
    Type
    string
    Description

    The connector ID.

Body parameters

  • Name
    name
    Type
    string
    Description

    Updated name.

  • Name
    description
    Type
    string
    Description

    Updated description.

  • Name
    credentials
    Type
    object
    Description

    Replaces the stored credentials object.

  • Name
    sync_options
    Type
    object
    Description

    Replaces the stored sync options object.

  • Name
    is_active
    Type
    boolean
    Description

    Enable or disable the connector.

Request

PATCH
/connectors/{connector_id}
curl -X PATCH https://api.pixeepim.com/api/v1/connectors/550e8400-e29b-41d4-a716-000000000010 \
  -H "X-API-Key: {api_key}" \
  -H "Content-Type: application/json" \
  -d '{"is_active": false}'

Delete a connector

Removes a connector. Past sync job history is retained.

Path parameters

  • Name
    connector_id
    Type
    string
    Description

    The connector ID.

Request

DELETE
/connectors/{connector_id}
curl -X DELETE https://api.pixeepim.com/api/v1/connectors/550e8400-e29b-41d4-a716-000000000010 \
  -H "X-API-Key: {api_key}"

Test a connector

Tests the connection to the platform (authentication, reachability). Does not sync any data.

Path parameters

  • Name
    connector_id
    Type
    string
    Description

    The connector ID.

Request

POST
/connectors/{connector_id}/test
curl -X POST https://api.pixeepim.com/api/v1/connectors/550e8400-e29b-41d4-a716-000000000010/test \
  -H "X-API-Key: {api_key}"

Response

{
  "success": true,
  "status": "ok",
  "message": "Connection successful"
}

Sync job history

Returns the recent sync job history for a connector.

Path parameters

  • Name
    connector_id
    Type
    string
    Description

    The connector ID.

Query parameters

  • Name
    limit
    Type
    integer
    Description

    Maximum number of jobs to return.

Request

GET
/connectors/{connector_id}/jobs
curl "https://api.pixeepim.com/api/v1/connectors/550e8400-e29b-41d4-a716-000000000010/jobs?limit=20" \
  -H "X-API-Key: {api_key}"

Response

[
  {
    "id": "550e8400-e29b-41d4-a716-000000000011",
    "job_type": "push_products",
    "status": "completed",
    "trigger": "manual",
    "pushed": 2,
    "pulled": 0,
    "updated": 1,
    "errors": 0,
    "skipped": 0
  }
]

Sync operations

Each sync direction is a separate endpoint. All four enqueue a Celery task on the connectors queue and return an acknowledgement immediately; track progress via Sync job history or Get a sync job status.

Push products

Pushes catalog data from Pixee PIM to the connected platform. Products are sent in chunks of 100.

Path parameters

  • Name
    connector_id
    Type
    string
    Description

    The connector ID.

Body parameters

  • Name
    product_ids
    Type
    array
    Description

    Optional list of product UUIDs to push. Pushes the entire catalog if omitted.

  • Name
    since_timestamp
    Type
    string
    Description

    Optional ISO 8601 datetime — pushes only products modified since this timestamp.

Request

POST
/connectors/{connector_id}/sync/push-products
curl -X POST https://api.pixeepim.com/api/v1/connectors/550e8400-e29b-41d4-a716-000000000010/sync/push-products \
  -H "X-API-Key: {api_key}" \
  -H "Content-Type: application/json" \
  -d '{
    "product_ids": [
      "550e8400-e29b-41d4-a716-446655440000",
      "550e8400-e29b-41d4-a716-446655440001"
    ]
  }'

Response

{
  "success": true,
  "status": "processing",
  "message": "Push products queued"
}

Pull products

Pulls product data from the connected platform into Pixee PIM. Existing products are matched by external ID or EAN and updated; new products are created.

Path parameters

  • Name
    connector_id
    Type
    string
    Description

    The connector ID.

Body parameters

  • Name
    since_timestamp
    Type
    string
    Description

    Optional ISO 8601 datetime — pulls only items modified since this timestamp.

Request

POST
/connectors/{connector_id}/sync/pull-products
curl -X POST https://api.pixeepim.com/api/v1/connectors/550e8400-e29b-41d4-a716-000000000010/sync/pull-products \
  -H "X-API-Key: {api_key}"

Response

{
  "success": true,
  "status": "processing",
  "message": "Pull products queued"
}

Push stock

Pushes current stock levels from Pixee PIM to the connected platform. This is a lightweight operation — only stock quantities are transmitted.

Path parameters

  • Name
    connector_id
    Type
    string
    Description

    The connector ID.

Request

POST
/connectors/{connector_id}/sync/push-stock
curl -X POST https://api.pixeepim.com/api/v1/connectors/550e8400-e29b-41d4-a716-000000000010/sync/push-stock \
  -H "X-API-Key: {api_key}"

Response

{
  "success": true,
  "status": "processing",
  "message": "Push stock queued"
}

Push prices

Pushes pricing data to the connected platform. The connector uses the matching price list for the platform's channel if one is configured; otherwise it falls back to the product's base price.

Path parameters

  • Name
    connector_id
    Type
    string
    Description

    The connector ID.

Request

POST
/connectors/{connector_id}/sync/push-prices
curl -X POST https://api.pixeepim.com/api/v1/connectors/550e8400-e29b-41d4-a716-000000000010/sync/push-prices \
  -H "X-API-Key: {api_key}"

Response

{
  "success": true,
  "status": "processing",
  "message": "Push prices queued"
}

Get a sync job status

Returns the current status of a specific sync job triggered by one of the endpoints above.

Path parameters

  • Name
    connector_id
    Type
    string
    Description

    The connector ID.

  • Name
    job_id
    Type
    string
    Description

    The sync job ID.

Request

GET
/connectors/{connector_id}/sync/jobs/{job_id}
curl https://api.pixeepim.com/api/v1/connectors/550e8400-e29b-41d4-a716-000000000010/sync/jobs/550e8400-e29b-41d4-a716-000000000011 \
  -H "X-API-Key: {api_key}"

Response

{
  "id": "550e8400-e29b-41d4-a716-000000000011",
  "job_type": "push_products",
  "status": "completed",
  "pushed": 2,
  "errors": 0
}

Sync profiles

A sync profile says what a synchronization of a shop or ERP connection carries — stock only, stock and prices, SEO texts… — so that a schedule or a manual launch can send or fetch only that. Profiles exist for the six connections of the common sync engine: prestashop, woocommerce, magento, dolibarr, sage and odoo (the plateforme parameter). The connections themselves are configured in the app; only their profiles are exposed here.

  • One profile = one connection, one direction. sens is export (send to the shop or ERP) or import (fetch from it) — never both: make two profiles. Names are unique per connection, case ignored.
  • Contents (contenus) come from a closed list: stocks, prix, textes, seo, fiche (the whole product record), categories and, since v6.41, medias (the product's image gallery) and marques (the brand). They translate into job units (unites): stocks → stocks, prix → prix, textes / seo / fiche / medias / marques → produits, categories → categories (on import, categories come with the product record: produits).
  • “Par défaut” is computed, never stored. Each connection always has two “Par défaut” profiles (export and import): id: null, par_defaut: true, modifiable: false, all contents (on import: all but medias and marques, which only a send runs), and the connection's own settings. A schedule without a profile runs “Par défaut” — exactly what it did before profiles existed.
  • Neutral profiles. A profile is neutre when it changes nothing to how data is sent compared with the connection settings: no surcharges, no named mapping, and the product record goes whole (or is not touched). Attaching a neutral profile to a validated schedule keeps its validation.
  • What runs (since v6.38). A profile runs exactly as it announces, or not at all. Its surcharges are applied by the synchronization (they replace the connection's options for that run only). An export profile with textes and/or seo but without fiche sends only those texts (textes: title, description, short description; seo: meta title, meta description, keywords, URL key) on PrestaShop and WooCommerce: it updates products already linked in the shop, never creates one (unlinked products are skipped and counted), and sends no images, variations or combinations. Since v6.41, on PrestaShop such a texts / SEO profile no longer sets the product features nor the GPSR records (manufacturer, EU responsible person) either; a full send (“Par défaut”, fiche) sets them as before.
  • Media and brand only (since v6.41). An export profile with medias and/or marques but without fiche sends only the image gallery and/or the brand (by its validated brand correspondence, otherwise by name, like a full send) to PrestaShop, WooCommerce or Magento: existing products only (a product absent from the shop is skipped and counted, never created); texts, prices and stocks are untouched, and the connection settings still decide (images, PrestaShop manufacturers, WooCommerce _ean / _brand fields, Magento brand attribute).
  • What is still refused. Launching or scheduling answers 409 SYNC_PROFIL_NON_EXECUTABLE with details.raison: inactif; surcharge_non_appliquee — an override the synchronization does not apply, or that no unit of the profile reads (details.surcharges_non_appliquees lists them); contenu_partiel_non_pris_en_charge — a partial product record the platform or direction does not support: texts / SEO outside PrestaShop and WooCommerce, media / brand outside PrestaShop, WooCommerce and Magento, any partial record on import; since v6.41 the refusal lists the unsupported contents in details.contenus_non_pris_en_charge (e.g. ["medias"] on a Dolibarr export). Such a profile can still be saved and read; executable and raison_non_executable tell you in advance.
  • Named mapping (import, since v6.39). An import profile may carry mapping_id: one of the named import mappings of the same connection (managed in the app, Import › Mapping step), or null for the connection's “Par défaut” mapping. The mapping is applied when the profile is launched or runs on a schedule, and the import guards (preview required when the import creates products with a mapping that is not validated) are judged with that mapping. An export profile never takes one.
  • Preview. apercu is par_passage (a preview at every run, default) or valide_une_fois (validated once). There is no “no preview” option.

The profile object

  • Name
    id
    Type
    string | null
    Description

    Profile ID (UUID); null for a computed “Par défaut”.

  • Name
    plateforme
    Type
    string
    Description

    prestashop, woocommerce, magento, dolibarr, sage or odoo.

  • Name
    configuration_id
    Type
    string | null
    Description

    The connection this profile belongs to.

  • Name
    nom
    Type
    string
    Description

    1 to 120 characters, unique per connection (case ignored). “Par défaut” is reserved.

  • Name
    par_defaut
    Type
    boolean
    Description

    true for the computed “Par défaut” profiles.

  • Name
    modifiable
    Type
    boolean
    Description

    false for “Par défaut”.

  • Name
    sens
    Type
    string
    Description

    export or import.

  • Name
    contenus
    Type
    string[]
    Description

    Among stocks, prix, textes, seo, fiche, categories, medias, marques (the last two since v6.41), returned in that order.

  • Name
    unites
    Type
    string[]
    Description

    Job units the profile runs (produits, stocks, prix, categories), computed from sens and contenus.

  • Name
    surcharges
    Type
    object
    Description

    Connection options replaced for this profile only — a short allow-list per direction: export textes_envoyes, categories_mise_a_jour, envoyer_prix; import ecraser_textes, import_seo_enseigne, rapatrier_stocks, rapatrier_prix, rapatrier_prix_achat, rapatrier_prix_enseigne (only those the platform knows). Everything else (tax, warehouse, languages…) stays set on the connection.

  • Name
    perimetre_defaut
    Type
    object | null
    Description

    Scope proposed by the profile; when set, a launch cannot change it.

  • Name
    apercu
    Type
    string
    Description

    par_passage (default) or valide_une_fois.

  • Name
    mapping_id
    Type
    string | null
    Description

    Import profiles only: the named import mapping of the same connection that the profile applies (UUID), or null for “Par défaut”. Always null on export profiles.

  • Name
    actif
    Type
    boolean
    Description

    An inactive profile cannot be launched.

  • Name
    neutre
    Type
    boolean
    Description

    The profile changes nothing to what is sent compared with the connection settings.

  • Name
    executable
    Type
    boolean
    Description

    Whether it can be launched or attached to a schedule now.

  • Name
    raison_non_executable
    Type
    string | null
    Description

    inactif, surcharge_non_appliquee or contenu_partiel_non_pris_en_charge (see What is still refused); null when executable. The v6.37 values surcharges_au_lot_suivant, contenu_partiel_au_lot_suivant and mapping_au_lot_suivant are no longer returned.

  • Name
    empreinte
    Type
    string | null
    Description

    SHA-256 of what decides the profile (direction, contents, overrides, scope, preview, mapping) — neither the name nor actif.

  • Name
    cree_par / cree_le / modifie_par / modifie_le
    Type
    string | null
    Description

    Author and ISO 8601 timestamps.


List a connection's profiles

Returns the two computed “Par défaut” profiles (export, then import), then the saved profiles of the connection, by direction and name.

Query parameters

  • Name
    plateforme
    Type
    string
    Description

    prestashop, woocommerce, magento, dolibarr, sage or odoo. Anything else answers 422 SYNC_PROFIL_INVALIDE.

  • Name
    configuration_id
    Type
    string
    Description

    The connection (UUID); absent = the platform's default connection.

Request

GET
/sync-profils
curl "https://api.pixeepim.com/api/v1/sync-profils?plateforme=prestashop" \
  -H "X-API-Key: {api_key}"

Response

{
  "plateforme": "prestashop",
  "configuration_id": "550e8400-e29b-41d4-a716-000000000020",
  "items": [
    {
      "id": null,
      "plateforme": "prestashop",
      "configuration_id": "550e8400-e29b-41d4-a716-000000000020",
      "nom": "Par défaut",
      "par_defaut": true,
      "modifiable": false,
      "sens": "export",
      "contenus": ["stocks", "prix", "textes", "seo", "fiche", "categories"],
      "unites": ["produits", "stocks", "prix", "categories"],
      "surcharges": {},
      "perimetre_defaut": null,
      "apercu": "par_passage",
      "mapping_id": null,
      "actif": true,
      "neutre": true,
      "executable": true,
      "raison_non_executable": null,
      "empreinte": null
    },
    { "id": null, "nom": "Par défaut", "sens": "import", "par_defaut": true },
    {
      "id": "550e8400-e29b-41d4-a716-000000000021",
      "nom": "Stock + prix",
      "par_defaut": false,
      "modifiable": true,
      "sens": "export",
      "contenus": ["stocks", "prix"],
      "unites": ["stocks", "prix"],
      "surcharges": {},
      "apercu": "par_passage",
      "actif": true,
      "neutre": true,
      "executable": true,
      "raison_non_executable": null
    }
  ]
}

Create a profile

Creates a profile on a connection. The body is a closed list: an unknown key is refused (422), never ignored. Values are checked against the platform's options; a refused value answers 422 SYNC_PROFIL_INVALIDE with details.raison and details.champ. A name already used on the connection answers 409 SYNC_PROFIL_NOM_PRIS. Nothing is saved on a refusal.

Query parameters

  • Name
    plateforme
    Type
    string
    Description

    The platform.

  • Name
    configuration_id
    Type
    string
    Description

    The connection; absent = the default one.

Body parameters

  • Name
    nom
    Type
    string
    Description

    Profile name (spaces trimmed, 1–120 characters).

  • Name
    sens
    Type
    string
    Description

    export or import.

  • Name
    contenus
    Type
    string[]
    Description

    Non-empty, among stocks, prix, textes, seo, fiche, categories, medias, marques. A profile whose contents the platform or direction cannot run (e.g. medias on import) is saved but not executable (contenu_partiel_non_pris_en_charge).

  • Name
    surcharges
    Type
    object
    Description

    Allow-listed options for this direction (see the profile object). Their values are checked against the connection's options merged as at run time: a value that would make them unreadable is refused (422 SYNC_PROFIL_INVALIDE, details.raison: surcharge_non_permise).

  • Name
    perimetre_defaut
    Type
    object
    Description

    Proposed scope, validated for the direction.

  • Name
    apercu
    Type
    string
    Description

    par_passage (default) or valide_une_fois.

  • Name
    actif
    Type
    boolean
    Description

    Default true.

  • Name
    mapping_id
    Type
    string | null
    Description

    Import only: a named import mapping of the same connection, or null (“Par défaut”). Refused with 422 SYNC_PROFIL_INVALIDE and details.raison: mapping_envoi_interdit (export profile), mapping_inconnu (unknown, or another connection's mapping), mapping_incompatible (the mapping, merged with the connection's options, would make them unreadable).

Request

POST
/sync-profils
curl -X POST "https://api.pixeepim.com/api/v1/sync-profils?plateforme=woocommerce" \
  -H "X-API-Key: {api_key}" \
  -H "Content-Type: application/json" \
  -d '{
    "nom": "Stock nightly",
    "sens": "export",
    "contenus": ["stocks"]
  }'

Request (import with a named mapping)

POST
/sync-profils
curl -X POST "https://api.pixeepim.com/api/v1/sync-profils?plateforme=prestashop" \
  -H "X-API-Key: {api_key}" \
  -H "Content-Type: application/json" \
  -d '{
    "nom": "Reprise SEO",
    "sens": "import",
    "contenus": ["fiche"],
    "mapping_id": "550e8400-e29b-41d4-a716-000000000060"
  }'

Response (201)

{
  "id": "550e8400-e29b-41d4-a716-000000000022",
  "plateforme": "woocommerce",
  "configuration_id": "550e8400-e29b-41d4-a716-000000000030",
  "nom": "Stock nightly",
  "par_defaut": false,
  "modifiable": true,
  "sens": "export",
  "contenus": ["stocks"],
  "unites": ["stocks"],
  "surcharges": {},
  "perimetre_defaut": null,
  "apercu": "par_passage",
  "mapping_id": null,
  "actif": true,
  "neutre": true,
  "executable": true,
  "raison_non_executable": null,
  "empreinte": "9f2c…",
  "cree_le": "2026-11-01T10:00:00+00:00"
}

Get a profile

Returns one saved profile (profile object). Unknown ID: 404 SYNC_PROFIL_INTROUVABLE.

Request

GET
/sync-profils/{profil_id}
curl https://api.pixeepim.com/api/v1/sync-profils/550e8400-e29b-41d4-a716-000000000022 \
  -H "X-API-Key: {api_key}"

Update a profile

Same body as Create a profile; keys left out keep their value. While schedules use the profile, neither its direction nor its units may change (409 SYNC_PROFIL_UTILISE, details.plannings), and it must stay executable; its new fingerprint re-checks the validation of each of those schedules.

Request

PUT
/sync-profils/{profil_id}
curl -X PUT https://api.pixeepim.com/api/v1/sync-profils/550e8400-e29b-41d4-a716-000000000022 \
  -H "X-API-Key: {api_key}" \
  -H "Content-Type: application/json" \
  -d '{ "nom": "Stock — every night", "apercu": "valide_une_fois" }'

Delete a profile

Deletes a profile that no schedule uses; otherwise 409 SYNC_PROFIL_UTILISE (attach those schedules to another profile first). Allowed even when sending is disabled for the instance.

Request

DELETE
/sync-profils/{profil_id}
curl -X DELETE https://api.pixeepim.com/api/v1/sync-profils/550e8400-e29b-41d4-a716-000000000022 \
  -H "X-API-Key: {api_key}"

Response

{ "id": "550e8400-e29b-41d4-a716-000000000022", "supprime": true }

List profile types

The catalogue of suggested profiles: Stock (stocks), Stock + prix (stocks, prix), SEO (seo), SEO + contenus (textes, seo) and, since v6.41, Médias (medias) and Fiche + médias (fiche, medias). “Complete” is not one of them: it is “Par défaut”.

Query parameters

  • Name
    langue
    Type
    string
    Description

    Language of the names: fr (default) or en.

Request

GET
/sync-profils/types
curl "https://api.pixeepim.com/api/v1/sync-profils/types?langue=en" \
  -H "X-API-Key: {api_key}"

Response

{
  "items": [
    { "cle": "stock", "nom": "Stock", "contenus": ["stocks"] },
    { "cle": "stock_prix", "nom": "Stock + prices", "contenus": ["stocks", "prix"] },
    { "cle": "seo", "nom": "SEO", "contenus": ["seo"] },
    { "cle": "seo_contenus", "nom": "SEO + content", "contenus": ["textes", "seo"] },
    { "cle": "medias", "nom": "Media", "contenus": ["medias"] },
    { "cle": "fiche_medias", "nom": "Product page + media", "contenus": ["fiche", "medias"] }
  ]
}

Create the profile types

Creates, on one connection and for one direction, the profile types that are missing (same name, case ignored) — calling it again creates nothing more. “Stock” and “Stock + prix” have no override. Since v6.38, on export to a platform that has the texts-sending option (PrestaShop, WooCommerce), the two SEO types are created with the override textes_envoyes = their text groups, sent toujours (always) — without it, the connection's default (“on creation only”) would hold back all their texts on update. Since v6.41, only the types executable in that direction on that platform are created: on import, neither “SEO”, “SEO + contenus” nor “Médias”; to Dolibarr, Sage or Odoo, neither the SEO types nor “Médias”; to Magento, no SEO type (they used to be created, then refused at launch). Types skipped this way appear neither in crees nor in existants.

Query parameters

  • Name
    plateforme
    Type
    string
    Description

    The platform.

  • Name
    configuration_id
    Type
    string
    Description

    The connection; absent = the default one.

Body parameters

  • Name
    sens
    Type
    string
    Description

    export or import.

  • Name
    langue
    Type
    string
    Description

    Language of the created names: fr (default) or en.

Request

POST
/sync-profils/types
curl -X POST "https://api.pixeepim.com/api/v1/sync-profils/types?plateforme=prestashop" \
  -H "X-API-Key: {api_key}" \
  -H "Content-Type: application/json" \
  -d '{ "sens": "export", "langue": "fr" }'

Response

{
  "crees": [
    { "id": "550e8400-e29b-41d4-a716-000000000023", "nom": "Stock", "contenus": ["stocks"], "executable": true },
    {
      "id": "550e8400-e29b-41d4-a716-000000000024",
      "nom": "SEO",
      "contenus": ["seo"],
      "surcharges": { "textes_envoyes": { "quand": "toujours", "groupes": ["seo"] } },
      "executable": true
    },
    {
      "id": "550e8400-e29b-41d4-a716-000000000025",
      "nom": "SEO + contenus",
      "contenus": ["textes", "seo"],
      "surcharges": { "textes_envoyes": { "quand": "toujours", "groupes": ["titre", "description", "description_courte", "seo"] } },
      "executable": true
    }
  ],
  "existants": ["Stock + prix"]
}

Attach a profile to a schedule

Sets the profile a sync schedule runs; profil_id: null puts it back on “Par défaut”. The profile must belong to the same connection, have the same direction (a schedule running both directions takes no profile) and the same units as the schedule — otherwise 422 SYNC_PROFIL_INCOMPATIBLE (details.raison: autre_connexion, autre_sens, autres_types). A profile that is not executable is refused with 409 SYNC_PROFIL_NON_EXECUTABLE. The schedule's validation is re-checked and returned: a neutral profile keeps it (validation.invalide appears when it no longer holds).

Path parameters

  • Name
    plateforme
    Type
    string
    Description

    The platform.

  • Name
    schedule_id
    Type
    string
    Description

    The schedule (UUID); unknown → 404 CONNECTOR_SYNC_SCHEDULE_NOT_FOUND.

Body parameters

  • Name
    profil_id
    Type
    string | null
    Description

    The profile, or null for “Par défaut”.

Request

PUT
/sync-profils/plannings/{plateforme}/{schedule_id}
curl -X PUT https://api.pixeepim.com/api/v1/sync-profils/plannings/prestashop/550e8400-e29b-41d4-a716-000000000040 \
  -H "X-API-Key: {api_key}" \
  -H "Content-Type: application/json" \
  -d '{ "profil_id": "550e8400-e29b-41d4-a716-000000000023" }'

Response

{
  "schedule_id": "550e8400-e29b-41d4-a716-000000000040",
  "profil_id": "550e8400-e29b-41d4-a716-000000000023",
  "validation": {
    "mode": "par_passage",
    "par": null,
    "le": null,
    "unites": [],
    "apercus": {},
    "seuils": null
  }
}

Launch a profile

“Launch with profile X”. One job per unit of the profile — all units, or nothing: if one unit is already running, 409 SYNC_UNIT_ALREADY_RUNNING and nothing is created. Every job carries the profile (job_metadata.profil: id, name, fingerprint).

  • Export profile: nothing is sent yet. Each unit that requires it (products, stock, prices) gets a preview to validate; apercus maps each unit to its preview job, and the data leaves only when that preview is validated and sent, as for any other export. A unit without preview (categories) runs as a job.
  • What the profile changes travels with the run: on export, the text filter and the applied overrides are part of the preview's parameters (and of its fingerprint), hence of the job sent when it is validated; on import, the launch overrides (ecraser_textes) go to the job's import_options.
  • Import profile: one import job per unit, with the profile's named mapping (mapping_id) and overrides. The usual guards are judged with that mapping: a preview is required when the import creates products and that mapping is not validated — pass its apercu_job_id, or first launch the preview with {"apercu": true}.
  • A profile that does not run as it announces (see What is still refused) is refused: 409 SYNC_PROFIL_NON_EXECUTABLE, details.raison (and details.surcharges_non_appliquees). Nothing is launched.

Body parameters (optional)

  • Name
    perimetre
    Type
    object
    Description

    Scope of this launch — accepted only when the profile proposes none (perimetre_defaut); otherwise 422 SYNC_PROFIL_INVALIDE.

  • Name
    apercu_job_id
    Type
    string
    Description

    Import that creates products without a validated mapping: the import preview to use.

  • Name
    apercu
    Type
    boolean
    Description

    Since v6.39, import profiles only: true launches only the import preview of products (unit produits), with the profile's mapping and overrides — same fingerprint as the import that will follow; apercus.produits gives its job. A mapping that is incomplete is refused before anything is created (409, named). On an export profile, or one without the produits unit: 422 SYNC_PROFIL_INVALIDE, details.raison: apercu_import_seulement.

Request

POST
/sync-profils/{profil_id}/lancer
curl -X POST https://api.pixeepim.com/api/v1/sync-profils/550e8400-e29b-41d4-a716-000000000021/lancer \
  -H "X-API-Key: {api_key}"

Response (export profile, abridged)

{
  "profil_id": "550e8400-e29b-41d4-a716-000000000021",
  "jobs": [
    {
      "id": "550e8400-e29b-41d4-a716-000000000050",
      "name": "Aperçu : Stock + prix",
      "sync_direction": "export",
      "unite": "stocks",
      "status": "pending",
      "job_metadata": { "profil": { "id": "550e8400-e29b-41d4-a716-000000000021", "nom": "Stock + prix", "empreinte": "9f2c…" } }
    },
    { "id": "550e8400-e29b-41d4-a716-000000000051", "name": "Aperçu : Stock + prix", "unite": "prix", "status": "pending" }
  ],
  "apercus": {
    "stocks": "550e8400-e29b-41d4-a716-000000000050",
    "prix": "550e8400-e29b-41d4-a716-000000000051"
  }
}

Request (import preview)

POST
/sync-profils/{profil_id}/lancer
curl -X POST https://api.pixeepim.com/api/v1/sync-profils/550e8400-e29b-41d4-a716-000000000022/lancer \
  -H "X-API-Key: {api_key}" \
  -H "Content-Type: application/json" \
  -d '{ "apercu": true }'

Response (import preview, abridged)

{
  "profil_id": "550e8400-e29b-41d4-a716-000000000022",
  "jobs": [
    {
      "id": "550e8400-e29b-41d4-a716-000000000052",
      "name": "Aperçu : Reprise SEO",
      "sync_direction": "import",
      "unite": "produits",
      "status": "pending"
    }
  ],
  "apercus": { "produits": "550e8400-e29b-41d4-a716-000000000052" }
}

Error (409)

{
  "error": {
    "code": 409,
    "error_code": "SYNC_PROFIL_NON_EXECUTABLE",
    "type": "conflict",
    "message": "This profile cannot be launched: it is disabled, or it requires a setting the synchronisation does not apply for this shop (…). Nothing was launched.",
    "details": { "raison": "contenu_partiel_non_pris_en_charge", "profil_id": "550e8400-e29b-41d4-a716-000000000024" }
  }
}

Inbound webhooks

Some platforms push data or events into Pixee PIM instead of (or in addition to) being pulled. These endpoints are called by the platform itself, not by your integration.

Shopify

Receives Shopify webhook events (order/product changes). Verified via X-Shopify-Hmac-Sha256 against the connector's stored webhook secret.

Headers

  • Name
    x-shopify-hmac-sha256
    Type
    string
    Description

    HMAC-SHA256 signature of the raw request body, base64-encoded.

  • Name
    x-shopify-topic
    Type
    string
    Description

    Event topic (e.g. products/update).

  • Name
    x-shopify-webhook-id
    Type
    string
    Description

    Shopify's delivery ID — used for replay protection (24h Redis dedup).

Request

POST
/connectors/shopify/webhook
curl -X POST https://api.pixeepim.com/api/v1/connectors/shopify/webhook \
  -H "X-Shopify-Hmac-Sha256: {signature}" \
  -H "X-Shopify-Topic: products/update" \
  -H "X-Shopify-Webhook-Id: {delivery_id}" \
  -H "Content-Type: application/json" \
  -d '{ "id": 123456789, "title": "Updated product" }'

WooCommerce

Receives WooCommerce webhook events. Verified via X-WC-Webhook-Signature.

Headers

  • Name
    x-wc-webhook-signature
    Type
    string
    Description

    HMAC-SHA256 signature, base64-encoded.

  • Name
    x-wc-webhook-topic
    Type
    string
    Description

    Event topic (e.g. product.updated).

  • Name
    x-wc-webhook-delivery-id
    Type
    string
    Description

    Delivery ID — used for replay protection (24h Redis dedup).

Request

POST
/connectors/woocommerce/webhook
curl -X POST https://api.pixeepim.com/api/v1/connectors/woocommerce/webhook \
  -H "X-WC-Webhook-Signature: {signature}" \
  -H "X-WC-Webhook-Topic: product.updated" \
  -H "Content-Type: application/json" \
  -d '{ "id": 42, "name": "Updated product" }'

BigCommerce

Receives BigCommerce webhook events. Verified via a shared X-Webhook-Token.

Headers

  • Name
    X-Webhook-Token
    Type
    string
    Description

    Shared token configured on the connector.

  • Name
    X-BC-Webhook-Id
    Type
    string
    Description

    BigCommerce's webhook ID — used for replay protection (24h Redis dedup).

Request

POST
/connectors/bigcommerce/webhook
curl -X POST https://api.pixeepim.com/api/v1/connectors/bigcommerce/webhook \
  -H "X-Webhook-Token: {token}" \
  -H "X-BC-Webhook-Id: {webhook_id}" \
  -H "Content-Type: application/json" \
  -d '{ "scope": "store/product/updated", "data": { "id": 42 } }'

Magento 2

Receives push notifications from a Magento 2 instance, authenticated with Basic Auth.

Headers

  • Name
    authorization
    Type
    string
    Description

    Basic credentials configured on the connector.

  • Name
    x-magento-webhook-id
    Type
    string
    Description

    Delivery ID — used for replay protection (24h Redis dedup).

Request

POST
/connectors/magento/push
curl -X POST https://api.pixeepim.com/api/v1/connectors/magento/push \
  -H "Authorization: Basic {base64_credentials}" \
  -H "X-Magento-Webhook-Id: {delivery_id}" \
  -H "Content-Type: application/json" \
  -d '{ "sku": "ART-001", "qty": 42 }'

Was this page helpful?