Skip to main content
GET
List characters
GET /v1/characters returns a cursor-paginated list of your team’s characters, ordered by created_at descending. Soft-deleted characters are excluded.

Filtering by status

Pass ?status= to narrow the page to a single lifecycle state: draft, synthesizing, reviewing, ready, failed or deleted. Omit it to list every non-deleted state. An unrecognized value returns 400 invalid_format with param: status, and the message lists the values that are accepted. Drafts appear in the default list. A character created by POST /v1/characters/drafts is a first-class row from the moment it exists, so an unfiltered page mixes drafts in with everything else. If your UI only shows finished characters, filter with ?status=ready; to build a “finish these” queue, use ?status=draft.
cancelled is not a filterable status — a cancelled character is hard-deleted and never appears in list or retrieve; it surfaces only as the character.cancelled webhook.

When to use

  • Powering a “pick a character” UI in your own product.
  • Auditing which characters are still in draft / synthesizing / reviewing and need attention.
  • Bulk-syncing the catalog into your local database.

Pagination

Pass limit (1–100, default 20) and starting_after (the next_cursor value from the previous response, which is the id of the last character returned). Stop when next_cursor is null. The cursor convention is consistent across every paginated V1 endpoint — starting_after to advance, next_cursor to receive the next anchor.

Examples

Limits

  • Rate limit: bucket characters_get — 120 requests/min sustained, 240 burst per team.

Common pitfalls

  • The list does not include deleted characters. To enumerate everything for an audit, you need to track deletions out-of-band — deletes are soft and the character stays for IDs to remain valid forever, but the list endpoint hides them.
  • next_cursor is the last returned character’s id (the opaque char_<ulid>). Pass it back as starting_after on the next request — don’t synthesize cursors yourself.
  • The fields returned per character are the same as GET /v1/characters/{id} (no shrunk “summary” shape); pages are bounded by limit, not by payload size.
  • Drafts are in the default page. Filter on status rather than assuming every row is usable — a draft returns 400 character_not_ready if you attach it to a generation. See Views and lifecycle.

Authorizations

X-Api-Key
string
header
required

Your team API key (starts with al_live_).

Headers

Aurous-Version
string

Optional API version pin (YYYY-MM-DD). Omit the header to receive the platform default, currently 2026-08-26.

Pattern: ^\d{4}-\d{2}-\d{2}$
Example:

"2026-08-26"

Query Parameters

limit
number

Items per page (1-100, default 20)

Example:

20

starting_after
string

Cursor — opaque char_<ulid> from a prior page

Example:

"char_01HXMQ7Z3K8Y2NABCDEFGHJKMR"

status
enum<string>

Filter to a single lifecycle state. Omit to list all (non-deleted) states. An unrecognized value returns 400 invalid_format (param status). Note: cancelled is NOT a filterable status — a cancelled character is hard-deleted and never appears in list/get; it surfaces only as the character.cancelled webhook.

Available options:
draft,
synthesizing,
reviewing,
ready,
failed,
deleted

Response

Cursor-paginated list of characters

object
enum<string>
required

Discriminator

Available options:
list
Example:

"list"

data
object[]
required

Array of CharacterResponse items

has_more
boolean
required

True when the next page exists

Example:

true

next_cursor
object | null

Pass as ?starting_after= on the next request. null when has_more is false.

Example:

"img_01HXMQ7Z3K8Y2VNABCDEFGHJKM"