Start here

Quickstart

Sign up to first authenticated API call, in about ten minutes. This walks through doing it with an AI agent over MCP; every step also works by hand through the dashboard and a REST client.

1. Create your account

Sign up with Google at app.aaly.io. Your first project exists the moment you sign up — there's nothing to provision first.

2. Connect your agent

In Claude, Cursor, or Codex, add a custom MCP connector pointing at:

https://mcp.aaly.io

Approve the consent screen that opens in your browser. Your agent discovers the authorization server, registers itself, and completes an OAuth 2.1 + PKCE flow — there's no key to copy. Full details on Connect an AI agent.

3. Define your first entity

Ask your agent to create an entity, or call the MCP tools directly. A tasks entity with a required, searchable title and a status enum:

create_entity(project_id, name: "tasks", key: "TSK")
create_field(entity_id, name: "title", type: "text", required: true, search: true)
create_field(entity_id, name: "status", type: "enum", values: ["open", "done"])

The moment the fields exist, POST /tasks, GET /tasks, GET /tasks/{id}, PATCH /tasks/{id}, and DELETE /tasks/{id} are live. Nothing is generated into a repository — there's no code to deploy.

4. Get your project's REST base URL

Call generate_openapi_spec (or open API Reference in the dashboard). The spec's servers[0].url is your project's real base URL, shaped https://api.aaly.io/<your-slug>/<project> — both segments come from your account and this project specifically, so copy the real value rather than guessing it. Every entity's endpoints hang off that base.

5. Get a token

curl -X POST https://api.aaly.io/<your-slug>/<project>/auth/signup \
  -H "Content-Type: application/json" \
  -d '{"name": "Ada", "email": "ada@example.com", "password": "correct horse battery staple"}'
{
  "jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "user": { "id": "USR1", "name": "Ada", "tenantId": "TNT1", "email": "ada@example.com" }
}

The first user on a project creates its first tenant automatically, whether or not the project is multi-tenant. See Multi-tenancy for how later sign-ups behave differently.

6. Make your first authenticated call

curl -X POST https://api.aaly.io/<your-slug>/<project>/tasks \
  -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  -d '{"title": "Ship it", "status": "open"}'
{
  "id": "TSK1",
  "title": "Ship it",
  "status": "open",
  "_status": "active",
  "_createdAt": "2026-08-24T10:00:00.000Z",
  "_createdBy": { "id": "USR1", "name": "Ada" }
}
curl https://api.aaly.io/<your-slug>/<project>/tasks \
  -H "Authorization: Bearer $JWT"
{ "items": [ { "id": "TSK1", "title": "Ship it", "status": "open" } ], "count": 1, "total": 1, "limit": 50, "offset": 0 }

That's the whole loop: define a field, get an endpoint. Next, read Concepts for the full data model, or REST API for filtering, sorting, and error shapes.