Skip to main content

API Responses

Standard response formats for AsaHome Cloud API.

Response Structure

Successful Responses

All successful responses follow a consistent structure:

Single Resource

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z"
}

Collection

{
"data": [
{
"id": "device-uuid-1",
"name": "Home Hub",
"isOnline": true
},
{
"id": "device-uuid-2",
"name": "Office Hub",
"isOnline": false
}
],
"meta": {
"total": 25,
"page": 1,
"limit": 10,
"totalPages": 3
}
}

Error Responses

{
"statusCode": 400,
"message": "Validation failed",
"error": "Bad Request",
"details": [
{
"field": "email",
"message": "email must be a valid email address"
}
]
}

HTTP Status Codes

Success Codes

StatusDescriptionWhen Used
200 OKRequest succeededGET, PUT, PATCH
201 CreatedResource createdPOST
204 No ContentRequest succeeded, no bodyDELETE

Client Error Codes

StatusDescriptionExample
400 Bad RequestInvalid requestMissing required field
401 UnauthorizedAuthentication requiredInvalid/missing token
403 ForbiddenAccess deniedInsufficient permissions
404 Not FoundResource not foundInvalid ID
409 ConflictResource conflictDuplicate email
422 UnprocessableValidation errorInvalid data format
429 Too Many RequestsRate limitedExceeded rate limit

Server Error Codes

StatusDescriptionAction
500 Internal Server ErrorServer errorReport issue
502 Bad GatewayUpstream errorRetry later
503 Service UnavailableMaintenanceRetry later
504 Gateway TimeoutTimeoutRetry with longer timeout

Pagination

Request

GET /api/v1/devices?page=2&limit=20

Query Parameters

ParameterTypeDefaultDescription
pagenumber1Page number (1-indexed)
limitnumber20Items per page (max 100)
sortstringcreatedAtSort field
orderstringdescSort order (asc or desc)

Response

{
"data": [...],
"meta": {
"total": 150,
"page": 2,
"limit": 20,
"totalPages": 8
}
}

Meta Object

FieldTypeDescription
totalnumberTotal items across all pages
pagenumberCurrent page number
limitnumberItems per page
totalPagesnumberTotal number of pages

Filtering

Single Value

GET /api/v1/devices?isOnline=true

Multiple Values

GET /api/v1/devices?status=active,pending

Date Range

GET /api/v1/devices?createdAfter=2024-01-01&createdBefore=2024-12-31

Timestamps

All timestamps are in ISO 8601 format (UTC):

{
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T14:45:30.123Z",
"lastSeenAt": "2024-01-15T14:50:00.000Z"
}

UUIDs

All IDs are UUIDs (v4):

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"userId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
"deviceId": "6ba7b811-9dad-11d1-80b4-00c04fd430c8"
}

Nullable Fields

Fields that may be null are clearly indicated:

{
"id": "device-uuid",
"name": "Home Hub",
"ipAddress": "192.168.1.100",
"lastSeenAt": null,
"metadata": null
}

Nested Resources

Related resources may be included:

Expanded Response

{
"id": "device-uuid",
"name": "Home Hub",
"users": [
{
"id": "user-uuid",
"email": "owner@example.com",
"role": "owner"
}
]
}

Reference Only

{
"id": "device-user-uuid",
"userId": "user-uuid",
"deviceId": "device-uuid",
"role": "editor"
}

Authentication Responses

Login Response

{
"accessToken": "eyJhbGciOiJIUzI1NiIs...",
"refreshToken": "eyJhbGciOiJIUzI1NiIs...",
"expiresIn": 900,
"user": {
"id": "user-uuid",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"role": "user"
}
}

Token Response Fields

FieldTypeDescription
accessTokenstringJWT access token
refreshTokenstringJWT refresh token
expiresInnumberAccess token lifetime in seconds
userobjectUser profile (on login only)

Rate Limit Headers

All responses include rate limit headers:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1700000060

Content Types

Request

Content-Type: application/json

Response

Content-Type: application/json; charset=utf-8

CORS Headers

Access-Control-Allow-Origin: https://app.asahome.io
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH
Access-Control-Allow-Headers: Authorization, Content-Type
Access-Control-Allow-Credentials: true

Example Responses

GET /devices

{
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"uuid": "device-uuid-1",
"deviceId": "asahome-home-001",
"name": "Home Hub",
"isOnline": true,
"lastSeenAt": "2024-01-15T14:50:00.000Z",
"role": "owner"
}
],
"meta": {
"total": 1,
"page": 1,
"limit": 20,
"totalPages": 1
}
}

POST /devices/register

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"uuid": "device-uuid-new",
"deviceId": "asahome-home-002",
"name": "Office Hub",
"ipAddress": "192.168.1.101",
"port": "8123",
"isOnline": false,
"metadata": null,
"createdAt": "2024-01-15T15:00:00.000Z",
"updatedAt": "2024-01-15T15:00:00.000Z"
}

Error: Validation Failed

{
"statusCode": 400,
"message": [
"uuid must be a UUID",
"name should not be empty"
],
"error": "Bad Request"
}

Error: Unauthorized

{
"statusCode": 401,
"message": "Token has expired",
"error": "Unauthorized"
}

Error: Not Found

{
"statusCode": 404,
"message": "Device not found",
"error": "Not Found"
}

Response Headers Reference

HeaderDescription
Content-TypeResponse content type
X-RateLimit-LimitRate limit ceiling
X-RateLimit-RemainingRemaining requests
X-RateLimit-ResetReset timestamp
X-Request-IdUnique request identifier