Autenticación
Cada petición a /rest/v1 necesita una clave de API de la organización. La mayoría de las rutas son de solo lectura. Las claves también pueden enviar un recordatorio a un solo invitado cuando incluyen reminders:send.
Crear una clave
Los Owners y Organization Admins crean claves desde My organization. El secreto es un JWT y se muestra una sola vez. WeHabit solo guarda un hash SHA-256 de ese token.
Cada clave pertenece a una organización y se emite con los alcances events:read, guests:read y reminders:send. Puede listar eventos e invitados y enviar un correo de recordatorio a un solo registro. No puede crear eventos, actualizar o borrar datos de invitados, ni enviar a todos los invitados a la vez.
Puedes definir una fecha de expiración. La API rechaza la clave después de ese momento. Revoke la desactiva de inmediato, aunque no haya expirado. Otros Owners y Organization Admins pueden ver quién creó una clave, cuándo se creó y cuándo expira.
Enviar la clave
Authorization: Bearer <JWT>
Accept: application/json
Content-Type no es necesario en peticiones GET. En POST (recordatorio a un invitado), envía Content-Type: application/json. X-Request-ID es opcional. Si envías un id corto (letras, números, ., _ o -, hasta 128 caracteres), la API lo devuelve en la respuesta.
Límites
Cada clave permite 60 peticiones por minuto. La ventana es un minuto de reloj. Al superarla, la API responde 429 y el encabezado Retry-After.
Forma de los errores
Todos los errores usan este cuerpo:
{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication is required."
}
}
| Estado | Código | Cuándo |
|---|---|---|
| 401 | UNAUTHORIZED | JWT ausente, mal formado, inválido o expirado, o una clave revocada. |
| 403 | FORBIDDEN | La clave es válida pero no incluye el alcance que exige la ruta. |
| 400 | INVALID_REQUEST | Un parámetro de consulta o campo JSON es inválido. details nombra cada campo. |
| 404 | NOT_FOUND | La ruta no existe, o un registro referenciado (como una sucursal o un invitado) no se encontró en esta organización. |
| 405 | METHOD_NOT_ALLOWED | La ruta existe pero el método HTTP no está permitido. La respuesta incluye Allow. |
| 409 | EVENT_DRAFT | El recurso existe pero el evento debe publicarse primero (recordatorio a un invitado). |
| 429 | RATE_LIMIT_EXCEEDED | La clave superó 60 peticiones en el minuto actual. retry_after son segundos. |
| 500 | INTERNAL | La API no pudo completar la petición. |