Resumen
La API de Amazon Selling Partner (SP-API) es una API REST que permite el acceso programático a datos de vendedores: pedidos, inventario, listados y cumplimiento. Utiliza OAuth 2.0 con roles IAM, requiere firma AWS SigV4 y tiene límites de tasa variables por endpoint (de 0.1 a 100 solicitudes/seg). Esta guía cubre configuración de cuenta, autenticación, endpoints clave, suscripciones a webhooks y estrategias de despliegue en producción.
💡Apidog simplifica las pruebas de integración de API. Pruebe sus puntos finales de SP-API, valide los flujos de OAuth, inspeccione las firmas de solicitud y depure los problemas de autenticación en un solo espacio de trabajo. Importe especificaciones de API, simule respuestas y comparta escenarios de prueba con su equipo.
¿Qué es la API de Amazon SP?
La API de Amazon Selling Partner (SP-API) es una API REST que da acceso programático a datos de vendedores. Sustituye a Marketplace Web Service (MWS) con mejoras en seguridad, rendimiento y funcionalidad.
Capacidades Clave
La SP-API permite:
- Recuperar y actualizar pedidos
- Gestionar inventario en todos los mercados
- Crear, actualizar y eliminar listados
- Gestionar envíos FBA
- Analizar precios y competencia
- Generar informes
- Gestionar Contenido A+
- Analizar marca y datos publicitarios
Comparación SP-API vs MWS
| Característica | SP-API | MWS (Legado) |
|---|---|---|
| Arquitectura | JSON RESTful | Basado en XML |
| Autenticación | OAuth 2.0 + IAM | Token MWS |
| Seguridad | AWS SigV4 | Tokens simples |
| Límites de tasa | Dinámicos | Cuotas fijas |
| Mercados | Unificados | Específicos región |
| Estado | Actual | Obsoleto (Dic 2025) |
Migre las integraciones de MWS a SP-API lo antes posible.
Resumen de la arquitectura
Amazon usa endpoints regionales:
https://sellingpartnerapi-na.amazon.com (Norteamérica)
https://sellingpartnerapi-eu.amazon.com (Europa)
https://sellingpartnerapi-fe.amazon.com (Lejano Oriente)
Requisitos en toda solicitud:
- Firma AWS SigV4
- Token acceso OAuth
- Permisos IAM
- ID de solicitud
Mercados soportados
| Región | Mercados | Endpoint API |
|---|---|---|
| América del Norte | EE. UU., CA, MX | sellingpartnerapi-na.amazon.com |
| Europa | Reino Unido, DE, FR, IT, ES, NL, SE, PL, TR, EG, IN, AE, SA | sellingpartnerapi-eu.amazon.com |
| Lejano Oriente | JP, AU, SG, BR | sellingpartnerapi-fe.amazon.com |
Primeros pasos: Configuración de cuenta e IAM
Paso 1: Cree su cuenta de desarrollador
- Ingrese al Centro de Desarrolladores de Amazon
- Inicie sesión con su cuenta (requiere acceso a Seller Central)
- Vaya a Selling Partner API en el panel
- Acepte el Acuerdo de Desarrollador
Paso 2: Registre su aplicación
- Inicie sesión en Seller Central
- Navegue a Aplicaciones y Servicios > Desarrollar Aplicaciones
- Haga clic en Añadir Nueva Aplicación
- Complete:
- Nombre de la app
- Tipo de aplicación (“Autodesarrollada” o “Terceros”)
- Caso de uso
- URI de redirección (HTTPS para OAuth)
Recibirá:
- ID de aplicación
- ID de cliente
- Secreto de cliente
No exponga estos datos. Use variables de entorno:
# .env
AMAZON_APPLICATION_ID="amzn1.application.xxxxx"
AMAZON_CLIENT_ID="amzn1.account.xxxxx"
AMAZON_CLIENT_SECRET="your_client_secret_here"
AMAZON_SELLER_ID="your_seller_id_here"
AWS_ACCESS_KEY_ID="your_aws_access_key"
AWS_SECRET_ACCESS_KEY="your_aws_secret_key"
AWS_REGION="us-east-1"
Paso 3: Cree un rol de IAM para la SP-API
- Inicie sesión en la Consola de AWS IAM
- Roles > Crear Rol
- Seleccione Otra cuenta de AWS como entidad de confianza
- Ingrese el ID de cuenta de Amazon según región:
- NA:
906394416454 - EU:
336853085554 - FE:
774466381866
Paso 4: Configure la política de IAM
Adjunte esta política al rol:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"arn:aws:execute-api:*:*:*/prod/*/sellingpartnerapi/*"
]
}
]
}
Nombre sugerido: SellingPartnerApiRole. Guarde el ARN.
Paso 5: Vincule el rol IAM a la aplicación
- Seller Central > Desarrollar aplicaciones
- Seleccione su app
- Editar > ARN del rol de IAM
- Ingrese el ARN y guarde
Amazon validará el rol en minutos.
Flujo de autenticación OAuth 2.0
Entendiendo OAuth en SP-API
Flujo de autorización:
1. El vendedor autoriza app
2. Redirección a URL de autorización de Amazon
3. Login y permisos del vendedor
4. Redirección con código de autorización
5. Intercambio por token LWA (Login with Amazon)
6. Intercambio por token de acceso SP-API
7. Uso del token en llamadas API (firmadas con SigV4)
8. Actualizar token al expirar (1h)
Paso 6: Genere la URL de autorización
const generateAuthUrl = (clientId, redirectUri, state) => {
const baseUrl = 'https://www.amazon.com/sp/apps/oauth/authorize';
const params = new URLSearchParams({
application_id: process.env.AMAZON_APPLICATION_ID,
client_id: clientId,
redirect_uri: redirectUri,
state: state,
scope: 'sellingpartnerapi::notifications'
});
return `${baseUrl}?${params.toString()}`;
};
Ámbitos de OAuth requeridos
| Ámbito | Descripción | Caso de uso |
|---|---|---|
sellingpartnerapi::notifications |
Recibir notificaciones | Webhooks |
sellingpartnerapi::migration |
Migrar desde MWS | Integraciones legado |
Paso 7: Intercambie el código por un token LWA
const exchangeCodeForLwaToken = async (code, redirectUri) => {
const response = await fetch('https://api.amazon.com/auth/o2/token', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
grant_type: 'authorization_code',
client_id: process.env.AMAZON_CLIENT_ID,
client_secret: process.env.AMAZON_CLIENT_SECRET,
redirect_uri: redirectUri,
code: code
})
});
if (!response.ok) throw new Error('LWA Token Error');
return await response.json();
};
Paso 8: Intercambie el token LWA por credenciales temporales
const assumeRole = async (lwaAccessToken) => {
// Paso 1: Obtener token de cliente
const response = await fetch('https://api.amazon.com/auth/o2/token', {
method: 'POST',
headers: { 'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
grant_type: 'client_credentials',
client_id: process.env.AMAZON_CLIENT_ID,
client_secret: process.env.AMAZON_CLIENT_SECRET,
scope: 'sellingpartnerapi::notifications'
})
});
const data = await response.json();
// Paso 2: Intercambio STS
const stsResponse = await fetch('https://sts.amazonaws.com/', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': `Bearer ${data.access_token}`
},
body: new URLSearchParams({
Action: 'AssumeRole',
RoleArn: 'arn:aws:iam::YOUR_ACCOUNT:role/SellingPartnerApiRole',
RoleSessionName: 'sp-api-session',
Version: '2011-06-15'
})
});
return stsResponse;
};
Paso 9: Implemente la actualización de tokens
const refreshLwaToken = async (refreshToken) => {
const response = await fetch('https://api.amazon.com/auth/o2/token', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
grant_type: 'refresh_token',
client_id: process.env.AMAZON_CLIENT_ID,
client_secret: process.env.AMAZON_CLIENT_SECRET,
refresh_token: refreshToken
})
});
return await response.json();
};
Firma de solicitudes AWS SigV4
Comprendiendo SigV4
Toda llamada a la SP-API debe estar firmada con AWS Signature Version 4.
Proceso de firma SigV4
Ejemplo de implementación:
const crypto = require('crypto');
class SigV4Signer {
// ... implementación (ver arriba para detalles) ...
}
Uso del SDK de AWS para SigV4
Recomendado usar el SDK:
const { SignatureV4 } = require('@aws-sdk/signature-v4');
const { Sha256 } = require('@aws-crypto/sha256-js');
// ... ver arriba para detalles ...
API de Pedidos
Recuperación de pedidos
const getOrders = async (accessToken, options = {}) => {
const params = new URLSearchParams({
createdAfter: options.createdAfter,
createdBefore: options.createdBefore,
orderStatuses: options.orderStatuses?.join(',') || '',
marketplaceIds: options.marketplaceIds?.join(',') || ['ATVPDKIKX0DER'],
maxResultsPerPage: options.maxResultsPerPage || 100
});
for (const [key, value] of params.entries()) if (!value) params.delete(key);
const endpoint = `https://sellingpartnerapi-na.amazon.com/orders/v0/orders?${params.toString()}`;
return makeSpApiRequest('GET', endpoint, accessToken);
};
Estructura de respuesta de pedido
{
"payload": {
"orders": [
{
"amazon_order_id": "112-1234567-1234567",
// ... otros campos ...
}
],
"next_token": "eyJleHBpcmF0aW9uVGltZU9mTmV4dFRva2VuIjoxNzEwOTUwNDAwfQ=="
}
}
Obtención de artículos del pedido
const getOrderItems = async (accessToken, orderId) => {
const endpoint = `https://sellingpartnerapi-na.amazon.com/orders/v0/orders/${orderId}/orderItems`;
return makeSpApiRequest('GET', endpoint, accessToken);
};
Actualización del estado del envío
const confirmShipment = async (accessToken, orderId, shipmentData) => {
const endpoint = `https://sellingpartnerapi-na.amazon.com/orders/v0/orders/${orderId}/shipmentConfirmation`;
const payload = {
packageDetails: {
packageReferenceId: shipmentData.packageReferenceId || '1',
carrier_code: shipmentData.carrierCode,
tracking_number: shipmentData.trackingNumber,
ship_date: shipmentData.shipDate || new Date().toISOString(),
items: shipmentData.items.map(item => ({
order_item_id: item.orderItemId,
quantity: item.quantity
}))
}
};
return makeSpApiRequest('POST', endpoint, accessToken, payload);
};
Códigos comunes de transportistas
| Transportista | Código |
|---|---|
| USPS | USPS |
| FedEx | FEDEX |
| UPS | UPS |
| DHL | DHL |
| Canada Post | CANADA_POST |
| Royal Mail | ROYAL_MAIL |
| Australia Post | AUSTRALIA_POST |
| Logística Amazon | AMZN_UK |
API de Inventario
Obtención de resúmenes de inventario
const getInventorySummaries = async (accessToken, options = {}) => {
const params = new URLSearchParams({
granularityType: options.granularityType || 'Marketplace',
granularityId: options.granularityId || 'ATVPDKIKX0DER',
startDateTime: options.startDateTime || '',
sellerSkus: options.sellerSkus?.join(',') || ''
});
const endpoint = `https://sellingpartnerapi-na.amazon.com/fba/inventory/v1/summaries?${params.toString()}`;
return makeSpApiRequest('GET', endpoint, accessToken);
};
Actualización de inventario
No hay endpoint directo. Actualice inventario vía:
- Envíos FBA
- Pedidos MFN
- Actualizaciones de listados
Ejemplo para crear un plan de envío FBA:
const createInboundShipmentPlan = async (accessToken, shipmentData) => {
// ...ver arriba para detalles...
};
API de Listados
Obtención de listados
const getListings = async (accessToken, options = {}) => {
const params = new URLSearchParams({
marketplaceIds: options.marketplaceIds?.join(',') || ['ATVPDKIKX0DER'],
itemTypes: options.itemTypes?.join(',') || ['ASIN', 'SKU'],
identifiers: options.identifiers?.join(',') || '',
issuesLocale: options.locale || 'en_US'
});
const endpoint = `https://sellingpartnerapi-na.amazon.com/listings/2021-08-01/items?${params.toString()}`;
return makeSpApiRequest('GET', endpoint, accessToken);
};
Creación o actualización de listados
const submitListingUpdate = async (accessToken, listingData) => {
// ...ver arriba para detalles...
};
Eliminación de un listado
const deleteListing = async (accessToken, sku, marketplaceIds) => {
// ...ver arriba para detalles...
};
API de Informes
Creación de programaciones de informes
const createReport = async (accessToken, reportType, dateRange) => {
// ...ver arriba para detalles...
};
Obtención del documento de informe
const getReportDocument = async (accessToken, reportId) => {
// ...ver arriba para detalles...
};
API de Notificaciones
Creación de suscripciones
const createSubscription = async (accessToken, subscriptionData) => {
// ...ver arriba para detalles...
};
Configuración del destino de SNS
const createSnsDestination = async (accessToken, destinationData) => {
// ...ver arriba para detalles...
};
Procesamiento de notificaciones
const express = require('express');
const app = express();
// ...ver arriba para detalles...
Límites de tasa y cuotas
Entendiendo los límites de tasa
| Categoría | Límite de tasa | Límite de ráfaga |
|---|---|---|
| Pedidos | 10 solicitudes/segundo | 20 |
| Artículos del Pedido | 5 solicitudes/segundo | 10 |
| Inventario | 2 solicitudes/segundo | 5 |
| Listados | 10 solicitudes/segundo | 20 |
| Informes | 0.5 solicitudes/segundo | 1 |
| Notificaciones | 1 solicitud/segundo | 2 |
| Entrada FBA | 2 solicitudes/segundo | 5 |
Revise el header x-amzn-RateLimit-Limit en cada respuesta.
Implementación del manejo de límites de tasa
const makeRateLimitedRequest = async (method, endpoint, accessToken, body = null, maxRetries = 5) => {
// ...ver arriba para detalles...
};
Implementación de cola de solicitudes
class RateLimitedQueue {
// ...ver arriba para detalles...
}
// Uso
const ordersQueue = new RateLimitedQueue(10, 20);
const orders = await ordersQueue.add(() => getOrders(accessToken, options));
Mejores prácticas de seguridad
Gestión de credenciales
Nunca almacene claves en el código fuente.
// Malo
const AWS_ACCESS_KEY = 'AKIAIOSFODNN7EXAMPLE';
// Bueno
const AWS_ACCESS_KEY = process.env.AWS_ACCESS_KEY_ID;
// Mejor: AWS Secrets Manager
Requisitos de almacenamiento de tokens
- Use cifrado AES-256 para los tokens en reposo
- Use HTTPS/TLS siempre
- Limite acceso a los tokens
- Registre accesos y rotaciones
- Actualice tokens antes de expirar
Ejemplo de clase para cifrado:
class TokenStore {
// ...ver arriba para detalles...
}
Privilegio mínimo de IAM
Otorgue solo permisos necesarios, evite comodines en producción.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SPAPIOrdersAccess",
"Effect": "Allow",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:*:*:*/prod/*/sellingpartnerapi/orders/*"
}
]
}
Seguridad de la firma de solicitudes
- Use HTTPS
- Incluya todos los headers requeridos
- Sincronice reloj del servidor
- Rote credenciales regularmente
- Prefiera roles IAM
const validateTimestamp = (amzDate) => {
// ...ver arriba para detalles...
};
Prueba de integraciones de SP-API con Apidog
Por qué probar las integraciones
Las integraciones SP-API implican flujos de autenticación y límites de tasa complejos. Pruebe para:
- Validar OAuth 2.0
- Depurar SigV4
- Probar manejo de errores y cuotas
- Simular respuestas
- Documentar flujos
Configuración de Apidog para pruebas SP-API
Paso 1: Importar OpenAPI
- Descargue la especificación desde el repositorio de Amazon
- Cree un nuevo proyecto en Apidog (apidog.com)
- Importe el archivo OpenAPI
- Configure las variables de entorno
Paso 2: Configure las variables de entorno
URL base (Sandbox): https://sandbox.sellingpartnerapi-na.amazon.com
URL base (Producción): https://sellingpartnerapi-na.amazon.com
Token de acceso LWA: {{lwa_access_token}}
Clave de acceso de AWS: {{aws_access_key}}
Clave secreta de AWS: {{aws_secret_key}}
Región: us-east-1
Paso 3: Scripts de pre-solicitud para SigV4
// Script de pre-solicitud Apidog (ver arriba para detalles)
Paso 4: Escenarios de prueba
// Prueba: Obtener pedidos últimas 24h (ver arriba para detalles)
Simulación de respuestas SP-API
Utilice la simulación inteligente de Apidog:
{
"payload": {
"orders": [
{
"amazon_order_id": "112-{{randomNumber}}-{{randomNumber}}",
"order_status": "Unshipped",
"purchase_date": "{{now}}",
"order_total": {
"currency_code": "USD",
"amount": "{{randomFloat 10 500}}"
}
}
],
"next_token": null
}
}
Depuración de problemas comunes
Problema: Firma SigV4 incorrecta
- Verifique headers requeridos
- Orden alfabético de headers
- Solicitud canónica correcta
- Marca de tiempo válida
Problema: Errores token OAuth
const tokenCheck = await apidog.send({
method: 'GET',
url: '/orders/v0/orders',
params: { createdAfter: new Date().toISOString() }
});
if (tokenCheck.status === 401) {
// Flujo de actualización de token
}
Automatización de pruebas en CI/CD
# GitHub Actions (ver arriba)
Referencia de ID de Mercado
| País | ID de Mercado |
|---|---|
| Estados Unidos | ATVPDKIKX0DER |
| Canadá | A2EUQ1WTGCTBG2 |
| México | A1AM78C64UM0Y8 |
Top comments (0)