8.5 KiB
Aether API V3 Frontend Integration Guide (Svelte/TypeScript)
This guide defines the standards for interacting with the Aether API V3 CRUD and Action endpoints.
1. Authentication and Security (Mandatory)
V3 architecture enforces strict Multi-Tenant Isolation and Machine Authorization. Requests require two levels of validation.
A. The "Entry Ticket" (API Key)
Mandatory for all requests. identifies the application or client.
- Header:
x-aether-api-key: <your_app_key> - Status Code:
403 Forbiddenif missing or invalid.
B. The "Visa" (Account Context)
Required for any non-public data (Journals, Badges, Users, etc.).
- Standard Access: Provide the
x-account-id(the random string ID).- Header:
x-account-id: <account_id>
- Header:
- Administrative Bypass: For authorized scripts needing global access.
- Header:
x-no-account-id: bypass
- Header:
- Token Access: Provide a JWT in the query string.
- Query Param:
?jwt=<token>
- Query Param:
Caution
UNSUPPORTED HEADERS: The header
x-aether-api-tokenis NOT recognized by the V3 API. If you send it, the backend will treat you as a guest and block access to private data.
2. Bootstrapping (The FQDN Handshake)
When the frontend first loads and doesn't know the account_id, it performs a "handshake" using its domain name.
Endpoint: POST /v3/crud/site_domain/search
Body:
{
"and": [
{ "field": "fqdn", "op": "eq", "value": "demo.oneskyit.com" }
]
}
Results:
- Returns 200 + a list containing the
account_id(random string ID) andsite_id(random string ID). - ** デザイン Choice:** If the domain is not found, it returns 200 OK with an empty list
[]. It is NOT a 404.
3. Standard CRUD Patterns
A. GET by ID
Used when the ID is known.
- Endpoint:
GET /v3/crud/{obj_type}/{id} - Security: Returns 403 if the record doesn't belong to your
x-account-id.
B. POST Search
The primary way to retrieve data.
- Endpoint:
POST /v3/crud/{obj_type}/search - Security: Automatically filters results to only show records belonging to your
x-account-id. If no account context is provided, it will return 0 records for private objects.
C. POST Create / PATCH Update
Modify data in the system.
- Endpoints:
POST /v3/crud/{obj_type}/PATCH /v3/crud/{obj_type}/{id}
- Strict Mode (Default): The API validates your payload against the Pydantic model. If you send fields that do not exist in the model, the database might return a 400 "Unknown column" error.
- Permissive Mode (Header): To allow the frontend to send "extra" fields (like local UI state) without causing errors, use the following header:
- Header:
x-ae-ignore-extra-fields: true - Behavior: When set to
true, the backend will automatically strip any fields from the payload that are not defined in the object's model before attempting to save to the database.
- Header:
4. V3 Uniform Lookup System
The V3 Lookup system provides a hierarchical, deduplicated interface for standardized tables (Countries, Timezones, etc.). It supports global defaults, account overrides, and site-specific whitelisting.
A. List Lookups
Retrieve a ranked and filtered list of lookup items.
- Endpoint:
GET /v3/lookup/{lu_type}/list - Available Types:
country,country_subdivision,time_zone - Parameters:
site_id(Optional): Random ID of the site to apply a Whitelist Policy.only_priority(Optional): Set totrueto return only high-priority items (e.g., common time zones).for_type/for_id(Optional): Context for object-specific overrides.include_disabled(Optional): Set totrueto see shadowed/disabled records.
B. Resolve Identity
Resolves a string (code, group, or name) to a single record.
- Endpoint:
GET /v3/lookup/{lu_type}/resolve?q=VALUE - Usage: Use this when you have an external code (e.g., ISO "US") and need the full Aether record.
C. Site Whitelist Policy
To limit lookups for a specific site, add a lookup_policy to the site.cfg_json field.
Schema:
{
"lookup_policy": {
"country": ["US", "CA", "GB"],
"time_zone": ["America/New_York"]
}
}
Note: Whitelist values must match the group field in the database.
5. Event File Data Retrieval (Hosted Files)
Every Event File (event_file) must have a linked Hosted File (hosted_file). The Hosted File itself is a metadata record for binary content (files), which is accessed via separate Action endpoints (e.g., /v3/action/hosted_file/download). This API endpoint provides metadata about the associated hosted file. To retrieve this additional metadata:
- Endpoint:
GET /v3/crud/event_file/{event_file_id} - Query Parameter: Add
inc_hosted_file=true- Example:
/v3/crud/event_file/<event_file_id>?inc_hosted_file=true
- Example:
Response Impact:
- Top-Level Convenience Fields: The response will include top-level fields for commonly needed hosted file data. These are populated directly from the SQL view via JOINs.
hosted_file_hash_sha256(string)hosted_file_subdirectory_path(string)hosted_file_content_type(string)hosted_file_size(string - in bytes)
- Nested Hosted File Object: A full
hosted_fileobject will be nested under thehosted_filekey. This object (Hosted_File_Basemodel) will contain all its standard fields, includingid(random string ID),hash_sha256,content_type,size, etc.
6. Hosted File Actions: Convert & Clip (Frontend Notes)
These helper endpoints let the frontend request small server-side transformations without uploading new blobs. They return a newly-created hosted_file metadata object on success.
-
Convert (PDF → Image)
- Method:
GET - Path:
/v3/action/hosted_file/{hosted_file_id}/convert_file - Required query params:
link_to_type,link_to_id - Optional query params:
filename_no_ext(defaults toautomated_hosted_file_conversion),to_type(defaults towebp) - Auth: standard V3 headers (
x-aether-api-key,x-account-id/x-no-account-id/?jwt=) - Behavior: converts the first page of a PDF to
webporpng, saves a newhosted_file, and returns its metadata. Returns 400 on failure.
- Method:
-
Clip Video
- Method:
GET - Path:
/v3/action/hosted_file/{hosted_file_id}/clip_video - Required query params:
link_to_type,link_to_id,start_time,end_time(formatHH:MM:SS) - Optional query params:
filename_no_ext(defaults toautomated_hosted_file_clip_video),reencode(bool),scale_down(bool) - Auth: standard V3 headers
- Behavior: extracts a clip using
ffmpegand saves it as a newhosted_file. Defaults to stream-copying to be fast; setreencode=trueto force H.264 orscale_down=trueto resize. Returns 400 on failure. - Behavior: extracts a clip using
ffmpegand saves it as a newhosted_file.- Defaults to stream-copying to be fast; set
reencode=trueto force H.264 orscale_down=trueto resize. - For longer-running clips you can schedule the job in the background by adding
?background=true. When scheduled the API returns202 Acceptedand the clip runs asynchronously on the server; check the returnedhosted_filerecord later via the standard V3hosted_fileendpoints. - Returns 400 on synchronous failure; returns 202 when scheduled successfully.
- Defaults to stream-copying to be fast; set
- Method:
Frontend guidance:
- Call these routes with the same
link_to_type/link_to_idyou plan to associate the resulting hosted_file with — the server resolves random IDs for you. - After a successful response, use the V3
hosted_fileaction endpoints (download/delete) to manage or retrieve the new file. - These endpoints run synchronously and can take time for large inputs; for heavy or batch workloads use a queued job pattern instead.
- These endpoints may take time for large inputs. Prefer using
?background=trueto schedule work and receive a202 Acceptedresponse for async processing. For heavy or batch workloads use a queued job pattern instead.
5. Troubleshooting 403 Forbidden
If you receive a 403 on a valid ID:
- Verify
x-aether-api-keyis correct. - Ensure you are sending
x-account-idand NOTx-aether-api-token. - Verify the record actually belongs to the account ID you are sending.
- Check if the object is marked
public_read: Truein the registry. (Posts and Archive Content allow guest access; Journals and Badges do not).