/api/v1/accountsListar cuentas
NORTHSTAR / API v1.0.0
Conecta cuentas, trabajo y proyectos con tu stack. Credenciales con permisos, respuestas predecibles y eventos firmados.
OpenAPI 3.1.1 · JSON ↗Usa una API key o un access token OAuth. Cada credencial vincula un actor, workspace y generación de demo; los scopes y permisos actuales limitan el acceso.
GET /api/v1/accounts
Authorization: Bearer <token>Cada escritura requiere clave y generation. Tras un timeout o response_unknown, reutiliza la clave y el cuerpo exactos. Cambiar datos con la misma clave devuelve 409. Tickets usa la generación de su credencial.
Idempotency-Key: work-request-001
{"generation": <current-generation>, "status": "resolved"}Las listas devuelven data y nextCursor. Envía ese cursor para continuar; limit admite 1–100 (20 por defecto). Un snapshot modificado devuelve 409: reinicia la paginación.
GET /api/v1/accounts?limit=20&cursor=<nextCursor>120 peticiones autenticadas por minuto y credencial. Los rechazos también consumen cuota. Ante 429, espera los segundos de Retry-After antes de reintentar.
HTTP 429
Retry-After: 60Authorization code + PKCE S256, consentimiento explícito y redirect URI exacta. Canjea cada código una vez; guarda el refresh token nuevo tras cada rotación. Revoca una familia para retirar su acceso.
GET /api/oauth/authorize
POST /api/oauth/token
POST /api/oauth/revokeDeduplica por event ID. Verifica HMAC SHA-256 sobre timestamp + "." + el cuerpo original, con ventana de cinco minutos. Cinco intentos, con esperas de 1/2/4/8 segundos. Replay conserva el event ID.
Northstar-Event-Id: evt_<id>
Northstar-Signature: t=<timestamp>,v1=<signature>/api/v1/accountsListar cuentas
/api/v1/accounts/{id}Consultar un registro de cuentas
/api/v1/accounts/{id}Actualizar nombre o notas de una cuenta
{
"type": "object",
"properties": {
"generation": {
"type": "integer",
"minimum": 1
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"notes": {
"type": "string",
"maxLength": 4000
}
},
"required": [
"generation"
],
"additionalProperties": false
}/api/v1/workListar trabajo
/api/v1/work/{id}Consultar un registro de trabajo
/api/v1/workCrear una solicitud de trabajo
{
"type": "object",
"properties": {
"generation": {
"type": "integer",
"minimum": 1
},
"accountId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9_-]+$"
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"description": {
"type": "string",
"minLength": 1,
"maxLength": 4000
},
"priority": {
"type": "string",
"enum": [
"P1",
"P2",
"P3"
]
}
},
"required": [
"generation",
"accountId",
"title",
"description",
"priority"
],
"additionalProperties": false
}/api/v1/work/{id}Actualizar estado o responsable de trabajo
{
"type": "object",
"properties": {
"generation": {
"type": "integer",
"minimum": 1
},
"status": {
"type": "string",
"enum": [
"open",
"pending-customer",
"escalated",
"resolved"
]
},
"assigneeId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9_-]+$"
}
},
"required": [
"generation"
],
"additionalProperties": false
}/api/v1/projectsListar proyectos
/api/v1/projects/{id}Consultar un registro de proyectos
/api/v1/projectsCrear proyecto
{
"type": "object",
"properties": {
"generation": {
"type": "integer",
"minimum": 1
},
"accountId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9_-]+$"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"ownerId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9_-]+$"
},
"dueAt": {
"type": "string",
"format": "date-time"
},
"nextMilestone": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"generation",
"accountId",
"name",
"ownerId",
"dueAt",
"nextMilestone"
],
"additionalProperties": false
}/api/v1/projects/{id}Editar proyecto
{
"type": "object",
"properties": {
"generation": {
"type": "integer",
"minimum": 1
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"ownerId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9_-]+$"
},
"dueAt": {
"type": "string",
"format": "date-time"
},
"nextMilestone": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"status": {
"type": "string",
"enum": [
"active",
"blocked",
"at-risk",
"complete"
]
}
},
"required": [
"generation",
"name",
"ownerId",
"dueAt",
"nextMilestone",
"status"
],
"additionalProperties": false
}/api/v1/projects/{id}Borrar proyecto (administrador)
{
"type": "object",
"properties": {
"generation": {
"type": "integer",
"minimum": 1
}
},
"required": [
"generation"
],
"additionalProperties": false
}/api/v1/membersListar miembros
/api/v1/members/{id}Consultar un registro de miembros
/api/v1/membersInvitar miembro
{
"type": "object",
"properties": {
"generation": {
"type": "integer",
"minimum": 1
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"email": {
"type": "string",
"pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$",
"maxLength": 254
},
"role": {
"type": "string",
"enum": [
"admin",
"member",
"viewer"
]
}
},
"required": [
"generation",
"name",
"email",
"role"
],
"additionalProperties": false
}/api/v1/invoicesListar facturas
/api/v1/invoices/{id}Consultar un registro de facturas
/api/v1/invoicesGuardar borrador de factura
{
"type": "object",
"properties": {
"generation": {
"type": "integer",
"minimum": 1
},
"accountId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9_-]+$"
},
"amount": {
"type": "number",
"minimum": 0.01,
"maximum": 10000000
},
"dueAt": {
"type": "string",
"format": "date-time"
}
},
"required": [
"generation",
"accountId",
"amount",
"dueAt"
],
"additionalProperties": false
}/api/v1/operationsListar operaciones
/api/v1/operations/{id}Consultar un registro de operaciones
/api/v1/operations/{id}/downloadDescargar una exportación completada con datos protegidos ocultos
/api/v1/operationsIniciar exportación asíncrona del workspace con datos protegidos ocultos
{
"type": "object",
"properties": {
"generation": {
"type": "integer",
"minimum": 1
},
"type": {
"type": "string",
"enum": [
"export-workspace"
]
}
},
"required": [
"generation",
"type"
],
"additionalProperties": false
}/api/v1/webhook-deliveriesListar entregas de webhooks
/api/v1/webhook-deliveries/{id}Consultar un registro de entregas de webhooks
/api/v1/webhook-deliveries/{id}/replayRepetir una entrega con su event ID original
{
"type": "object",
"properties": {
"generation": {
"type": "integer",
"minimum": 1
}
},
"required": [
"generation"
],
"additionalProperties": false
}/healthComprobar conexión autenticada del conector
/entitlements/{id}Consultar plan y SSO de la cuenta firmada
/ticketsCrear ticket; la generación de la credencial es su precondición inmutable
{
"type": "object",
"properties": {
"subject": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"body": {
"type": "string",
"minLength": 1,
"maxLength": 8000
},
"requester_email": {
"type": "string",
"maxLength": 254
},
"page_url": {
"type": "string",
"maxLength": 2048
}
},
"required": [
"subject",
"body",
"requester_email"
],
"additionalProperties": false
}Los errores usan un código estable. Un 503 o 504 no confirma si una escritura terminó: recupera su resultado original antes de iniciar otra petición.
{"error":{"code":"validation"}}| HTTP | Significado / siguiente paso |
|---|---|
| 401 | Autenticación ausente o vencida |
| 403 | Scope o rol insuficiente |
| 404 | Recurso no encontrado |
| 409 | Conflicto de generación, snapshot o idempotencia |
| 422 | Cuerpo de petición inválido |
| 429 | Cuota agotada; respeta Retry-After |
| 500 | Fallo interno redactado |
| 503 | Resultado incierto; recupera la petición original |
| 504 | Timeout; la finalización no está confirmada |