Artículos

Actualizar los accesorios de un artículo

Aplica operaciones sobre la lista de accesorios.

PUT
/api/v1/items/{itemId}/accessories

Ejemplos de petición

curl https://app.filmo.io/api/v1/items/item_8f2a1c/accessories \
  --request PUT \
  --header "Authorization: Bearer $FILMO_API_KEY" \
  --header "Idempotency-Key: $(uuidgen 2>/dev/null || cat /proc/sys/kernel/random/uuid)" \
  --header 'Content-Type: application/json' \
  --data '{
  "mode": "merge",
  "operations": [
    {
      "action": "create",
      "accessory": {
        "itemId": "itm_00311",
        "quantity": 2,
        "free": true,
        "default": true
      }
    },
    {
      "action": "delete",
      "accessoryId": "acc_00088",
      "accessory": {
        "itemId": "itm_00204",
        "quantity": 1,
        "free": false,
        "default": false
      }
    }
  ]
}'
{
  "data": {
    "id": "item_9f3a2b",
    "name": "Example item",
    "sku": "CAM-FX6-01",
    "description": "Example text.",
    "orderInfo": "Example order info",
    "ean": "0000000000000",
    "itemType": "fixed",
    "stockCalculationMethod": "bulk",
    "collectionId": "collection_9f3a2b",
    "collectionName": "Example collection name",
    "images": [
      "Example images"
    ],
    "salePrice": "120.00",
    "depositValue": "120.00",
    "minStock": 1,
    "serializedItemsCount": 1,
    "pricingSettings": {
      "type": "periodPrice",
      "price": "120.00",
      "period": "hour"
    },
    "insuranceEnabled": true,
    "discountEnabled": true,
    "bufferBefore": 1,
    "bufferBeforeUnit": "hour",
    "bufferAfter": 1,
    "bufferAfterUnit": "hour",
    "physicalProperties": {
      "weight": 1,
      "width": 1,
      "height": 1,
      "length": 1,
      "volume": 1,
      "current": 1,
      "power": 1
    },
    "variants": [
      {
        "variantId": "variant_9f3a2b",
        "variantName": "Example variant name",
        "variantPrice": "120.00",
        "salePrice": "120.00",
        "ean": "0000000000000"
      }
    ],
    "tags": [
      {
        "id": "tag_9f3a2b",
        "name": "Example tag"
      }
    ],
    "customFields": {
      "example": "example"
    },
    "createdAt": "2026-09-01T08:00:00.000Z",
    "updatedAt": "2026-09-01T08:00:00.000Z",
    "replacementValue": "120.00",
    "accessoryIds": [
      "accessory_9f3a2b"
    ],
    "alternativeIds": [
      "alternative_9f3a2b"
    ]
  }
}

Generado a partir del esquema

LEE mode ANTES DE LLAMAR: con merge —el valor por defecto— las operaciones son deltas y lo que no nombras se conserva; con replace la lista enviada es la final y TODO lo que falte SE ELIMINA. Un accesorio puede ser otro artículo del catálogo o uno personalizado con su nombre y su precio. Devuelve el artículo completo, con accessoryIds tal como quedan ahora, con la misma proyección que su GET.

Autorizaciones

Clave de API como Bearer, con el permiso de abajo. items:write

Cabeceras

Idempotency-Keystring

Identificador único de la petición, elegido por el cliente (sirve un UUID). Entre 1 y 255 caracteres: una cabecera vacía se rechaza con 400 validation_error, porque el cliente se creería protegido. Repetir la misma clave con el MISMO cuerpo en 24 h devuelve la respuesta guardada sin volver a ejecutar, con la cabecera Idempotent-Replay: true. Con un cuerpo DISTINTO devuelve 422. Es la forma segura de reintentar tras un tiempo de espera de red.

Límites: longitud mín. 1, longitud máx. 255

Ejemplo:"9f1c2f4e-3a5b-4f6d-8e7a-0b1c2d3e4f5a"

If-Matchstring

Bloqueo optimista: el ETag que leíste del recurso (o *). Si el recurso ha cambiado desde entonces, la escritura se rechaza con 412 precondition_failed antes de hacer nada; léelo de nuevo y reintenta. Sin la cabecera, la escritura siempre se realiza.

Ejemplo:"\"3sT3d9pBvZq4h2N0w8x1YkLmQ7c\""

Parámetros de ruta

itemIdstringObligatorio

Identificador del artículo.

Límites: longitud mín. 1

Cuerpo

application/json

Esquema del cuerpo: ItemAccessoriesBody

modestring

merge (por defecto): las operaciones son deltas y lo que no nombres se conserva. replace: la lista enviada es la lista final y todo lo que falte SE ELIMINA.

Opciones disponibles: merge, replace

targetItemVariantIdstring

Variante del artículo a la que se aplican los accesorios.

operationsobject[]Obligatorio

Operaciones que aplicar. Al menos una.

Límites: mín. 1 elementos

Mostrar atributos hijos
operations.accessoryIdstring

Accesorio existente. Obligatorio para actualizar o eliminar.

operations.actionstring

Qué hacer. Si se omite: con accessoryId actualiza, sin él crea.

Opciones disponibles: create, update, delete

operations.accessoryobjectObligatorio

Datos del accesorio.

Mostrar atributos hijos
operations.accessory.itemIdstring

Artículo que actúa como accesorio. Omítelo para uno personalizado.

operations.accessory.quantityintegerObligatorio

Cantidad del accesorio.

Límites: mín. 1

operations.accessory.freebooleanObligatorio

true si el accesorio no se cobra.

operations.accessory.defaultbooleanObligatorio

true si se añade automáticamente cuando el artículo se incluye en un pedido.

operations.accessory.accessoryVariantIdstring

Variante del accesorio.

operations.accessory.isCustomboolean

true para un accesorio que no está en el catálogo.

operations.accessory.customNamestring

Nombre del accesorio personalizado.

Límites: longitud mín. 1

operations.accessory.customPricenumber

Precio unitario del accesorio personalizado.

Límites: mín. 0

operations.accessory.positioninteger

Orden de visualización.

Límites: mín. 0

Respuesta

application/json

Respuesta correcta.

Esquema de la respuesta: ItemDetailDto

Sobre: ItemDetailResponse. meta.warnings solo aparece cuando la operación está obsoleta.

Cabeceras: X-Request-Id · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · ETag · Idempotent-Replay

dataobject

El artículo completo, tal como lo devuelve la API.

Mostrar atributos hijos
data.idstring

Identificador único del artículo.

data.namestring

Nombre del artículo.

data.skustring | null

Referencia SKU del artículo; null si no consta.

data.descriptionstring | null

Descripción del artículo; null si no consta.

data.orderInfostring | null

Información adicional del pedido (notas de preparación y entrega); null si no consta.

data.eanstring | null

EAN/código de barras; null si no consta.

data.itemTypestring

Tipo de artículo: fixed (artículo simple) o variant (artículo con variantes).

Opciones disponibles: fixed, variant

data.stockCalculationMethodstring

Método de cálculo del stock: bulk (a granel, por cantidad) o serialized (por artículos serializados).

Opciones disponibles: bulk, serialized

data.collectionIdstring | null

Identificador de la colección a la que pertenece; null si no está en ninguna.

data.collectionNamestring | null

Nombre de la colección a la que pertenece; null si no está en ninguna.

data.imagesstring[]

URLs de las imágenes del artículo.

data.salePricestring | null

Precio de venta como cadena decimal "1234.50" (ROUND_HALF_UP); null si no tiene.

Límites: patrón ^-?\d+\.\d{2}$

data.depositValuestring | null

Importe de la fianza como cadena decimal "1234.50" (ROUND_HALF_UP); null si no tiene.

Límites: patrón ^-?\d+\.\d{2}$

data.minStocknumber | null

Stock mínimo configurado para las alertas; null si no está configurado.

data.serializedItemsCountnumber

Número de unidades serializadas registradas del artículo.

data.pricingSettingsobject | null

Configuración de precios de alquiler; null si no está configurada.

Mostrar atributos hijos
data.pricingSettings.typestring | null

Modo de precio: periodPrice (precio por periodo), fixedPrice (precio fijo) o pricingStructure (estructura de precios); null si el artículo no tiene ninguno configurado.

Opciones disponibles: periodPrice, fixedPrice, pricingStructure

data.pricingSettings.pricestring | null

Precio base de alquiler como cadena decimal "1234.50" (ROUND_HALF_UP); null si no aplica.

Límites: patrón ^-?\d+\.\d{2}$

data.pricingSettings.periodstring | null

Unidad de periodo del precio: hour, day, week o month; null si el artículo no tiene ninguna configurada.

Opciones disponibles: hour, day, week, month

data.insuranceEnabledboolean

Si el artículo admite seguro.

data.discountEnabledboolean

Si el artículo admite descuentos.

data.bufferBeforenumber | null

Tiempo de margen reservado antes del alquiler; null si no aplica.

data.bufferBeforeUnitstring | null

Unidad del margen previo: hora o día; null si no aplica.

Opciones disponibles: hour, day

data.bufferAfternumber | null

Tiempo de margen reservado después del alquiler; null si no aplica.

data.bufferAfterUnitstring | null

Unidad del margen posterior: hour o day; null si no aplica.

Opciones disponibles: hour, day

data.physicalPropertiesobject | null

Propiedades físicas (peso y dimensiones); null si no se han registrado.

Mostrar atributos hijos
data.physicalProperties.weightnumber | null

Peso del artículo en kilogramos; null si no está registrado.

data.physicalProperties.widthnumber | null

Ancho del artículo en centímetros; null si no está registrado.

data.physicalProperties.heightnumber | null

Altura del artículo en centímetros; null si no consta.

data.physicalProperties.lengthnumber | null

Longitud del artículo en centímetros; null si no consta.

data.physicalProperties.volumenumber | null

Volumen del artículo en metros cúbicos (m³); null si no está registrado.

data.physicalProperties.currentnumber | null

Consumo de corriente en amperios; null si no consta.

data.physicalProperties.powernumber | null

Potencia en vatios; null si no se ha registrado.

data.variantsobject[]

Variantes del artículo (vacío si el artículo es de tipo fixed).

Mostrar atributos hijos
data.variants.variantIdstring

Identificador único de la variante.

data.variants.variantNamestring

Nombre de la variante.

data.variants.variantPricestring

Precio de alquiler de la variante como cadena decimal "1234.50" (ROUND_HALF_UP).

Límites: patrón ^-?\d+\.\d{2}$

data.variants.salePricestring | null

Precio de venta de la variante como cadena decimal "1234.50" (ROUND_HALF_UP); null si no tiene.

Límites: patrón ^-?\d+\.\d{2}$

data.variants.eanstring | null

EAN/código de barras de la variante; null si no consta.

data.tagsobject[]

Etiquetas asociadas al artículo.

Mostrar atributos hijos
data.tags.idstring

Identificador único de la etiqueta.

data.tags.namestring

Nombre de la etiqueta.

data.customFieldsobject<string, any>

Valores de los campos personalizados por identificador de campo personalizado; las definiciones están en /api/v1/custom-fields.

data.createdAtstring<date-time>

Fecha de creación en ISO 8601 con desplazamiento.

data.updatedAtstring<date-time>

Fecha de la última actualización en ISO 8601 con desplazamiento.

data.replacementValuestring | null

Valor de reposición del artículo como cadena decimal "1234.50" (ROUND_HALF_UP); null si no consta.

Límites: patrón ^-?\d+\.\d{2}$

data.accessoryIdsstring[]

Identificadores de los artículos configurados como accesorios de este.

data.alternativeIdsstring[]

Identificadores de los artículos configurados como alternativas de este.

metaobject

Información adicional sobre la respuesta.

Mostrar atributos hijos
meta.warningsobject[]

Avisos del ciclo de vida; solo aparecen cuando la operación está obsoleta.

Mostrar atributos hijos
meta.warnings.codestring

Código de aviso estable.

Opciones disponibles: deprecated

meta.warnings.messagestring

Para personas: qué está obsoleto, hasta cuándo y qué usar.

meta.warnings.sunsetstring

Día (YYYY-MM-DD) en que la operación deja de estar disponible.

meta.warnings.replacementstring | null

operationId de la operación que hay que usar en su lugar, o null si no hay ninguna.

Errores

EstadoCódigosSignificado
400validation_errorConsulta o cuerpo mal formados. errors[] enumera cada campo erróneo con su código estable.
404not_foundNo existe o queda fuera del alcance de la clave de API.
409conflictEl estado actual del recurso impide la operación, ya hay en curso una petición con esa Idempotency-Key, u otra escritura condicional (If-Match) retuvo el recurso durante más de cinco segundos. errors[0].code indica cuál: in_progress y lock_timeout se resuelven reintentando; invalid_state no, porque el estado del recurso prohíbe la operación.
412precondition_failedLa etiqueta de entidad If-Match no coincide con la representación actual. Vuelve a leer el recurso y reintenta.
422idempotency_key_reusedLa misma clave se usó antes con un cuerpo distinto. Cambia la clave.

401, 403, 429, 500 los puede devolver cualquier operación. Errores

Obsolescencia

Esta operación no está obsoleta. Las obsolescencias se anuncian con la cabecera Deprecation y una fecha de retirada. Política de versiones

  • Catálogo e inventario

    Artículo

    El artículo, tal como lo devuelve la API.