Speedy-API

Speedy Get API

create entity CRUD apis without writing a line of code

Get Operations

Get all resource

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
}

Filter via Key Field

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
}

Filter via Non Key Field

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
}

Filter with Multiple Fields

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
}

Paged Request

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
}

Ordered Request

order the request with different columns

[GET] /speedy/v1/User ? $orderByAsc = 'createdAt' & $orderByDesc = 'amount'

Response

{
    "payload": [
        // ordered request
        {
            ...
        },
        {
            ...
        }
    ],
    "pageSize": 2,
    "pageIndex": 0
}

Entity Expansion

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.


Select Fields

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.


Count Queries

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.


Page Size Limits

GET requests respect configurable page size limits:

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.


ETag / If-None-Match

A 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.