Autenticación y llaves de API

Cada solicitud lleva una llave de API en el header Authorization. Una llave pertenece a una cuenta de SpaceKru, tiene acceso de lectura, de lectura y escritura o de conversaciones con IA, y solo funciona mientras la cuenta esté en un plan de pago.

La API de SpaceKru (v1.1) es una API REST/JSON disponible en todos los planes de pago de SpaceKru. Sincroniza leads en ambos sentidos (upsert por external_id), añade leads a campañas, crea y mueve deals y pide seguimientos a los Empleados de IA, gestiona productos, cotizaciones, órdenes, pagos y reservas, permite que tu plataforma converse con tu Empleado de IA de Customer Service y envía webhooks firmados para 16 eventos que dicen quién causó cada cambio. URL base: https://app.spacekru.com/api/public/v1. Autenticación: llave de API Bearer (sk_live_…). Documentación: https://www.spacekru.com/es/developers. OpenAPI 3.1: https://app.spacekru.com/api/public/v1/openapi.json.

Read in English

Llaves de API

Envía la llave como token Bearer en cada solicitud:

Authorization: Bearer sk_live_…
  • Formato: sk_live_ seguido de 43 caracteres. Cualquier otra cosa responde 401 sin llegar siquiera a nuestra base de datos.
  • Cada llave es real: no hay modo de prueba. Etiqueta los leads de prueba (por ejemplo docs-test) para encontrarlos y quitarlos.
  • La llave se muestra una sola vez, al crearla. Solo guardamos un hash con clave, así que nadie, ni siquiera SpaceKru, puede volver a mostrártela.
  • Hasta 5 llaves activas por cuenta. Nombra cada llave por la herramienta que la usa ("Zapier", "Formulario web", "Sincronización ERP") para revocar una sin tocar las demás.

Quién puede crear llaves

Solo el dueño de la cuenta, en Integraciones → API y Webhooks (nombres de hasta 100 caracteres). El mismo panel muestra el último uso de cada llave, las solicitudes de los últimos 30 días y cada suscripción de webhook.

Permisos (scopes)

  • Solo lectura (read): cada GET excepto webhooks y conversaciones.
  • Lectura y escritura (read + write): todo lo que crea o cambia datos, y cada operación de /subscriptions.
  • Conversaciones con IA (conversations, opcional, solo con lectura y escritura): las operaciones de /conversations. Gastan tokens de IA, por eso el dueño lo concede de forma explícita al crear la llave.

Una llave sin el permiso que necesita una operación responde 403 INSUFFICIENT_SCOPE.

OperaciónQué haceScopeMódulo del plan
GET /pingPrueba la conexiónread—
GET /leadsLista leads (del más reciente)readcrm
POST /leadsCrea un leadwritecrm
GET /leads/{id}Obtén un leadreadcrm
PATCH /leads/{id}Actualiza un leadwritecrm
POST /leads/{id}/notesAñade una nota a un leadwritecrm
GET /dealsLista dealsreadcrm
POST /dealsCrea un dealwritecrm
GET /deals/{id}Obtén un dealreadcrm
PATCH /deals/{id}Actualiza o mueve un dealwritecrm
GET /quotesLista cotizacionesreadsales_os
POST /quotesCrea una cotizaciónwritesales_os
GET /quotes/{id}Obtén una cotizaciónreadsales_os
PATCH /quotes/{id}Actualiza una cotizaciónwritesales_os
GET /ordersLista órdenesreadsales_os
POST /ordersCrea una ordenwritesales_os
GET /orders/{id}Obtén una ordenreadsales_os
PATCH /orders/{id}Actualiza una ordenwritesales_os
GET /subscriptionsLista las suscripciones de webhookwrite—
POST /subscriptionsSuscribe una URL a un evento (REST Hook)write—
DELETE /subscriptions/{id}Desuscribewrite—
PUT /leads/external/{external_id}Crea o actualiza un lead por tu id (upsert)writecrm
GET /agentsLista los Empleados de IAreadcrm
GET /pipeline-stagesLista las etapas del pipelinereadcrm
GET /campaignsLista campañasreadcrm
GET /campaigns/{id}Obtén una campañareadcrm
POST /campaigns/{id}/leadsAñade leads a una campañawritecrm
POST /deals/{id}/follow-upsPide al Empleado de IA un seguimientowritecrm
DELETE /deals/{id}/follow-upsCancela los seguimientos pendienteswritecrm
GET /productsLista productosreadsales_os
POST /productsCrea un productowritesales_os
GET /products/{id}Obtén un productoreadsales_os
PATCH /products/{id}Actualiza un productowritesales_os
PATCH /products/{id}/variants/{variant_id}Actualiza una variante (precio, stock)writesales_os
GET /bookingsLista reservasreadscheduler
POST /bookingsCrea una reservawritescheduler
GET /bookings/{id}Obtén una reservareadscheduler
PATCH /bookings/{id}Reprograma o actualiza una reservawritescheduler
GET /booking-resourcesLista los recursos de reservareadscheduler
GET /availabilityHorarios libres de un díareadscheduler
GET /conversations/availability¿Hay un Empleado de IA listo para conversar?conversations—
POST /conversationsAbre una conversaciónconversations—
GET /conversations/{id}Obtén una conversaciónconversations—
POST /conversations/{id}/messagesEnvía el mensaje del clienteconversations—
GET /conversations/{id}/messagesLista los mensajes de una conversaciónconversations—
POST /conversations/{id}/closeCierra una conversaciónconversations—
POST /quotes/{id}/convertConvierte una cotización en ordenwritesales_os
POST /orders/{id}/paymentsRegistra un pagowritesales_os

Módulos del plan (403)

Algunas operaciones necesitan un módulo de tu plan, el mismo que necesita la app: crm (leads, deals, campañas), sales_os (productos, cotizaciones, órdenes) y scheduler (reservas). Sin él la respuesta es 403 MODULE_NOT_AVAILABLE. Hoy todos los planes de pago incluyen los tres módulos.

Idioma de las respuestas

error.message llega en inglés o en español. Envía Accept-Language: es (o en) para elegir; sin él, se usa el idioma del perfil de la persona que creó la llave. El header Content-Language te dice cuál recibiste. Los code de error, los nombres de campos, los nombres de eventos y details[].issue nunca cambian: decide con ellos, no con el mensaje.

Requisitos del plan (402)

La API solo funciona mientras la cuenta esté en un plan de pago activo (cuenta la prueba gratuita de 7 días). Si no, cada solicitud responde 402 PLAN_UPGRADE_REQUIRED con uno de estos mensajes:

SituaciónMensaje que recibes
Sin plan de pagoLa API de SpaceKru solo está disponible en planes de pago. Mejora tu plan para conectar Zapier, Make o tu propio sistema.
Suscripción cancelada, impaga o vencidaTu suscripción de SpaceKru no está activa. Actualiza tu método de pago para recuperar el acceso a la API.
El plan no incluye la APITu plan actual de SpaceKru no incluye acceso a la API.
Cuenta cerradaEsta cuenta de SpaceKru está cerrada.
  • No hay periodo de gracia: un pago que falla pausa la API de inmediato (en aproximadamente un minuto).
  • Las llaves no se borran. Cuando la cuenta vuelve a un plan de pago, las mismas llaves y webhooks funcionan de nuevo.
  • Si no podemos verificar el plan por un momento, recibes 503 ELIGIBILITY_UNAVAILABLE con Retry-After: 10. Falla cerrado: reintenta, nunca es un pase libre.

401 vs 402 vs 403

EstadoCódigoSignificado
401INVALID_API_KEYSin llave, una llave mal formada, desconocida o revocada. La respuesta lleva WWW-Authenticate: Bearer.
402PLAN_UPGRADE_REQUIREDLa llave es válida, pero la cuenta no está en un plan de pago activo.
403INSUFFICIENT_SCOPE / MODULE_NOT_AVAILABLEA la llave le falta el permiso (por ejemplo, una llave de solo lectura llamando POST /leads), o al plan le falta el módulo.

Revocar y rotar llaves

  • Revoca una llave en Integraciones → API y Webhooks. Deja de funcionar en la siguiente solicitud: no hay caché.
  • Revocar una llave también desactiva las suscripciones de webhook que creó (disabled_reason: "key_revoked"). Las de otras llaves no se tocan.

Para rotar una llave sin interrupciones:

  1. Crea una llave nueva con el mismo acceso.
  2. Ponla en tu integración (variable de entorno, conexión de Zapier/Make/n8n).
  3. Revisa en el panel que la llave nueva tenga un "Último uso" reciente.
  4. Revoca la llave vieja. Si creó webhooks, suscríbelos de nuevo con la llave nueva (y si usaban exclude_own_changes, ahora omiten los cambios de la llave nueva).

Seguridad y buenas prácticas

  • Solo de servidor a servidor. La API no envía headers CORS, así que los navegadores bloquean llamadas desde páginas web, a propósito. Una llave en código de front-end, una app móvil o un repositorio público puede ser robada; mantenla en un servidor o en tu herramienta de automatización.
  • Guarda las llaves como secretos: variables de entorno, un gestor de secretos o el almacén de credenciales de Zapier, Make o n8n.
  • Mínimo privilegio: una llave de Solo lectura para reportes; Conversaciones con IA solo para la llave de tu integración de chat.
  • Una llave por integración, para que revocar una nunca rompa las demás.
  • Verifica la firma de cada webhook y rechaza marcas de tiempo viejas: mira Verificar firmas.
  • Aislamiento por cuenta: una llave solo puede ver su propia cuenta. Un id de otra cuenta responde 404 igual que uno que no existe, también dentro de un body (lead_id, product_id…).
  • Los destinos de los webhooks están restringidos a hosts públicos https:// en el puerto 443, verificados en cada entrega; nunca se siguen redirecciones.

Ejemplo: comprueba una llave

curl
curl "https://app.spacekru.com/api/public/v1/ping" \
  -H "Authorization: Bearer $SPACEKRU_API_KEY"
Node.js
const res = await fetch('https://app.spacekru.com/api/public/v1/ping', {
  headers: {
    Authorization: `Bearer ${process.env.SPACEKRU_API_KEY}`,
  },
});
const body = await res.json();
if (!res.ok) {
  // Branch on body.error.code; quote body.error.request_id to support.
  throw new Error(`${body.error.code}: ${body.error.message} (request ${body.error.request_id})`);
}
console.log(body);
Python
import os

import requests

r = requests.get(
    "https://app.spacekru.com/api/public/v1/ping",
    headers={
        "Authorization": f"Bearer {os.environ['SPACEKRU_API_KEY']}",
    },
    timeout=30,
)
body = r.json()
if not r.ok:
    # Branch on body["error"]["code"]; quote body["error"]["request_id"] to support.
    raise RuntimeError(f"{body['error']['code']}: {body['error']['message']} (request {body['error']['request_id']})")
print(body)