Referencia
Recurso
CRUD
Operaciones de lectura y escritura
5 endpoints · base http://localhost/api/v1
get
/{modelo}Listar registros
Lista paginada. Multi-tenant: si el modelo tiene campo empresa, filtra automaticamente por la empresa del token.
🔒 Bearer tokenhttp://localhost/api/v1/{modelo}
Parámetros
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
| modelo* | path | string | — |
| page | query | integer | — |
| per_page | query | integer | — |
| sort | query | string | Campo para ordenar |
| order | query | string (asc | desc) | — |
| search | query | string | Busqueda en campos de texto |
| lean | query | string (true | false) | true = sin resolver relaciones (_str) |
Respuestas
200Lista de registros con paginacion y relaciones resueltas
| Campo | Tipo | Descripción |
|---|---|---|
| data | object[] | — |
| meta | object | — |
| meta.model | string | — |
| meta.total | integer | — |
| meta.page | integer | — |
| meta.per_page | integer | — |
| meta.pages | integer | — |
| errors | null | — |
401Token invalido, expirado o faltante
| Campo | Tipo | Descripción |
|---|---|---|
| data | null | — |
| meta | object | — |
| errors | object[] | — |
| errors[].code | string | — |
| errors[].message | string | — |
| errors[].field | string | — |
{
"data": null,
"meta": {},
"errors": [
{
"code": "UNAUTHORIZED",
"message": "Se requiere header Authorization: Bearer <token>"
}
]
}post
/{modelo}Crear registro
Crea un nuevo registro. ID auto-asignado. Multi-tenant: empresa se asigna automaticamente del token.
🔒 Bearer tokenhttp://localhost/api/v1/{modelo}
Parámetros
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
| modelo* | path | string | — |
Cuerpo
Sin propiedades documentadas.
{
"nombre": "Real Brasileno",
"abreviatura": "BRL",
"codigo_sat": "BRL",
"decimales": 2
}Respuestas
201Registro creado
| Campo | Tipo | Descripción |
|---|---|---|
| data | object | Registro con campos + to_str + {fk}_str para relaciones resueltas |
| meta | object | — |
| meta.model | string | — |
| errors | null | — |
401Token invalido, expirado o faltante
| Campo | Tipo | Descripción |
|---|---|---|
| data | null | — |
| meta | object | — |
| errors | object[] | — |
| errors[].code | string | — |
| errors[].message | string | — |
| errors[].field | string | — |
{
"data": null,
"meta": {},
"errors": [
{
"code": "UNAUTHORIZED",
"message": "Se requiere header Authorization: Bearer <token>"
}
]
}422Error de validacion
| Campo | Tipo | Descripción |
|---|---|---|
| data | null | — |
| meta | object | — |
| errors | object[] | — |
| errors[].code | string | — |
| errors[].message | string | — |
| errors[].field | string | — |
{
"data": null,
"meta": {},
"errors": [
{
"code": "UNIQUE",
"message": "Registro duplicado",
"field": null
}
]
}delete
/{modelo}/{id}Eliminar registro
Verifica dependencias antes de eliminar. Si hay registros que referencian este, retorna 409 con el detalle.
🔒 Bearer tokenhttp://localhost/api/v1/{modelo}/{id}
Parámetros
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
| modelo* | path | string | — |
| id* | path | string | — |
Respuestas
200Registro eliminado
{
"data": {
"deleted": true,
"id": "10"
},
"meta": {
"model": "Moneda"
},
"errors": null
}401Token invalido, expirado o faltante
| Campo | Tipo | Descripción |
|---|---|---|
| data | null | — |
| meta | object | — |
| errors | object[] | — |
| errors[].code | string | — |
| errors[].message | string | — |
| errors[].field | string | — |
{
"data": null,
"meta": {},
"errors": [
{
"code": "UNAUTHORIZED",
"message": "Se requiere header Authorization: Bearer <token>"
}
]
}404Registro no encontrado (o no pertenece a la empresa del token)
| Campo | Tipo | Descripción |
|---|---|---|
| data | null | — |
| meta | object | — |
| errors | object[] | — |
| errors[].code | string | — |
| errors[].message | string | — |
| errors[].field | string | — |
{
"data": null,
"meta": {},
"errors": [
{
"code": "NOT_FOUND",
"message": "Record not found with id: 99"
}
]
}409No se puede eliminar — tiene registros dependientes
{
"data": null,
"meta": {
"model": "Moneda"
},
"errors": [
{
"code": "HAS_DEPENDENTS",
"message": "No se puede eliminar: tiene 108672 registros dependientes",
"dependents": {
"Venta": 9448,
"Compra": 917,
"Poliza": 265
}
}
]
}get
/{modelo}/{id}Obtener un registro
Multi-tenant: verifica que el registro pertenece a la empresa del token.
🔒 Bearer tokenhttp://localhost/api/v1/{modelo}/{id}
Parámetros
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
| modelo* | path | string | — |
| id* | path | string | — |
| lean | query | string (true | false) | — |
Respuestas
200Registro encontrado
| Campo | Tipo | Descripción |
|---|---|---|
| data | object | Registro con campos + to_str + {fk}_str para relaciones resueltas |
| meta | object | — |
| meta.model | string | — |
| errors | null | — |
401Token invalido, expirado o faltante
| Campo | Tipo | Descripción |
|---|---|---|
| data | null | — |
| meta | object | — |
| errors | object[] | — |
| errors[].code | string | — |
| errors[].message | string | — |
| errors[].field | string | — |
{
"data": null,
"meta": {},
"errors": [
{
"code": "UNAUTHORIZED",
"message": "Se requiere header Authorization: Bearer <token>"
}
]
}404Registro no encontrado (o no pertenece a la empresa del token)
| Campo | Tipo | Descripción |
|---|---|---|
| data | null | — |
| meta | object | — |
| errors | object[] | — |
| errors[].code | string | — |
| errors[].message | string | — |
| errors[].field | string | — |
{
"data": null,
"meta": {},
"errors": [
{
"code": "NOT_FOUND",
"message": "Record not found with id: 99"
}
]
}put
/{modelo}/{id}Actualizar registro (parcial)
Solo los campos enviados se actualizan.
🔒 Bearer tokenhttp://localhost/api/v1/{modelo}/{id}
Parámetros
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
| modelo* | path | string | — |
| id* | path | string | — |
Cuerpo
Sin propiedades documentadas.
{
"nombre": "Nombre actualizado"
}Respuestas
200Registro actualizado
| Campo | Tipo | Descripción |
|---|---|---|
| data | object | Registro con campos + to_str + {fk}_str para relaciones resueltas |
| meta | object | — |
| meta.model | string | — |
| errors | null | — |
401Token invalido, expirado o faltante
| Campo | Tipo | Descripción |
|---|---|---|
| data | null | — |
| meta | object | — |
| errors | object[] | — |
| errors[].code | string | — |
| errors[].message | string | — |
| errors[].field | string | — |
{
"data": null,
"meta": {},
"errors": [
{
"code": "UNAUTHORIZED",
"message": "Se requiere header Authorization: Bearer <token>"
}
]
}404Registro no encontrado (o no pertenece a la empresa del token)
| Campo | Tipo | Descripción |
|---|---|---|
| data | null | — |
| meta | object | — |
| errors | object[] | — |
| errors[].code | string | — |
| errors[].message | string | — |
| errors[].field | string | — |
{
"data": null,
"meta": {},
"errors": [
{
"code": "NOT_FOUND",
"message": "Record not found with id: 99"
}
]
}422Error de validacion
| Campo | Tipo | Descripción |
|---|---|---|
| data | null | — |
| meta | object | — |
| errors | object[] | — |
| errors[].code | string | — |
| errors[].message | string | — |
| errors[].field | string | — |
{
"data": null,
"meta": {},
"errors": [
{
"code": "UNIQUE",
"message": "Registro duplicado",
"field": null
}
]
}