<?php
$page_lang = 'es';
$page_title = 'API REST: integración para clientes enterprise | Corp-Merch.MX';
$page_description = 'API REST para clientes enterprise: cotizaciones, órdenes, estatus, facturas y webhooks, con autenticación bearer token y ejemplos en curl y Node.js.';
$og_image = '/assets/images/og-sdk.png';
$page_section = 'sdk';
$page_slug    = 'api-integration';

$labels = [
    'name' => 'Nombre', 'name_placeholder' => 'Tu nombre',
    'contact' => 'Correo', 'contact_placeholder' => 'tu.correo@empresa.com.mx',
    'company' => 'Empresa', 'company_placeholder' => 'Razón social',
    'message' => 'Brief', 'message_placeholder' => 'Stack de operaciones, volumen estimado, integraciones requeridas…',
    'submit' => 'Solicitar acceso al SDK', 'sending' => 'Enviando...',
    'turnstile_error' => 'Verifica que no eres un robot'
];

require __DIR__ . '/../../../includes/header.php';
?>
<link rel="alternate" hreflang="es" href="https://corp-merch.com.mx/es/pages/sdk/api-integration">
<link rel="alternate" hreflang="en" href="https://corp-merch.com.mx/en/pages/sdk/api-integration">
<link rel="alternate" hreflang="ru" href="https://corp-merch.com.mx/ru/pages/sdk/api-integration">
<nav class="breadcrumbs"><a href="/es/">Inicio</a><span class="sep">&rsaquo;</span><a href="/es/pages/sdk/">SDK</a><span class="sep">&rsaquo;</span><span>API REST</span></nav>

<section class="hero">
  <div class="container">
    <div class="hero-content">
      <p class="eyebrow">REST · JSON · Bearer · OpenAPI 3.0</p>
      <h1>API REST para clientes enterprise</h1>
      <p class="hero-subtitle">La API REST que les permite integrar las cotizaciones, las órdenes, el estatus de producción, las entregas y las facturas con su propio stack de operaciones — ERP, portal de cliente, mesa de servicio. Documentada en OpenAPI 3.0 con ejemplos en curl, Python y Node.js. El acceso se entrega a clientes con programa vigente y contrato de uso firmado.</p>
      <div class="hero-cta"><a href="#contact-form" class="btn btn-primary">Solicitar acceso al SDK</a></div>
    </div>
  </div>
</section>

<section class="section"><div class="container">
  <h2>Conceptos básicos: autenticación, base URL, formato</h2>
  <p>La API se autentica con un bearer token que entregamos al cliente con su programa. El token se rota cada noventa días o cuando el cliente lo solicita. La base URL de producción es <code>https://api.corp-merch.com.mx/v1</code>. La base URL del sandbox es <code>https://sandbox.api.corp-merch.com.mx/v1</code>. El sandbox tiene datos ficticios y reinicia cada lunes a las cero horas GMT-6.</p>
  <p>El formato de intercambio es JSON con UTF-8. Las fechas y horas se manejan en formato ISO 8601 con zona horaria — preferimos <code>YYYY-MM-DDTHH:MM:SS-06:00</code> para horario de CDMX. Los montos están en centavos de MXN — para representar cincuenta pesos con cincuenta centavos enviamos <code>5050</code>. Los códigos de país son ISO 3166-1 alfa-2 — <code>MX</code> para México, <code>US</code> para Estados Unidos, <code>CA</code> para Canadá.</p>
</div></section>

<section class="section section-alt"><div class="container">
  <h2>Endpoints principales</h2>
  <p>La API expone seis bloques de endpoints. El bloque de cotizaciones: <code>POST /quotes</code> para crear una cotización, <code>GET /quotes/{id}</code> para consultar el detalle, <code>POST /quotes/{id}/approve</code> para aprobar, <code>POST /quotes/{id}/reject</code> para rechazar con motivo. El bloque de órdenes: <code>POST /orders</code> para crear una orden a partir de una cotización aprobada, <code>GET /orders/{id}</code> para consultar el detalle, <code>PATCH /orders/{id}</code> para modificar campos permitidos antes de la producción, <code>POST /orders/{id}/cancel</code> para cancelar antes de la producción.</p>
  <p>El bloque de estatus: <code>GET /orders/{id}/status</code> para consultar el estatus completo, <code>GET /orders/{id}/status/history</code> para el historial con timestamps, <code>GET /orders/{id}/documents</code> para los documentos asociados. El bloque de entregas: <code>GET /orders/{id}/shipments</code> para listar envíos, <code>GET /shipments/{id}</code> para el detalle, <code>POST /shipments/{id}/confirm</code> para confirmar la recepción cuando el cliente firma el acuse. El bloque de facturas: <code>GET /orders/{id}/invoices</code> para listar, <code>GET /invoices/{id}</code> para el detalle con el XML del CFDI 4.0 y el PDF. El bloque de catálogo: <code>GET /catalog/products</code> para listar productos, <code>GET /catalog/products/{id}</code> para el detalle con precios y existencias.</p>
</div></section>

<section class="section"><div class="container">
  <h2>Ejemplo: crear una cotización</h2>
  <p>Para crear una cotización se envía una petición <code>POST</code> a <code>/v1/quotes</code> con el bearer token en el encabezado <code>Authorization</code> y un cuerpo JSON con los productos, cantidades, técnica de marcado y plazos. El endpoint devuelve un identificador de cotización y el detalle con precios en centavos de MXN antes de IVA, IVA desglosado, total y plazo de entrega por línea.</p>
  <p>El cuerpo mínimo de una cotización incluye un arreglo de líneas con <code>product_id</code>, <code>quantity</code>, <code>decoration</code> con la técnica — <code>screen</code>, <code>dtf</code>, <code>embroidery</code>, <code>laser</code> — y <code>delivery_address</code> con el domicilio completo. Para líneas con personalización variable — número de colaborador, talla individual — se incluye el arreglo <code>variables</code> por línea. La cotización se entrega en menos de un minuto cuando el catálogo reconoce el producto y la dirección está dentro de la cobertura.</p>
</div></section>

<section class="section section-alt"><div class="container">
  <h2>Ejemplo: consultar el estatus de una orden</h2>
  <p>Para consultar el estatus se envía una petición <code>GET</code> a <code>/v1/orders/{id}/status</code> con el bearer token. El endpoint devuelve el estatus actual — <code>created</code>, <code>approved</code>, <code>in_production</code>, <code>quality_check</code>, <code>packed</code>, <code>shipped</code>, <code>delivered</code>, <code>invoiced</code>, <code>closed</code>, <code>canceled</code> — y el porcentaje de avance por etapa. La respuesta incluye la fecha estimada de entrega con base en el calendario del cliente y del taller.</p>
  <p>Para series con varias etapas — corte, confección, personalización, empaque, envío, entrega — el cliente recibe el desglose por etapa con el porcentaje de avance. Cuando una etapa se atrasa, el estatus devuelve el motivo — falta de materia prima, no conformidad, espera de confirmación del cliente — y la fecha estimada actualizada. La integración se mantiene consistente con los webhooks que disparan eventos por cambio de estatus.</p>
</div></section>

<section class="section"><div class="container">
  <h2>Manejo de errores y reintentos</h2>
  <p>Los errores se devuelven con códigos HTTP estándar — <code>400</code> para solicitud mal formada, <code>401</code> para token ausente o inválido, <code>403</code> para recurso no permitido, <code>404</code> para recurso no encontrado, <code>409</code> para conflicto de estado, <code>422</code> para validación fallida, <code>429</code> para exceso de tasa, <code>500</code> para error interno. El cuerpo del error incluye <code>code</code> con el código legible por máquina, <code>message</code> con la descripción legible por humano y <code>details</code> con el arreglo de campos con error cuando aplica.</p>
  <p>El límite de tasa es de sesenta solicitudes por minuto por token y de mil solicitudes por hora por token. Cuando se excede el límite, el endpoint devuelve <code>429</code> con el encabezado <code>Retry-After</code> indicando los segundos a esperar. Implementamos exponential backoff en el cliente con jitter para evitar el efecto de manada. Para clientes con volumen mayor, negociamos un límite superior al inicio del programa.</p>
</div></section>

<section class="section section-alt"><div class="container">
  <h2>Buenas prácticas de integración</h2>
  <p>Recomendamos tres prácticas. Primero, usar el sandbox para desarrollo y pruebas antes de mover a producción. El sandbox tiene datos ficticios y se reinicia cada lunes. Segundo, suscribirse a los webhooks en lugar de sondear el estatus — los webhooks disparan al cambio de estatus sin que el cliente tenga que hacer polling. Tercero, validar las firmas HMAC SHA-256 de los webhooks antes de procesar el cuerpo para confirmar que el webhook proviene de la API.</p>
  <p>Para clientes con stack serverless, los webhooks firman el cuerpo y se entregan con encabezados de timestamp y de identificador de evento. El cliente debe validar la firma, el timestamp — con tolerancia de cinco minutos — y el identificador para evitar duplicados por reintento. La documentación completa incluye una sección de referencia con los eventos disponibles y el formato del cuerpo.</p>
</div></section>

<section class="section"><div class="container">
  <h2>Soporte y observabilidad</h2>
  <p>Para clientes con integración en producción, asignamos un responsable técnico del taller que responde dudas de integración en menos de cuatro horas hábiles y que participa en sesiones de pair programming cuando se requiere. El responsable técnico también atiende incidentes — respuesta a webhook perdido, desfase entre el portal y la API, dudas sobre una respuesta inesperada.</p>
  <p>La API publica métricas operativas — disponibilidad, latencia p95, tasa de error — en un dashboard de status al que el cliente puede suscribirse. Para clientes con SLA exigente — banca, fintech, gobierno — entregamos un dashboard dedicado con métricas en tiempo real y un canal de comunicación directo para incidentes críticos. La página de status es accesible sin autenticación.</p>
</div></section>

<section id="contact-form" class="section section-alt"><div class="container">
  <h2>Solicite acceso al SDK</h2>
  <p>Si su equipo técnico requiere acceso al SDK para integrar cotizaciones, órdenes, estatus, entregas o facturas con su stack de operaciones, platiquemos. Les entregamos el bearer token, el acceso al sandbox y la documentación completa en formato del cliente.</p>
  <?php require __DIR__ . '/../../../includes/form.php'; ?>
</div></section>

<section class="section role-note"><div class="container">
  <p class="role-note-text">La API REST y el SDK son entregados a clientes con programa vigente y contrato de uso firmado. La documentación puede actualizarse sin previo aviso; las versiones mayores se comunican con treinta días de anticipación. Corp-Merch.MX es un taller mexicano de producción de merch corporativo; operamos de manera independiente.</p>
</div></section>

<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebPage","name":"API REST Corp-Merch.MX","description":"API REST para integración enterprise: cotizaciones, órdenes, estatus, facturas y webhooks. Documentada en OpenAPI 3.0.","publisher":{"@type":"Organization","name":"Corp-Merch.MX"}}
</script>
<?php require __DIR__ . '/../../../includes/footer.php'; ?>