← Platform API v1.32.0

POST /api-client/catalog/products

apiClientCatalogCreateProduct · Catalog

Requires API_CLIENT catalog.write and PUBLIC_API entitlement. Tenant is derived from the key. Create in DRAFT; publish by PUT after an active variant exists. Type, unit and tracking become immutable once any variant exists.

Autenticación
PlatformApiKey · http bearer

Ejemplo

Los valores entre <> y {} son marcadores: sustitúyelos por los tuyos antes de ejecutarlo.

curl --request POST \
  --url 'https://api.marky.ec/v1/api-client/catalog/products' \
  --header 'Authorization: Bearer <PlatformApiKey>' \
  --header 'Idempotency-Key: <Idempotency-Key>' \
  --header 'Content-Type: application/json' \
  --data @body.json

Parámetros

Nombre En Tipo Descripción
Idempotency-Keyobligatorio header stringformato uuid UUIDv4 or UUIDv7. Normalized input fingerprint; same actor/tenant/operation and key replay for 24 hours. Changed input conflicts; authorization rechecked before replay.

Cuerpo (obligatorio)

application/json
CatalogProductCreateInput
objectsin otras propiedades
  • nameobligatorio
    stringlongitud mín. 1longitud máx. 200
  • slug
    string | nullpatrón ^[a-z0-9]+(-[a-z0-9]+)*$longitud máx. 160

    Web identifier, unique per company and kept reserved after archiving. Optional. Omitted or null on creation: generated from the name (accents and symbols removed, words joined by hyphens, at most 160 characters) and, when taken, completed with -2, -3… Stated: used as given, 409 when taken. Omitted or null on update: the product keeps its slug; renaming a product never changes it.

  • variantMode
    uno de "SINGLE", "MULTIPLE", null

    SINGLE: an article sold as one SKU. MULTIPLE: an article that holds several versions of itself, each with its own SKU. Omitted or null on creation: MULTIPLE when more than one variant is created with the product, SINGLE otherwise. Omitted or null on update: unchanged. SINGLE is refused (409) while the product has more than one active variant.

  • productTypeobligatorio
    uno de "GOOD", "SERVICE"
  • categoryId
    string | nullformato uuidpatrón ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$
  • brandId
    string | nullformato uuidpatrón ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$
  • manufacturerId
    string | nullformato uuidpatrón ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$
  • unitOfMeasureobligatorio
    stringpatrón ^[A-Z][A-Z0-9_]{0,15}$longitud máx. 16
  • trackInventory
    booleanpor defecto false
  • trackSerials
    booleanpor defecto false
  • publicationStatus
    uno de "DRAFT", "PUBLISHED"por defecto DRAFT
  • description
    string | nulllongitud máx. 10000
  • shortDescription
    string | nulllongitud máx. 500
  • attributes
    object

    Bounded JSON (500 nodes, depth 5, 16000 characters). Reserved credential/prototype keys and secret patterns rejected. Never included in API-key reads.

  • variants
    arrayelementos máx. 100

    Variants created with the product in the same transaction: all of them or nothing. A SKU that is invalid or repeated in the request is a 400; one already taken in the company, archived variants included, is a 409, and neither leaves a product behind. Omitted: the product is created alone, as before, and completed later. With at least one variant the product may be created PUBLISHED; alone it is always a DRAFT.

    Cada elemento
    CatalogVariantInput
    objectsin otras propiedades
    • modelNumber
      string | nulllongitud máx. 100
    • barcode
      string | nulllongitud máx. 100
    • storage
      string | nulllongitud máx. 100
    • color
      string | nulllongitud máx. 100
    • skuobligatorio
      stringpatrón ^[A-Z0-9][A-Z0-9_./-]{0,99}$longitud máx. 100
    • condition
      uno de "NEW", "USED", "REFURBISHED", "OPEN_BOX", "AS_IS", null
    • grade
      uno de "A", "B", "C", null
    • simType
      uno de "ESIM", "PHYSICAL_SIM", "PHYSICAL_ESIM", "DUAL_SIM", "NOT_APPLICABLE"por defecto NOT_APPLICABLE
    • attributes
      object

      Bounded JSON (500 nodes, depth 5, 16000 characters). Reserved credential/prototype keys and secret patterns rejected. Never included in API-key reads.

    • searchAliases
      arrayelementos máx. 16por defecto []sin repetidos

      Curated variant search aliases; NFKC/trim/space normalization, duplicates ignoring case/accents rejected. Public search may match aliases; arbitrary attributes are never indexed. Omitted in full variant replacement resets aliases to [].

      Cada elemento
      stringlongitud mín. 1longitud máx. 80

Respuestas

201 Success
  • X-Request-Idstringformato uuid
  • X-RateLimit-Limitintegermín. 1 Effective requests per fixed minute window
  • X-RateLimit-Remainingintegermín. 0 Remaining capacity of the most restrictive dimension
  • X-RateLimit-Resetinteger Redis window reset, Unix seconds
  • Idempotency-Replayeduno de "true" Present on successful replay.
application/json
PublicCatalogProductCreated
objectsin otras propiedades
  • idobligatorio
    stringformato uuidpatrón ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$
  • statusobligatorio
    uno de "ACTIVE", "ARCHIVED"
  • createdAtobligatorio
    stringformato date-time
  • updatedAtobligatorio
    stringformato date-time
  • nameobligatorio
    stringlongitud mín. 1longitud máx. 200
  • slugobligatorio
    stringpatrón ^[a-z0-9]+(-[a-z0-9]+)*$longitud máx. 160
  • productTypeobligatorio
    uno de "GOOD", "SERVICE"
  • categoryIdobligatorio
    string | nullformato uuidpatrón ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$
  • brandIdobligatorio
    string | nullformato uuidpatrón ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$
  • unitOfMeasureobligatorio
    stringpatrón ^[A-Z][A-Z0-9_]{0,15}$longitud máx. 16
  • publicationStatusobligatorio
    uno de "DRAFT", "PUBLISHED"por defecto DRAFT
  • descriptionobligatorio
    string | nulllongitud máx. 10000
  • shortDescriptionobligatorio
    string | nulllongitud máx. 500
  • variants
    arrayelementos máx. 100

    The variants created with the product, in the order of the request. Present only when the request carried `variants`; a product created alone answers as it always did.

    Cada elemento
    PublicCatalogVariant
    objectsin otras propiedades
    • idobligatorio
      stringformato uuidpatrón ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$
    • statusobligatorio
      uno de "ACTIVE", "ARCHIVED"
    • createdAtobligatorio
      stringformato date-time
    • updatedAtobligatorio
      stringformato date-time
    • modelNumberobligatorio
      string | nulllongitud máx. 100
    • barcodeobligatorio
      string | nulllongitud máx. 100
    • storageobligatorio
      string | nulllongitud máx. 100
    • colorobligatorio
      string | nulllongitud máx. 100
    • skuobligatorio
      stringpatrón ^[A-Z0-9][A-Z0-9_./-]{0,99}$longitud máx. 100
    • conditionobligatorio
      uno de "NEW", "USED", "REFURBISHED", "OPEN_BOX", "AS_IS", null
    • gradeobligatorio
      uno de "A", "B", "C", null
    • simTypeobligatorio
      uno de "ESIM", "PHYSICAL_SIM", "PHYSICAL_ESIM", "DUAL_SIM", "NOT_APPLICABLE"por defecto NOT_APPLICABLE
    • productIdobligatorio
      stringformato uuidpatrón ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$
400 Invalid request
application/problem+json
ProblemDetails
objectsin otras propiedades
  • typeobligatorio
    valor fijo "about:blank"
  • statusobligatorio
    integer
  • codeobligatorio
    string
  • titleobligatorio
    string
  • detailobligatorio
    string
  • requestIdobligatorio
    stringformato uuid
  • errors
    arrayelementos máx. 200

    Where each problem is, for the codes that can say it: a JSON pointer into the request or the record (`/items/0/devices/1/imei1`) and the reason. A line of a serialized article that is short of units also says how many it bills and how many are identified. Never a value typed by the user, and never an identifier of a unit.

    Cada elemento
    objectsin otras propiedades
    • pointerobligatorio
      string
    • codeobligatorio
      string
    • required
      integermín. 0máx. 1000

      For a line short of units (UNITS_DIFFER_FROM_QUANTITY, RECEIPT_REQUIRED, DELIVERY_REQUIRED): how many units the line bills.

    • identified
      integermín. 0máx. 1000

      For the same line: how many units are identified and linked to it. Given to every reader of the document; no IMEI or serial number is.

401 Missing or invalid access token
application/problem+json
ProblemDetails
objectsin otras propiedades
  • typeobligatorio
    valor fijo "about:blank"
  • statusobligatorio
    integer
  • codeobligatorio
    string
  • titleobligatorio
    string
  • detailobligatorio
    string
  • requestIdobligatorio
    stringformato uuid
  • errors
    arrayelementos máx. 200

    Where each problem is, for the codes that can say it: a JSON pointer into the request or the record (`/items/0/devices/1/imei1`) and the reason. A line of a serialized article that is short of units also says how many it bills and how many are identified. Never a value typed by the user, and never an identifier of a unit.

    Cada elemento
    objectsin otras propiedades
    • pointerobligatorio
      string
    • codeobligatorio
      string
    • required
      integermín. 0máx. 1000

      For a line short of units (UNITS_DIFFER_FROM_QUANTITY, RECEIPT_REQUIRED, DELIVERY_REQUIRED): how many units the line bills.

    • identified
      integermín. 0máx. 1000

      For the same line: how many units are identified and linked to it. Given to every reader of the document; no IMEI or serial number is.

403 Identity, membership or permission denied
application/problem+json
ProblemDetails
objectsin otras propiedades
  • typeobligatorio
    valor fijo "about:blank"
  • statusobligatorio
    integer
  • codeobligatorio
    string
  • titleobligatorio
    string
  • detailobligatorio
    string
  • requestIdobligatorio
    stringformato uuid
  • errors
    arrayelementos máx. 200

    Where each problem is, for the codes that can say it: a JSON pointer into the request or the record (`/items/0/devices/1/imei1`) and the reason. A line of a serialized article that is short of units also says how many it bills and how many are identified. Never a value typed by the user, and never an identifier of a unit.

    Cada elemento
    objectsin otras propiedades
    • pointerobligatorio
      string
    • codeobligatorio
      string
    • required
      integermín. 0máx. 1000

      For a line short of units (UNITS_DIFFER_FROM_QUANTITY, RECEIPT_REQUIRED, DELIVERY_REQUIRED): how many units the line bills.

    • identified
      integermín. 0máx. 1000

      For the same line: how many units are identified and linked to it. Given to every reader of the document; no IMEI or serial number is.

404 Unknown resource
application/problem+json
ProblemDetails
objectsin otras propiedades
  • typeobligatorio
    valor fijo "about:blank"
  • statusobligatorio
    integer
  • codeobligatorio
    string
  • titleobligatorio
    string
  • detailobligatorio
    string
  • requestIdobligatorio
    stringformato uuid
  • errors
    arrayelementos máx. 200

    Where each problem is, for the codes that can say it: a JSON pointer into the request or the record (`/items/0/devices/1/imei1`) and the reason. A line of a serialized article that is short of units also says how many it bills and how many are identified. Never a value typed by the user, and never an identifier of a unit.

    Cada elemento
    objectsin otras propiedades
    • pointerobligatorio
      string
    • codeobligatorio
      string
    • required
      integermín. 0máx. 1000

      For a line short of units (UNITS_DIFFER_FROM_QUANTITY, RECEIPT_REQUIRED, DELIVERY_REQUIRED): how many units the line bills.

    • identified
      integermín. 0máx. 1000

      For the same line: how many units are identified and linked to it. Given to every reader of the document; no IMEI or serial number is.

409 Conflict or last manager
application/problem+json
ProblemDetails
objectsin otras propiedades
  • typeobligatorio
    valor fijo "about:blank"
  • statusobligatorio
    integer
  • codeobligatorio
    string
  • titleobligatorio
    string
  • detailobligatorio
    string
  • requestIdobligatorio
    stringformato uuid
  • errors
    arrayelementos máx. 200

    Where each problem is, for the codes that can say it: a JSON pointer into the request or the record (`/items/0/devices/1/imei1`) and the reason. A line of a serialized article that is short of units also says how many it bills and how many are identified. Never a value typed by the user, and never an identifier of a unit.

    Cada elemento
    objectsin otras propiedades
    • pointerobligatorio
      string
    • codeobligatorio
      string
    • required
      integermín. 0máx. 1000

      For a line short of units (UNITS_DIFFER_FROM_QUANTITY, RECEIPT_REQUIRED, DELIVERY_REQUIRED): how many units the line bills.

    • identified
      integermín. 0máx. 1000

      For the same line: how many units are identified and linked to it. Given to every reader of the document; no IMEI or serial number is.

413 Payload too large
application/problem+json
ProblemDetails
objectsin otras propiedades
  • typeobligatorio
    valor fijo "about:blank"
  • statusobligatorio
    integer
  • codeobligatorio
    string
  • titleobligatorio
    string
  • detailobligatorio
    string
  • requestIdobligatorio
    stringformato uuid
  • errors
    arrayelementos máx. 200

    Where each problem is, for the codes that can say it: a JSON pointer into the request or the record (`/items/0/devices/1/imei1`) and the reason. A line of a serialized article that is short of units also says how many it bills and how many are identified. Never a value typed by the user, and never an identifier of a unit.

    Cada elemento
    objectsin otras propiedades
    • pointerobligatorio
      string
    • codeobligatorio
      string
    • required
      integermín. 0máx. 1000

      For a line short of units (UNITS_DIFFER_FROM_QUANTITY, RECEIPT_REQUIRED, DELIVERY_REQUIRED): how many units the line bills.

    • identified
      integermín. 0máx. 1000

      For the same line: how many units are identified and linked to it. Given to every reader of the document; no IMEI or serial number is.

429 Per-minute rate or monthly quota exceeded; authenticated API clients require PUBLIC_API entitlement.
  • Retry-Afterintegermín. 1 Seconds before retrying; quota reset is UTC next month.
application/problem+json
ProblemDetails
objectsin otras propiedades
  • typeobligatorio
    valor fijo "about:blank"
  • statusobligatorio
    integer
  • codeobligatorio
    string
  • titleobligatorio
    string
  • detailobligatorio
    string
  • requestIdobligatorio
    stringformato uuid
  • errors
    arrayelementos máx. 200

    Where each problem is, for the codes that can say it: a JSON pointer into the request or the record (`/items/0/devices/1/imei1`) and the reason. A line of a serialized article that is short of units also says how many it bills and how many are identified. Never a value typed by the user, and never an identifier of a unit.

    Cada elemento
    objectsin otras propiedades
    • pointerobligatorio
      string
    • codeobligatorio
      string
    • required
      integermín. 0máx. 1000

      For a line short of units (UNITS_DIFFER_FROM_QUANTITY, RECEIPT_REQUIRED, DELIVERY_REQUIRED): how many units the line bills.

    • identified
      integermín. 0máx. 1000

      For the same line: how many units are identified and linked to it. Given to every reader of the document; no IMEI or serial number is.

500 Internal failure
application/problem+json
ProblemDetails
objectsin otras propiedades
  • typeobligatorio
    valor fijo "about:blank"
  • statusobligatorio
    integer
  • codeobligatorio
    string
  • titleobligatorio
    string
  • detailobligatorio
    string
  • requestIdobligatorio
    stringformato uuid
  • errors
    arrayelementos máx. 200

    Where each problem is, for the codes that can say it: a JSON pointer into the request or the record (`/items/0/devices/1/imei1`) and the reason. A line of a serialized article that is short of units also says how many it bills and how many are identified. Never a value typed by the user, and never an identifier of a unit.

    Cada elemento
    objectsin otras propiedades
    • pointerobligatorio
      string
    • codeobligatorio
      string
    • required
      integermín. 0máx. 1000

      For a line short of units (UNITS_DIFFER_FROM_QUANTITY, RECEIPT_REQUIRED, DELIVERY_REQUIRED): how many units the line bills.

    • identified
      integermín. 0máx. 1000

      For the same line: how many units are identified and linked to it. Given to every reader of the document; no IMEI or serial number is.

503 Auth/database/governance unavailable; no memory fallback for Redis.
application/problem+json
ProblemDetails
objectsin otras propiedades
  • typeobligatorio
    valor fijo "about:blank"
  • statusobligatorio
    integer
  • codeobligatorio
    string
  • titleobligatorio
    string
  • detailobligatorio
    string
  • requestIdobligatorio
    stringformato uuid
  • errors
    arrayelementos máx. 200

    Where each problem is, for the codes that can say it: a JSON pointer into the request or the record (`/items/0/devices/1/imei1`) and the reason. A line of a serialized article that is short of units also says how many it bills and how many are identified. Never a value typed by the user, and never an identifier of a unit.

    Cada elemento
    objectsin otras propiedades
    • pointerobligatorio
      string
    • codeobligatorio
      string
    • required
      integermín. 0máx. 1000

      For a line short of units (UNITS_DIFFER_FROM_QUANTITY, RECEIPT_REQUIRED, DELIVERY_REQUIRED): how many units the line bills.

    • identified
      integermín. 0máx. 1000

      For the same line: how many units are identified and linked to it. Given to every reader of the document; no IMEI or serial number is.