Apariencia
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 Type | Para qué sirve |
|---|---|
POST_PRODUCT_PRICING_DATA | Actualizar precios de listings |
POST_INVENTORY_AVAILABILITY_DATA | Actualizar cantidades de inventario |
POST_PRODUCT_DATA | Crear o actualizar listings |
POST_ORDER_FULFILLMENT_DATA | Confirmar envíos de pedidos (FBM) |
POST_ORDER_ACKNOWLEDGEMENT_DATA | Confirmar recepción de pedidos |
POST_FLAT_FILE_LISTINGS_DATA | Listings 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
feedDocumentIdcon elfeedId: Son cosas distintas. ElfeedDocumentIdes el identificador del XML que subiste; elfeedIdes 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_idque 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?