create entity CRUD apis without writing a line of code
retrieve all resource in a single resource type / entity
URL
[GET] /speedy/v1/User
Response
{
"payload": [
{
"lastLoginDate": null,
"id": "1a2b3c4d-5678-90ab-cdef-1234567890ab",
"name": "John Doe",
"updatedAt": "2024-02-28T15:00:00",
"email": "john.doe@example.com",
"loginCount": 0,
"type": "ADMIN",
"phoneNo": "9876543210",
"createdAt": "2024-02-28T12:00:00",
"deletedAt": null
},
{
"lastLoginDate": null,
"id": "2b3c4d5e-6789-01ab-cdef-2345678901bc",
"name": "Jane Smith",
"updatedAt": "2024-02-28T16:30:00",
"email": "jane.smith@example.com",
"loginCount": 0,
"type": "USER",
"phoneNo": "8765432109",
"createdAt": "2024-02-28T13:15:00",
"deletedAt": null
},
...
],
"pageIndex": 0,
"pageSize": 2,
"totalCount": 2,
"totalPages": 1
}
retrieve a single resource with primary key
URL
[GET] /speedy/v1/User?id=1a2b3c4d-5678-90ab-cdef-1234567890ab
Response
{
"payload": [
{
"lastLoginDate": null,
"id": "1a2b3c4d-5678-90ab-cdef-1234567890ab",
"name": "John Doe",
"updatedAt": "2024-02-28T15:00:00",
"email": "john.doe@example.com",
"loginCount": 0,
"type": "ADMIN",
"phoneNo": "9876543210",
"createdAt": "2024-02-28T12:00:00",
"deletedAt": null
}
],
"pageSize": 1,
"pageIndex": 0,
"totalCount": 1,
"totalPages": 1
}
retrieve multiple resource with filter with resource fields
URL
[GET] /speedy/v1/User ? type = "ADMIN"
get all admin users
Response
{
"payload": [
{
"lastLoginDate": null,
"id": "1a2b3c4d-5678-90ab-cdef-1234567890ab",
"name": "John Doe",
"updatedAt": "2024-02-28T15:00:00",
"email": "john.doe@example.com",
"loginCount": 0,
"type": "ADMIN",
"phoneNo": "9876543210",
"createdAt": "2024-02-28T12:00:00",
"deletedAt": null
}
],
"pageSize": 1,
"pageIndex": 0
}
retrieve multiple resource with filter with resource fields
URL
[GET] /speedy/v1/User ? type = "ADMIN" & name = "John Doe"
get all admin user with name John Doe
Response
{
"payload": [
{
"lastLoginDate": null,
"id": "1a2b3c4d-5678-90ab-cdef-1234567890ab",
"name": "John Doe",
"updatedAt": "2024-02-28T15:00:00",
"email": "john.doe@example.com",
"loginCount": 0,
"type": "ADMIN",
"phoneNo": "9876543210",
"createdAt": "2024-02-28T12:00:00",
"deletedAt": null
}
],
"pageSize": 1,
"pageIndex": 0
}
the paging the request
URL
[GET] /speedy/v1/User ? $pageSize = 100 & $pageNo = 0
[GET] /speedy/v1/User ? $pageSize = 10 & $pageNo = 2
Response
{
"payload": [
{
...
},
{
...
}
],
"pageSize": 2,
"pageIndex": 0
// page starts from 0 indexed
}
order the request with different columns
[GET] /speedy/v1/User ? $orderByAsc = 'createdAt' & $orderByDesc = 'amount'
Response
{
"payload": [
// ordered request
{
...
},
{
...
}
],
"pageSize": 2,
"pageIndex": 0
}
include related entities in your results using the $expand parameter
Simple Expansion
[GET] /speedy/v1/Inventory ? $expand = 'Product'
Multi-Level Expansion
[GET] /speedy/v1/Inventory ? $expand = 'Product' & $expand = 'Product.Category'
Complex Multi-Level Expansion
[GET] /speedy/v1/Inventory ? $expand = 'Product' & $expand = 'Product.Category' & $expand = 'Product.Category.Supplier' & $expand = 'Procurement' & $expand = 'Procurement.Product'
Response with Expanded Entities
{
"payload": [
{
"id": "inventory-1",
"quantity": 100,
"location": "Warehouse A",
"product": {
"id": "product-1",
"name": "Laptop",
"price": 999.99,
"category": {
"id": "category-1",
"name": "Electronics",
"supplier": {
"id": "supplier-1",
"name": "TechCorp"
}
}
},
"procurement": {
"id": "procurement-1",
"amount": 50000,
"product": {
"id": "product-1",
"name": "Laptop"
}
}
}
],
"pageSize": 1,
"pageIndex": 0
}
For detailed information about multi-level expansions, see Multi-Level Expansions.
Limit the response to specific fields using the $select parameter.
[GET] /speedy/v1/User ? $select=id,name,email,type
Response
{
"payload": [
{
"id": "1a2b3c4d-5678-90ab-cdef-1234567890ab",
"name": "John Doe",
"email": "john.doe@example.com",
"type": "ADMIN"
}
],
"pageIndex": 0,
"pageSize": 10,
"totalCount": 1,
"totalPages": 1
}
Only the fields listed in $select are included in the response payload. All other entity fields are omitted.
Performance note: When $select is specified, the database query fetches only the requested columns (plus primary
keys and required foreign keys) rather than SELECT *. This reduces database I/O, network transfer, and memory usage,
especially for entities with many columns or large text/blob fields.
Combining $select with $expand:
[GET] /speedy/v1/Inventory ? $select=id,quantity & $expand=Product
When $expand is also specified, the select applies to the root entity while expanded entities return all their fields.
Return only the entity count without loading records using $select=$count.
[GET] /speedy/v1/User ? $select=$count
Response
{
"count": 42
}
This executes a lightweight COUNT(*) query without fetching or serializing any entity data.
GET requests respect configurable page size limits:
$pageSize specified — the server uses its configured defaultPageSize, clamped to maxPageSize.$pageSize specified — the value must not exceed maxPageSize. If it does, the server responds with 400 Bad
Request.GET /speedy/v1/User ? $pageSize=5000
{
"status": 400,
"message": "Bad Request: page size exceeds maximum allowed",
"timestamp": "2026-05-29T12:00:00Z"
}
Configure the limits by implementing ISpeedyConfiguration.maxPageSize() and ISpeedyConfiguration.defaultPageSize()
in your application.
If-None-MatchA GET that resolves to a single row on an entity with a @SpeedyETag field carries an ETag
response header; a matching If-None-Match returns 304 Not Modified. See
Conditional Requests / ETags for the opt-in and full behavior.