Inicio de sesión
Autentica a un usuario y obtiene un token JWT para las siguientes solicitudes a la API.
POST
/apidev/v1/loginPermisoNinguno (público)
Límite de solicitudes5 solicitudes/30s por cuenta
CachéNinguna
Resumen
Autentica a un usuario por correo electrónico y contraseña, y devuelve un token JWT firmado válido por 1 hora. Este es un endpoint público: no requiere JWT ni clave de API, solo el encabezado tenant.
Para conocer el modelo completo de autenticación dual (JWT + clave de API) y cómo usar el token en los endpoints protegidos, consultá Autenticación.
Solicitud
Encabezados
| Encabezado | Tipo | Requerido | Descripción |
|---|---|---|---|
tenant | string | Sí | El dominio de tenant que te fue asignado (por defecto: geotareas.com); enviá siempre el tenant que te fue asignado |
Content-Type | string | Sí | Debe ser application/json |
Parámetros del cuerpo
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
email | string | Sí | Dirección de correo electrónico del usuario |
password | string | Sí | Contraseña del usuario |
playerid | string | No | Identificador de dispositivo para notificaciones push a registrar para este usuario (máx. 300) |
Ejemplos de código
- cURL
- JavaScript
- Python
- PHP
- C#
curl -X POST "https://$TENANT/apidev/v1/login" \
-H "tenant: $TENANT" \
-H "Content-Type: application/json" \
-d '{
"email": "dev@company.com",
"password": "your_password"
}'
const TENANT = "geotareas.com";
const response = await fetch(`https://${TENANT}/apidev/v1/login`, {
method: "POST",
headers: {
"tenant": TENANT,
"Content-Type": "application/json",
},
body: JSON.stringify({
email: "dev@company.com",
password: "your_password",
}),
});
const result = await response.json();
const token = result.data.authorization;
import requests
TENANT = "geotareas.com"
response = requests.post(
f"https://{TENANT}/apidev/v1/login",
headers={
"tenant": TENANT,
"Content-Type": "application/json",
},
json={
"email": "dev@company.com",
"password": "your_password",
},
)
result = response.json()
token = result["data"]["authorization"]
<?php
$tenant = "geotareas.com";
$ch = curl_init("https://{$tenant}/apidev/v1/login");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"tenant: {$tenant}",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"email" => "dev@company.com",
"password" => "your_password",
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
$token = $result["data"]["authorization"];
using System.Net.Http;
using System.Text;
using System.Text.Json;
var tenant = "geotareas.com";
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("tenant", tenant);
var payload = JsonSerializer.Serialize(new
{
email = "dev@company.com",
password = "your_password"
});
var content = new StringContent(payload, Encoding.UTF8, "application/json");
var response = await client.PostAsync(
$"https://{tenant}/apidev/v1/login", content);
var json = await response.Content.ReadAsStringAsync();
using var doc = JsonDocument.Parse(json);
var token = doc.RootElement
.GetProperty("data")
.GetProperty("authorization")
.GetString();
Respuesta
Éxito — 200 OK
| Campo | Tipo | Descripción |
|---|---|---|
success | boolean | Siempre true cuando es exitoso |
data.authorization | string | Token JWT firmado, válido por 1 hora |
meta | object | Objeto vacío |
{
"success": true,
"data": {
"authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
},
"meta": {}
}
Errores
| Código HTTP | Código de error | Causa |
|---|---|---|
400 | VALIDATION_ERROR | Cuerpo ausente o mal formado (p. ej., formato de correo inválido, contraseña ausente) |
401 | UNAUTHORIZED | Falta el encabezado tenant, o el correo o la contraseña son inválidos |
401 | TOKEN_EXPIRED | Un JWT emitido previamente es válido pero ya superó su vida útil de 1 hora |
403 | COMPANY_SUSPENDED | La cuenta de la compañía está suspendida — no se emiten tokens y todos los endpoints devuelven este código hasta que se reactive. Contactá al soporte de Logicsat |
429 | RATE_LIMITED | 5 o más intentos fallidos en 30s; la cuenta queda bloqueada por 60 segundos |
{
"success": false,
"data": null,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid email or password."
}
}
Próximos pasos
Una vez que tengas el token, adjuntalo junto con tu clave de API y el encabezado tenant en cada solicitud. Consultá Uso del token para conocer los encabezados exactos requeridos.