Skip to content

Feeds API

Resumen rápido

La Feeds API permite subir datos masivos a Amazon: actualizar precios de cientos de productos a la vez, cambiar cantidades de inventario, modificar listings, gestionar pedidos, etc. Es el equivalente al "subir un archivo" en Seller Central, pero de forma automática. Los datos se envían en formato XML. Es más compleja que otras APIs pero es la única opción eficiente para actualizaciones masivas.


Conceptos importantes

  • Feed: El archivo de datos que subes a Amazon (generalmente XML).
  • Feed Type: El tipo de operación que realizas. Define el formato del XML y qué datos actualiza.
  • SubmitFeed (CreateFeed): La operación para enviar un feed a Amazon.
  • GetFeed: Consulta el estado de un feed enviado.
  • GetFeedDocument: Obtiene el resultado del procesamiento del feed (si hubo errores).
  • Processing Report: El informe de errores que Amazon genera tras procesar el feed.
  • Feed Document: El documento XML que subes o que Amazon devuelve como resultado.
  • XML Envelope: La estructura básica que debe tener todo feed de Amazon.

Tipos de feed más comunes

Feed TypePara qué sirve
POST_PRODUCT_PRICING_DATAActualizar precios de listings
POST_INVENTORY_AVAILABILITY_DATAActualizar cantidades de inventario
POST_PRODUCT_DATACrear o actualizar listings
POST_ORDER_FULFILLMENT_DATAConfirmar envíos de pedidos (FBM)
POST_ORDER_ACKNOWLEDGEMENT_DATAConfirmar recepción de pedidos
POST_FLAT_FILE_LISTINGS_DATAListings en formato de hoja de cálculo

Cómo funciona

Flujo del Feed API

1. CreateFeedDocument  →  Obtienes una URL de subida + feedDocumentId

2. Subir el XML a esa URL  →  HTTP PUT a la URL firmada

3. CreateFeed  →  Envías el feedDocumentId + feed type → obtienes feedId

4. (Esperar / Notifications API)  →  Amazon procesa el feed

5. GetFeed  →  Cuando status = DONE, obtienes resultFeedDocumentId

6. GetFeedDocument  →  URL del processing report

7. Descargar el report  →  Errores por registro (si los hay)

Estructura del XML para actualizar precios

xml
<?xml version="1.0" encoding="UTF-8"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
  <Header>
    <DocumentVersion>1.01</DocumentVersion>
    <MerchantIdentifier>TU_SELLER_ID</MerchantIdentifier>
  </Header>
  <MessageType>Price</MessageType>
  <Message>
    <MessageID>1</MessageID>
    <OperationType>Update</OperationType>
    <Price>
      <SKU>MI-PRODUCTO-001</SKU>
      <StandardPrice currency="EUR">29.99</StandardPrice>
    </Price>
  </Message>
  <Message>
    <MessageID>2</MessageID>
    <OperationType>Update</OperationType>
    <Price>
      <SKU>MI-PRODUCTO-002</SKU>
      <StandardPrice currency="EUR">15.50</StandardPrice>
    </Price>
  </Message>
</AmazonEnvelope>

Pasos prácticos

Actualizar precio de un producto (Python)

python
import requests
import io

def create_price_feed_xml(seller_id: str, items: list[dict]) -> bytes:
    """
    items: lista de dicts con {"sku": str, "price": float, "currency": str}
    """
    messages = ""
    for i, item in enumerate(items, start=1):
        messages += f"""
  <Message>
    <MessageID>{i}</MessageID>
    <OperationType>Update</OperationType>
    <Price>
      <SKU>{item['sku']}</SKU>
      <StandardPrice currency="{item['currency']}">{item['price']:.2f}</StandardPrice>
    </Price>
  </Message>"""

    xml = f"""<?xml version="1.0" encoding="UTF-8"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
  <Header>
    <DocumentVersion>1.01</DocumentVersion>
    <MerchantIdentifier>{seller_id}</MerchantIdentifier>
  </Header>
  <MessageType>Price</MessageType>
{messages}
</AmazonEnvelope>"""
    return xml.encode("utf-8")


def submit_feed(
    access_token: str,
    endpoint: str,
    marketplace_id: str,
    feed_type: str,
    feed_content: bytes
) -> str:
    """Envía un feed y devuelve el feedId."""
    headers = {
        "x-amz-access-token": access_token,
        "Content-Type": "application/json",
    }

    # Paso 1: Crear el documento de feed
    doc_response = requests.post(
        f"{endpoint}/feeds/2021-06-30/documents",
        headers=headers,
        json={"contentType": "text/xml; charset=UTF-8"},
    )
    doc_response.raise_for_status()
    doc_data = doc_response.json()
    feed_document_id = doc_data["feedDocumentId"]
    upload_url = doc_data["url"]

    # Paso 2: Subir el XML a la URL firmada
    upload_response = requests.put(
        upload_url,
        data=io.BytesIO(feed_content),
        headers={"Content-Type": "text/xml; charset=UTF-8"},
    )
    upload_response.raise_for_status()

    # Paso 3: Crear el feed
    feed_response = requests.post(
        f"{endpoint}/feeds/2021-06-30/feeds",
        headers=headers,
        json={
            "feedType": feed_type,
            "marketplaceIds": [marketplace_id],
            "inputFeedDocumentId": feed_document_id,
        },
    )
    feed_response.raise_for_status()
    return feed_response.json()["feedId"]


def wait_for_feed(access_token: str, endpoint: str, feed_id: str) -> str:
    """Espera a que el feed se procese y devuelve el resultFeedDocumentId."""
    import time
    headers = {"x-amz-access-token": access_token}

    while True:
        response = requests.get(
            f"{endpoint}/feeds/2021-06-30/feeds/{feed_id}",
            headers=headers,
        )
        response.raise_for_status()
        data = response.json()

        if data["processingStatus"] == "DONE":
            return data.get("resultFeedDocumentId")
        elif data["processingStatus"] in ("CANCELLED", "FATAL"):
            raise Exception(f"Feed falló: {data['processingStatus']}")

        time.sleep(30)


# Ejemplo de uso completo
seller_id = "TU_SELLER_ID"
items_to_reprice = [
    {"sku": "PROD-001", "price": 29.99, "currency": "EUR"},
    {"sku": "PROD-002", "price": 15.50, "currency": "EUR"},
]

feed_xml = create_price_feed_xml(seller_id, items_to_reprice)
feed_id = submit_feed(
    access_token=token,
    endpoint="https://sellingpartnerapi-eu.amazon.com",
    marketplace_id="A1RKKUPIHCS9HS",
    feed_type="POST_PRODUCT_PRICING_DATA",
    feed_content=feed_xml,
)
print(f"Feed enviado: {feed_id}")

result_doc_id = wait_for_feed(token, "https://sellingpartnerapi-eu.amazon.com", feed_id)
print(f"Feed procesado. Documento resultado: {result_doc_id}")

Errores comunes

  • No esperar suficiente al procesamiento: Los feeds pueden tardar desde segundos hasta horas. Los feeds grandes de miles de productos pueden tardar varias horas.
  • XML malformado: Amazon rechazará el feed si el XML no tiene la estructura exacta. Valida siempre con un esquema XSD antes de enviar.
  • No revisar el Processing Report: Amazon puede procesar el feed con éxito pero con errores en algunos registros. El processing report indica qué falló y por qué.
  • Usar Feeds API cuando Listings API es suficiente: Para actualizar un solo producto, Listings API o el endpoint de precios es más simple. Feeds API brilla para actualizaciones masivas (decenas o cientos de productos).
  • Confundir el feedDocumentId con el feedId: Son cosas distintas. El feedDocumentId es el identificador del XML que subiste; el feedId es el identificador del trabajo de procesamiento.

Qué debo saber antes de programarlo

  • La actualización de precios mediante feed puede tardar hasta 15-20 minutos en reflejarse en Amazon.
  • Para repricing de un solo producto, usa el endpoint de Listings API (PATCH /listings/2021-08-01/items). Es más rápido y directo.
  • Para repricing masivo (100+ productos), Feeds API es la opción correcta.
  • El seller_id que necesitas en el XML XML es el ID de la cuenta de vendedor, no el ID de tu app. Puedes obtenerlo desde la URL del perfil del vendedor en Amazon o desde la API.
  • Los feeds de inventario también pueden gestionar las cantidades de stock para FBM.

Pendiente de revisar

  • ¿Hay un límite máximo de mensajes (productos) en un único feed?
  • ¿Qué estructura tiene el XML para actualizar inventario y confirmación de envíos FBM?
  • ¿Feeds API está completamente documentada para todos los tipos de feed, o hay tipos sin documentación oficial?

Documentación basada en más de 40 tutoriales sobre Amazon SP-API. Actualizada a junio de 2026.