The platform

Every project starts production-ready.

None of this is a starter template you inherit and then maintain. These are properties of the platform answering your requests, which is why they stay true after the fifth change as well as the first.

Users and access

Live before you define your first entity. Nothing here is a template you copy into a repo and then own.

Authentication

Accounts, Google sign-in, one-hour access tokens and rotating refresh tokens. Sign-up and sign-in exist in a project the moment it does.

Tenant isolation

Records are scoped to their customer by the platform, on every endpoint, with no opt-in and no policy to author. A cross-tenant read returns 403.

Agent authentication

Agents connect over OAuth 2.1 with PKCE and register themselves. No key to copy, and access is revocable per agent. Tested end to end with Claude and Codex.

API keys

For CI, scripts, and anything that cannot open a browser. Same server, same tools, same tenant scoping.

Your data model

Defined once, by you or by your agent, and enforced everywhere the API touches it.

Validation

Types, required fields, enums, lengths, uniqueness, min and max, regex patterns and decimal precision, all from the same definition.

Relationships

Typed references between entities, single or multiple, with target fields projected inline on read and nested writes up to three levels deep.

Formula fields

Computed values from other fields on the same record, declared as a sandboxed expression. No custom code to write or deploy.

Filtering and facets

Filter, sort, paginate and count by facet straight off the collection endpoint, backed by an index the platform maintains.

Writing and reading at volume

The operations that usually mean a custom endpoint somewhere else.

Bulk writes and reads

Send a JSON array to a collection URL to create, update, delete or upsert up to 100 records in one call, with a per-item result for each. Read many by id in one request.

Atomic counters

Increment a number or append to a list against the stored value in a single write, with min and max enforced there, so stock levels and counters never race or go negative.

File storage

Presigned uploads and short-lived download URLs, with files attachable from your own entities. No bucket to wire up.

Soft delete

A delete flips status and cascades to nested children. Records drop out of reads and are never purged underneath you.

Your own logic, and what you can see

Where the platform stops deciding and you start, plus the means to find out what happened.

Functions

Your own Python on an entity's request lifecycle, on any method including GET, before or after, sync or async. Webhooks and third-party integrations are functions.

Custom endpoints

Non-CRUD routes you shape yourself, backed by functions, with auth and tenant scoping still applied, or deliberately public for a form or webhook target.

Request and function logs

Per-request and per-execution logs sharing one request id, so a failure inside a function traces back to the call that caused it.

Live OpenAPI spec

A current, accurate spec generated from the definition. Your agent reads your API instead of guessing at it.

How your agent operates it

The part that makes the rest of this reachable from a prompt.

MCP server

Create entities, add fields, define functions and inspect a project through typed tools. The agent operates the backend; it never edits backend files, because there are none.

No deploy step

An entity's endpoints are live the moment it exists. There is no build, no migration to run, and nothing to promote.

The API your agent reads

Every entity gets REST endpoints the moment it exists, with no deploy step, and the OpenAPI spec is generated from the same definition. Your agent reads the spec rather than guessing at the shape of your own API, which is the difference between it writing a client that works and one that compiles.

The Aaly dashboard listing entities for a restaurant billing project, each with a key and the GET, POST, PATCH and DELETE methods it exposes, plus Swagger and Download Spec buttons.
// entities and their live endpoints, with the spec one click away
The generated OpenAPI spec rendered in Swagger, showing the auth endpoints: signup, signin, refresh, logout, find, Google OAuth and API key management.
// the generated spec: auth endpoints exist before you define anything

When you do need your own code

Aaly Functions run your own Python on an entity's request lifecycle, on any method including GET, before or after the request, synchronously or not. Webhooks and third-party integrations are functions. Custom endpoints give you non-CRUD routes backed by those functions, with the platform's auth and tenant scoping still applied, or deliberately public when you need a form or webhook target that accepts anonymous calls.

The Aaly dashboard listing two functions attached to a sync-jobs entity, one on the before-request trigger point and one on after-request, both enabled.
// two functions on one entity's request lifecycle

What is not here yet

No realtime or push updates, and that one is not on the roadmap. No scheduled or recurring execution, no roles or field-level permissions inside a tenant, no CSV import or export, no cursor pagination, and search is exact or prefix matching rather than full-text or fuzzy. The full list, with a workaround for each → What shipped recently →

All of it is on every plan, including the free one.

Plans differ on volume: requests, projects, tenants and storage. They do not gate features.

Start building free