Collections
Collections store your data as items with defined properties. Each collection becomes a RESTful endpoint.
Naming
- Unique within the API
- Case-sensitive
- Allowed characters: letters, digits, hyphens, underscores
- The name becomes the endpoint path
https://eu.restapi.com/my-api/products
└── collection name
Renaming a collection changes its endpoint path.
Properties
Each collection can have up to 25 properties.
Property Rules
- Unique names within the collection
- Case-sensitive
- Allowed characters: letters, digits, underscores
- Must begin with a letter
Property Configuration
| Setting | Description |
|---|---|
| Name | Unique identifier for the property |
| Type | Data type (string, integer, decimal, etc.) |
| Required | If true, must be provided on create |
| Default | Value used when property is omitted |
| Validation | Min/max length or value constraints |
Data Types
| Type | Description |
|---|---|
string | Text, max 1024 characters |
integer | Whole numbers (-2,147,483,648 to 2,147,483,647) |
decimal | Decimal numbers |
boolean | true or false |
date | Date only (YYYY-MM-DD) |
date-time | Date and time in ISO 8601 format |
guid | Unique identifier (UUID format) |
blob | Binary data (files) |
object | Reference to another model |
Lookup Properties
Create relationships between collections:
{
"name": "customer",
"type": "lookup",
"target": "customers"
}
Access related data in queries or via the select parameter:
?select=orderDate,total,customer.name,customer.email
Self-Referencing Lookups
Collections can reference themselves, which is useful for hierarchical data structures:
{
"name": "categories",
"properties": [
{ "name": "name", "type": "string" },
{ "name": "parent", "type": "lookup", "target": "categories" }
]
}
Use cases:
- Category trees with parent/child relationships
- Organizational hierarchies
- Threaded comments
- File/folder structures
Validation
Required Fields
Required properties must be included in POST/PUT requests:
{ "name": "email", "type": "string", "required": true }
Missing required fields return 400 Bad Request.
String Constraints
Limit string length:
{
"name": "title",
"type": "string",
"minLength": 1,
"maxLength": 100
}
Numeric Constraints
Set value boundaries:
{
"name": "quantity",
"type": "integer",
"min": 0,
"max": 1000
}
Default Values
Provide defaults for optional properties:
{
"name": "status",
"type": "string",
"default": "pending"
}
Defaults apply to POST and PUT operations when the property is omitted.
Expression-Based Defaults
Use expressions for dynamic default values:
| Expression | Description |
|---|---|
now() | Current UTC date-time |
now() + 7D | 7 days from now |
now() - 1H | 1 hour ago |
newId() | Generate unique GUID |
10 + 5 | Numeric calculation |
Date/time tokens: now(), D (days), H (hours), M (minutes), S (seconds). Tokens are case-insensitive.
{
"name": "createdAt",
"type": "date-time",
"default": "now()"
}
{
"name": "dueDate",
"type": "date-time",
"default": "now() + 7D"
}
See Data Types for complete documentation on default value expressions.
Example Collection
{
"name": "products",
"properties": [
{ "name": "sku", "type": "string", "required": true },
{ "name": "name", "type": "string", "required": true, "maxLength": 200 },
{ "name": "description", "type": "string" },
{ "name": "price", "type": "decimal", "required": true, "min": 0 },
{ "name": "stock", "type": "integer", "default": 0, "min": 0 },
{ "name": "isActive", "type": "boolean", "default": true },
{ "name": "createdAt", "type": "date-time", "default": "now()" },
{ "name": "category", "type": "lookup", "target": "categories" },
{ "name": "image", "type": "blob" }
]
}