RaisFastRaisFast
Content Types

API Reference

Auto-generated routes, access control levels, rule engine, query parameters, and caching.

Every content type automatically gets a REST API. This page covers the generated routes, access control, filtering, and query parameters.

Auto-Generated Routes

Collection Type (default)

RESTful mode (default):

MethodRouteAction
GET/api/v1/cms/{plural}List records
GET/api/v1/cms/{plural}/{id}Get single record
POST/api/v1/cms/{plural}Create record
PUT/api/v1/cms/{plural}/{id}Update record
DELETE/api/v1/cms/{plural}/{id}Delete record

Simple mode (when api_restful = false):

MethodRouteAction
GET/api/v1/cms/{plural}List records
GET/api/v1/cms/{plural}/{id}Get single record
POST/api/v1/cms/{plural}/createCreate record
POST/api/v1/cms/{plural}/{id}/updateUpdate record
POST/api/v1/cms/{plural}/{id}/deleteDelete record

Single Type

MethodRouteAction
GET/api/v1/cms/{singular}Get the single record (auto-creates on first request)
PUT/api/v1/cms/{singular}Update the single record

Admin Routes

Every content type also gets admin routes under /api/v1/admin/cms/:

MethodRouteAction
GET/api/v1/admin/cms/{plural}List all records (bypasses filters)
GET/api/v1/admin/cms/{plural}/{id}Get any record
POST/api/v1/admin/cms/{plural}Create record
PUT/api/v1/admin/cms/{plural}/{id}Update record
DELETE/api/v1/admin/cms/{plural}/{id}Delete record

Admin routes bypass filter and filter_auth rules, and always show private fields.

Access Control

Control who can access each endpoint in the TOML definition:

[content_type.api.list]
access = "public"
cache = true
filter = 'status = "published"'
fields = ["title", "cover", "price"]

[content_type.api.create]
access = "admin"

[content_type.api.update]
access = "admin"

[content_type.api.delete]
access = "admin"

Access Levels

LevelMeaning
noneFully denied — endpoint returns 403
publicNo authentication required
memberAny authenticated user
adminAdmin role required

Default Access

EndpointDefault
listpublic
getpublic
createmember
updatemember
deleteadmin

Endpoint Options

OptionTypeDescription
accessstringAccess level: none, public, member, admin
filterstringRule expression applied to all requests
filter_authstringAdditional filter ORed for authenticated users
cacheboolEnable server-side response caching
fieldsstring[]Whitelist of fields to return

Rule Engine

Filter data with expressions that compile to SQL WHERE clauses:

[content_type.api.list]
filter = 'status = "published" && price > 0'
filter_auth = 'created_by = @request.auth.id'

filter applies to all requests. filter_auth adds an OR condition for authenticated users. Combined logic: filter OR (is_authenticated AND filter_auth).

Operators

OperatorMeaningExample
=Equalstatus = "published"
!=Not equalstatus != "draft"
> >= < <=Comparisonprice > 0
~LIKE matchtitle ~ "%rust%"
!~NOT LIKEtitle !~ "%spam%"
&&ANDa = 1 && b = 2
||ORa = 1 || b = 2

Variables

VariableDescription
@request.auth.idCurrent authenticated user ID
@request.auth.roleCurrent user role
@request.body.*Request body field value
@request.query.*URL query parameter value
@nowCurrent timestamp

Special Syntax

SyntaxMeaningExample
field:issetField is not nullavatar:isset
field:length > NString / array length checktags:length > 0
nullNull literaldeleted_at = null
true / falseBoolean literalsis_free = false

Examples

# Only published items visible to public
filter = 'status = "published"'

# Published OR owned by the requesting user
filter = 'status = "published"'
filter_auth = 'created_by = @request.auth.id'

# Complex filter with grouping
filter = '(status = "published" && price > 0) || featured = true'

Query Parameters

GET /api/v1/cms/courses?page=2&page_size=10&sort=created_at:desc&status=published&include=instructor,tags
ParameterTypeDefaultDescription
pageint1Page number
page_sizeint20Items per page (max configurable)
sortstringSort: field:asc or field:desc, comma-separated for multiple
searchstringFull-text search term
includestringComma-separated relation fields to populate
skip_totalboolfalseSkip COUNT query, returns total: -1 for performance
{field}stringFilter by exact field value
__meta.{path}stringFilter by JSON metadata path

Pagination Response

{
  "items": [...],
  "total": 42,
  "page": 2,
  "page_size": 10
}

Sort Examples

# Single field
?sort=created_at:desc

# Multiple fields
?sort=status:asc,created_at:desc

Filter Examples

# Exact match
?status=published

# Multiple filters
?status=published&level=beginner

# Metadata filter (requires metaable protocol)
?__meta.featured=true

Response Caching

Enable caching per endpoint:

[content_type.api.list]
cache = true

Cached responses are stored in memory, keyed by query hash. The cache is automatically invalidated on any write operation (create, update, delete) for that content type.

Cache TTL is configurable via cms_cache_ttl_secs (default: 30 seconds).

Private Fields

Fields with private = true are excluded from public API responses:

[[fields]]
name = "internal_notes"
field_type = "text"
private = true
  • Public API (/api/v1/cms/): private fields are stripped from responses
  • Admin API (/api/v1/admin/cms/): private fields are always included

Error Responses

StatusMeaning
400Invalid request body or query parameters
401Authentication required
403Access denied (wrong role or access = "none")
404Record not found
409Conflict (optimistic lock mismatch — lockable protocol)
422Validation failed (field-level details in response body)

On this page