Mock API
The live reference demo for vitepress-openapi-docs, backed by a mock server at api.rodin.dev/mock. OpenAPI 3.1, 107 operations across 15 tags, 34 webhooks, bearer auth, callbacks, oneOf, rich examples: everything the plugin renders, rendered here.
Pick any operation from the sidebar and hit Try-It — the request goes to the real origin, CORS is open, you get real JSON back. The spec is fetched at build time so this page mirrors the live contract.
albums
GET/albums
List all albums
Paginated list of albums. Supports filtering, range operators (`_gte`, `_lte`, `_gt`, `_lt`, `_ne`, `_like`), full-text search, sorting, field selection, and relation expansion.
Parameters 12
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsAlbum
Response examples
200Paginated array of albums
[
{
"id": 1,
"userId": 1,
"title": "Abstract",
"description": "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"coverImage": "https://picsum.photos/seed/album1/600/400",
"photoCount": 39,
"isPublic": true,
"createdAt": "2024-07-02T09:01:49.954Z"
}
]429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}POST/albums
Create album
Create a new album. Fields `id`, `createdAt`, `updatedAt` are auto-generated. Triggers `albums.created` webhook.
ReturnsAlbum
AcceptsAlbumInput
Response examples
201Album created
{
"id": 1,
"userId": 1,
"title": "Abstract",
"description": "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"coverImage": "https://picsum.photos/seed/album1/600/400",
"photoCount": 39,
"isPublic": true,
"createdAt": "2024-07-02T09:01:49.954Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}413413 — body exceeds 64 KB
{
"error": {
"status": 413,
"message": "Request body too large",
"details": {
"maxSize": "64 KB"
}
}
}429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}GET/albums/{id}
Get album by ID
Retrieve a single album. Supports ETag conditional requests via `If-None-Match`.
Parameters 4
| Name | Type | Description |
|---|---|---|
_fields | query · string | Sparse fieldset — comma-separated fields to return. Leave blank for the full object. |
_expand | query · string | Expand parent relations inline. Applies only when the resource has a matching parent (e.g. `user` on posts). |
_embed | query · string | Embed child collections. Applies only when the resource has a matching child (e.g. `comments` on posts). |
ReturnsAlbum
Response examples
200The album
{
"id": 1,
"userId": 1,
"title": "Abstract",
"description": "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"coverImage": "https://picsum.photos/seed/album1/600/400",
"photoCount": 39,
"isPublic": true,
"createdAt": "2024-07-02T09:01:49.954Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PUT/albums/{id}
Replace album
Full replacement. All mutable fields overwritten. Triggers `albums.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsAlbum
AcceptsAlbumInput
Response examples
200Album replaced
{
"id": 1,
"userId": 1,
"title": "Abstract",
"description": "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"coverImage": "https://picsum.photos/seed/album1/600/400",
"photoCount": 39,
"isPublic": true,
"createdAt": "2024-07-02T09:01:49.954Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PATCH/albums/{id}
Partially update album
Partial update — only provided fields change. Triggers `albums.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsAlbum
AcceptsAlbumInput
Response examples
200Album updated
{
"id": 1,
"userId": 1,
"title": "Abstract",
"description": "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"coverImage": "https://picsum.photos/seed/album1/600/400",
"photoCount": 39,
"isPublic": true,
"createdAt": "2024-07-02T09:01:49.954Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}DELETE/albums/{id}
Delete album
Permanently remove a album. Returns deleted resource. Triggers `albums.deleted` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsAlbum
Response examples
200Deleted album
{
"id": 1,
"userId": 1,
"title": "Abstract",
"description": "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"coverImage": "https://picsum.photos/seed/album1/600/400",
"photoCount": 39,
"isPublic": true,
"createdAt": "2024-07-02T09:01:49.954Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}GET/albums/{id}/photos
List album's photos
Retrieve album's photos. Same filtering, sorting, and pagination as `/photos`.
Parameters 13
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsPhoto
Response examples
200Array of photos
[
{
"id": 1,
"albumId": 1,
"title": "Photo 1",
"url": "https://picsum.photos/seed/1/800/960",
"thumbnailUrl": "https://picsum.photos/seed/1/150/150",
"width": 800,
"height": 960,
"size": 4803273,
"format": "jpeg",
"createdAt": "2026-07-24T20:47:13.121Z"
}
]404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}auth
GET/auth/basic-demo
HTTP Basic demo
Demonstrates HTTP Basic — intentionally present so API docs generators can render the Basic auth block. Any credentials accepted. Echoes the username back so you can confirm the header reached the server.
ReturnsBasicDemoResponse
Response examples
200Authenticated with Basic
{
"authenticated": true,
"scheme": "basic"
}401401 — missing or expired Bearer token
{
"error": {
"status": 401,
"message": "Authentication required"
}
}POST/auth/login
Log in
Authenticate with email/password. **Mock: any password works for any seeded email.** The demo account `demo@example.com` is always present and carries admin role — use it for docs Try-It. Token valid 1 hour.
ReturnsAuthResponse
AcceptsAuthCredentials
Response examples
200Logged in
{
"user": {
"id": 1,
"firstName": "Demo",
"lastName": "User",
"email": "demo@example.com",
"username": "demo",
"avatar": "https://i.pravatar.cc/150?u=demo",
"phone": "+1-555-000-0001",
"address": {
"street": "1 Demo Way",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"country": "US",
"geo": {
"lat": 30.2672,
"lng": -97.7431
}
},
"company": {
"name": "Demo Corp",
"catchPhrase": "Seeded for docs and testing."
},
"website": "https://example.com/demo",
"role": "admin",
"age": 30,
"bio": "Seeded demo account. Log in with any password.",
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2026-04-21T00:00:00.000Z"
},
"token": "string",
"expiresAt": "2024-01-15T09:30:00Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}401401 — missing or expired Bearer token
{
"error": {
"status": 401,
"message": "Authentication required"
}
}POST/auth/logout
Log out
Revoke the Bearer token.
Response examples
200Logged out
{
"message": "Logged out"
}GET/auth/me
Get current user
Returns profile for the provided Bearer token.
ReturnsUser
Response examples
200User profile
{
"id": 1,
"firstName": "Demo",
"lastName": "User",
"email": "demo@example.com",
"username": "demo",
"avatar": "https://i.pravatar.cc/150?u=demo",
"phone": "+1-555-000-0001",
"address": {
"street": "1 Demo Way",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"country": "US",
"geo": {
"lat": 30.2672,
"lng": -97.7431
}
},
"company": {
"name": "Demo Corp",
"catchPhrase": "Seeded for docs and testing."
},
"website": "https://example.com/demo",
"role": "admin",
"age": 30,
"bio": "Seeded demo account. Log in with any password.",
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2026-04-21T00:00:00.000Z"
}401401 — missing or expired Bearer token
{
"error": {
"status": 401,
"message": "Authentication required"
}
}POST/auth/refresh
Refresh token
Exchange valid token for new one. Old token revoked.
ReturnsTokenResponse
Response examples
200New token
{
"token": "string",
"expiresAt": "2024-01-15T09:30:00Z"
}401401 — missing or expired Bearer token
{
"error": {
"status": 401,
"message": "Authentication required"
}
}POST/auth/register
Register new user
Create account and receive token. Returns 409 if email exists.
ReturnsAuthResponse
AcceptsAuthCredentials
Response examples
201Registered
{
"user": {
"id": 1,
"firstName": "Demo",
"lastName": "User",
"email": "demo@example.com",
"username": "demo",
"avatar": "https://i.pravatar.cc/150?u=demo",
"phone": "+1-555-000-0001",
"address": {
"street": "1 Demo Way",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"country": "US",
"geo": {
"lat": 30.2672,
"lng": -97.7431
}
},
"company": {
"name": "Demo Corp",
"catchPhrase": "Seeded for docs and testing."
},
"website": "https://example.com/demo",
"role": "admin",
"age": 30,
"bio": "Seeded demo account. Log in with any password.",
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2026-04-21T00:00:00.000Z"
},
"token": "string",
"expiresAt": "2024-01-15T09:30:00Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}409409 — duplicate resource
{
"error": {
"status": 409,
"message": "Email already registered"
}
}categories
GET/categories
List all categories
Paginated list of categories. Supports filtering, range operators (`_gte`, `_lte`, `_gt`, `_lt`, `_ne`, `_like`), full-text search, sorting, field selection, and relation expansion.
Parameters 12
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsCategory
Response examples
200Paginated array of categories
[
{
"id": 1,
"name": "Electronics",
"slug": "electronics",
"description": "Gadgets, devices, and electronic accessories",
"image": "https://picsum.photos/seed/cat1/300/200",
"productCount": 5,
"createdAt": "2022-01-06T04:19:58.076Z"
}
]429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}POST/categories
Create category
Create a new category. Fields `id`, `createdAt`, `updatedAt` are auto-generated. Triggers `categories.created` webhook.
ReturnsCategory
AcceptsCategoryInput
Response examples
201Category created
{
"id": 1,
"name": "Electronics",
"slug": "electronics",
"description": "Gadgets, devices, and electronic accessories",
"image": "https://picsum.photos/seed/cat1/300/200",
"productCount": 5,
"createdAt": "2022-01-06T04:19:58.076Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}413413 — body exceeds 64 KB
{
"error": {
"status": 413,
"message": "Request body too large",
"details": {
"maxSize": "64 KB"
}
}
}429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}GET/categories/{id}
Get category by ID
Retrieve a single category. Supports ETag conditional requests via `If-None-Match`.
Parameters 4
| Name | Type | Description |
|---|---|---|
_fields | query · string | Sparse fieldset — comma-separated fields to return. Leave blank for the full object. |
_expand | query · string | Expand parent relations inline. Applies only when the resource has a matching parent (e.g. `user` on posts). |
_embed | query · string | Embed child collections. Applies only when the resource has a matching child (e.g. `comments` on posts). |
ReturnsCategory
Response examples
200The category
{
"id": 1,
"name": "Electronics",
"slug": "electronics",
"description": "Gadgets, devices, and electronic accessories",
"image": "https://picsum.photos/seed/cat1/300/200",
"productCount": 5,
"createdAt": "2022-01-06T04:19:58.076Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PUT/categories/{id}
Replace category
Full replacement. All mutable fields overwritten. Triggers `categories.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsCategory
AcceptsCategoryInput
Response examples
200Category replaced
{
"id": 1,
"name": "Electronics",
"slug": "electronics",
"description": "Gadgets, devices, and electronic accessories",
"image": "https://picsum.photos/seed/cat1/300/200",
"productCount": 5,
"createdAt": "2022-01-06T04:19:58.076Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PATCH/categories/{id}
Partially update category
Partial update — only provided fields change. Triggers `categories.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsCategory
AcceptsCategoryInput
Response examples
200Category updated
{
"id": 1,
"name": "Electronics",
"slug": "electronics",
"description": "Gadgets, devices, and electronic accessories",
"image": "https://picsum.photos/seed/cat1/300/200",
"productCount": 5,
"createdAt": "2022-01-06T04:19:58.076Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}DELETE/categories/{id}
Delete category
Permanently remove a category. Returns deleted resource. Triggers `categories.deleted` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsCategory
Response examples
200Deleted category
{
"id": 1,
"name": "Electronics",
"slug": "electronics",
"description": "Gadgets, devices, and electronic accessories",
"image": "https://picsum.photos/seed/cat1/300/200",
"productCount": 5,
"createdAt": "2022-01-06T04:19:58.076Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}GET/categories/{id}/products
List category's products
Retrieve category's products. Same filtering, sorting, and pagination as `/products`.
Parameters 13
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsProduct
Response examples
200Array of products
[
{
"id": 1,
"categoryId": 4,
"name": "Desk Lamp",
"description": "Ultra-fast connectivity with rock-solid reliability.",
"price": 161.28,
"originalPrice": 231.38,
"currency": "USD",
"stock": 257,
"sku": "SKU-00001",
"rating": 4.4,
"reviewCount": 188,
"image": "https://picsum.photos/seed/prod1/400/400",
"images": [
"https://picsum.photos/seed/prod1-0/400/400",
"https://picsum.photos/seed/prod1-1/400/400",
"https://picsum.photos/seed/prod1-2/400/400",
"https://picsum.photos/seed/prod1-3/400/400",
"https://picsum.photos/seed/prod1-4/400/400"
],
"weight": 9.19,
"dimensions": {
"width": 33.4,
"height": 40,
"depth": 14.6
},
"isAvailable": true,
"isFeatured": false,
"tags": [
"backend"
],
"createdAt": "2024-05-30T01:37:26.059Z",
"updatedAt": "2026-12-15T02:55:19.943Z"
}
]404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}comments
GET/comments
List all comments
Paginated list of comments. Supports filtering, range operators (`_gte`, `_lte`, `_gt`, `_lt`, `_ne`, `_like`), full-text search, sorting, field selection, and relation expansion.
Parameters 12
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsComment
Response examples
200Paginated array of comments
[
{
"id": 1,
"postId": 1,
"userId": 1,
"body": "How does this compare to the approach described in the official docs?",
"likes": 16,
"createdAt": "2023-04-28T06:59:47.906Z"
}
]429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}POST/comments
Create comment
Create a new comment. Fields `id`, `createdAt`, `updatedAt` are auto-generated. Triggers `comments.created` webhook.
ReturnsComment
AcceptsCommentInput
Response examples
201Comment created
{
"id": 1,
"postId": 1,
"userId": 1,
"body": "How does this compare to the approach described in the official docs?",
"likes": 16,
"createdAt": "2023-04-28T06:59:47.906Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}413413 — body exceeds 64 KB
{
"error": {
"status": 413,
"message": "Request body too large",
"details": {
"maxSize": "64 KB"
}
}
}429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}GET/comments/{id}
Get comment by ID
Retrieve a single comment. Supports ETag conditional requests via `If-None-Match`.
Parameters 4
| Name | Type | Description |
|---|---|---|
_fields | query · string | Sparse fieldset — comma-separated fields to return. Leave blank for the full object. |
_expand | query · string | Expand parent relations inline. Applies only when the resource has a matching parent (e.g. `user` on posts). |
_embed | query · string | Embed child collections. Applies only when the resource has a matching child (e.g. `comments` on posts). |
ReturnsComment
Response examples
200The comment
{
"id": 1,
"postId": 1,
"userId": 1,
"body": "How does this compare to the approach described in the official docs?",
"likes": 16,
"createdAt": "2023-04-28T06:59:47.906Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PUT/comments/{id}
Replace comment
Full replacement. All mutable fields overwritten. Triggers `comments.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsComment
AcceptsCommentInput
Response examples
200Comment replaced
{
"id": 1,
"postId": 1,
"userId": 1,
"body": "How does this compare to the approach described in the official docs?",
"likes": 16,
"createdAt": "2023-04-28T06:59:47.906Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PATCH/comments/{id}
Partially update comment
Partial update — only provided fields change. Triggers `comments.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsComment
AcceptsCommentInput
Response examples
200Comment updated
{
"id": 1,
"postId": 1,
"userId": 1,
"body": "How does this compare to the approach described in the official docs?",
"likes": 16,
"createdAt": "2023-04-28T06:59:47.906Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}DELETE/comments/{id}
Delete comment
Permanently remove a comment. Returns deleted resource. Triggers `comments.deleted` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsComment
Response examples
200Deleted comment
{
"id": 1,
"postId": 1,
"userId": 1,
"body": "How does this compare to the approach described in the official docs?",
"likes": 16,
"createdAt": "2023-04-28T06:59:47.906Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}database
GET/admin/report
Admin aggregate report
Read-only snapshot of record counts, active webhooks, and token count. Accepts either Bearer or Basic — the auth block in docs should show both alternatives.
ReturnsAdminReport
Response examples
200Report payload
{
"generatedAt": "2024-01-15T09:30:00Z",
"scheme": "bearer",
"totals": {}
}401401 — missing or expired Bearer token
{
"error": {
"status": 401,
"message": "Authentication required"
}
}GET/db/export
Export database
Full database as JSON. May be large.
Response examples
200Full dump
{}POST/db/reset
Reset database
Regenerate all data, clear tokens/webhooks/deliveries.
POST/db/seed
Re-seed database
Regenerate with custom counts.
AcceptsSeedRequest
GET/db/stats
Database stats
ReturnsDbStats
Response examples
200Statistics
{
"counts": {},
"webhooks": 0,
"deliveries": 0,
"tokens": 0
}GET/openapi.json
OpenAPI spec
notifications
GET/notifications
List all notifications
Paginated list of notifications. Supports filtering, range operators (`_gte`, `_lte`, `_gt`, `_lt`, `_ne`, `_like`), full-text search, sorting, field selection, and relation expansion.
Parameters 12
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsNotification
Response examples
200Paginated array of notifications
[
{
"id": 1,
"userId": 1,
"type": "error",
"title": "Error notification",
"message": "New follower on your profile.",
"read": true,
"link": null,
"createdAt": "2026-03-23T15:22:15.402Z"
}
]429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}POST/notifications
Create notification
Create a new notification. Fields `id`, `createdAt`, `updatedAt` are auto-generated. Triggers `notifications.created` webhook.
ReturnsNotification
AcceptsNotificationInput
Response examples
201Notification created
{
"id": 1,
"userId": 1,
"type": "error",
"title": "Error notification",
"message": "New follower on your profile.",
"read": true,
"link": null,
"createdAt": "2026-03-23T15:22:15.402Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}413413 — body exceeds 64 KB
{
"error": {
"status": 413,
"message": "Request body too large",
"details": {
"maxSize": "64 KB"
}
}
}429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}GET/notifications/{id}
Get notification by ID
Retrieve a single notification. Supports ETag conditional requests via `If-None-Match`.
Parameters 4
| Name | Type | Description |
|---|---|---|
_fields | query · string | Sparse fieldset — comma-separated fields to return. Leave blank for the full object. |
_expand | query · string | Expand parent relations inline. Applies only when the resource has a matching parent (e.g. `user` on posts). |
_embed | query · string | Embed child collections. Applies only when the resource has a matching child (e.g. `comments` on posts). |
ReturnsNotification
Response examples
200The notification
{
"id": 1,
"userId": 1,
"type": "error",
"title": "Error notification",
"message": "New follower on your profile.",
"read": true,
"link": null,
"createdAt": "2026-03-23T15:22:15.402Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PUT/notifications/{id}
Replace notification
Full replacement. All mutable fields overwritten. Triggers `notifications.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsNotification
AcceptsNotificationInput
Response examples
200Notification replaced
{
"id": 1,
"userId": 1,
"type": "error",
"title": "Error notification",
"message": "New follower on your profile.",
"read": true,
"link": null,
"createdAt": "2026-03-23T15:22:15.402Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PATCH/notifications/{id}
Partially update notification
Partial update — only provided fields change. Triggers `notifications.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsNotification
AcceptsNotificationInput
Response examples
200Notification updated
{
"id": 1,
"userId": 1,
"type": "error",
"title": "Error notification",
"message": "New follower on your profile.",
"read": true,
"link": null,
"createdAt": "2026-03-23T15:22:15.402Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}DELETE/notifications/{id}
Delete notification
Permanently remove a notification. Returns deleted resource. Triggers `notifications.deleted` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsNotification
Response examples
200Deleted notification
{
"id": 1,
"userId": 1,
"type": "error",
"title": "Error notification",
"message": "New follower on your profile.",
"read": true,
"link": null,
"createdAt": "2026-03-23T15:22:15.402Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}orders
GET/orders
List all orders
Paginated list of orders. Supports filtering, range operators (`_gte`, `_lte`, `_gt`, `_lt`, `_ne`, `_like`), full-text search, sorting, field selection, and relation expansion.
Parameters 12
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsOrder
Response examples
200Paginated array of orders
[
{
"id": 1,
"userId": 1,
"items": [
{
"productId": 37,
"quantity": 2,
"price": 416.97
},
{
"productId": 16,
"quantity": 2,
"price": 478.87
}
],
"subtotal": 1791.68,
"tax": 143.33,
"shipping": 0,
"total": 1935.01,
"currency": "USD",
"status": "pending",
"paymentMethod": "credit_card",
"shippingAddress": {
"street": "6620 Maple Dr",
"city": "Fort Worth",
"state": "MI",
"zipCode": "16372",
"country": "US"
},
"trackingNumber": "TRK442765071",
"notes": null,
"createdAt": "2026-04-19T12:16:46.226Z",
"updatedAt": "2025-01-30T04:10:54.855Z"
}
]429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}POST/orders
Create order
Create a new order. Fields `id`, `createdAt`, `updatedAt` are auto-generated. Triggers `orders.created` webhook.
ReturnsOrder
AcceptsOrderInput
Response examples
201Order created
{
"id": 1,
"userId": 1,
"items": [
{
"productId": 37,
"quantity": 2,
"price": 416.97
},
{
"productId": 16,
"quantity": 2,
"price": 478.87
}
],
"subtotal": 1791.68,
"tax": 143.33,
"shipping": 0,
"total": 1935.01,
"currency": "USD",
"status": "pending",
"paymentMethod": "credit_card",
"shippingAddress": {
"street": "6620 Maple Dr",
"city": "Fort Worth",
"state": "MI",
"zipCode": "16372",
"country": "US"
},
"trackingNumber": "TRK442765071",
"notes": null,
"createdAt": "2026-04-19T12:16:46.226Z",
"updatedAt": "2025-01-30T04:10:54.855Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}413413 — body exceeds 64 KB
{
"error": {
"status": 413,
"message": "Request body too large",
"details": {
"maxSize": "64 KB"
}
}
}429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}GET/orders/{id}
Get order by ID
Retrieve a single order. Supports ETag conditional requests via `If-None-Match`.
Parameters 4
| Name | Type | Description |
|---|---|---|
_fields | query · string | Sparse fieldset — comma-separated fields to return. Leave blank for the full object. |
_expand | query · string | Expand parent relations inline. Applies only when the resource has a matching parent (e.g. `user` on posts). |
_embed | query · string | Embed child collections. Applies only when the resource has a matching child (e.g. `comments` on posts). |
ReturnsOrder
Response examples
200The order
{
"id": 1,
"userId": 1,
"items": [
{
"productId": 37,
"quantity": 2,
"price": 416.97
},
{
"productId": 16,
"quantity": 2,
"price": 478.87
}
],
"subtotal": 1791.68,
"tax": 143.33,
"shipping": 0,
"total": 1935.01,
"currency": "USD",
"status": "pending",
"paymentMethod": "credit_card",
"shippingAddress": {
"street": "6620 Maple Dr",
"city": "Fort Worth",
"state": "MI",
"zipCode": "16372",
"country": "US"
},
"trackingNumber": "TRK442765071",
"notes": null,
"createdAt": "2026-04-19T12:16:46.226Z",
"updatedAt": "2025-01-30T04:10:54.855Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PUT/orders/{id}
Replace order
Full replacement. All mutable fields overwritten. Triggers `orders.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsOrder
AcceptsOrderInput
Response examples
200Order replaced
{
"id": 1,
"userId": 1,
"items": [
{
"productId": 37,
"quantity": 2,
"price": 416.97
},
{
"productId": 16,
"quantity": 2,
"price": 478.87
}
],
"subtotal": 1791.68,
"tax": 143.33,
"shipping": 0,
"total": 1935.01,
"currency": "USD",
"status": "pending",
"paymentMethod": "credit_card",
"shippingAddress": {
"street": "6620 Maple Dr",
"city": "Fort Worth",
"state": "MI",
"zipCode": "16372",
"country": "US"
},
"trackingNumber": "TRK442765071",
"notes": null,
"createdAt": "2026-04-19T12:16:46.226Z",
"updatedAt": "2025-01-30T04:10:54.855Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PATCH/orders/{id}
Partially update order
Partial update — only provided fields change. Triggers `orders.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsOrder
AcceptsOrderInput
Response examples
200Order updated
{
"id": 1,
"userId": 1,
"items": [
{
"productId": 37,
"quantity": 2,
"price": 416.97
},
{
"productId": 16,
"quantity": 2,
"price": 478.87
}
],
"subtotal": 1791.68,
"tax": 143.33,
"shipping": 0,
"total": 1935.01,
"currency": "USD",
"status": "pending",
"paymentMethod": "credit_card",
"shippingAddress": {
"street": "6620 Maple Dr",
"city": "Fort Worth",
"state": "MI",
"zipCode": "16372",
"country": "US"
},
"trackingNumber": "TRK442765071",
"notes": null,
"createdAt": "2026-04-19T12:16:46.226Z",
"updatedAt": "2025-01-30T04:10:54.855Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}DELETE/orders/{id}
Delete order
Permanently remove a order. Returns deleted resource. Triggers `orders.deleted` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsOrder
Response examples
200Deleted order
{
"id": 1,
"userId": 1,
"items": [
{
"productId": 37,
"quantity": 2,
"price": 416.97
},
{
"productId": 16,
"quantity": 2,
"price": 478.87
}
],
"subtotal": 1791.68,
"tax": 143.33,
"shipping": 0,
"total": 1935.01,
"currency": "USD",
"status": "pending",
"paymentMethod": "credit_card",
"shippingAddress": {
"street": "6620 Maple Dr",
"city": "Fort Worth",
"state": "MI",
"zipCode": "16372",
"country": "US"
},
"trackingNumber": "TRK442765071",
"notes": null,
"createdAt": "2026-04-19T12:16:46.226Z",
"updatedAt": "2025-01-30T04:10:54.855Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}photos
GET/photos
List all photos
Paginated list of photos. Supports filtering, range operators (`_gte`, `_lte`, `_gt`, `_lt`, `_ne`, `_like`), full-text search, sorting, field selection, and relation expansion.
Parameters 12
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsPhoto
Response examples
200Paginated array of photos
[
{
"id": 1,
"albumId": 1,
"title": "Photo 1",
"url": "https://picsum.photos/seed/1/800/960",
"thumbnailUrl": "https://picsum.photos/seed/1/150/150",
"width": 800,
"height": 960,
"size": 4803273,
"format": "jpeg",
"createdAt": "2026-07-24T20:47:13.121Z"
}
]429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}POST/photos
Create photo
Create a new photo. Fields `id`, `createdAt`, `updatedAt` are auto-generated. Triggers `photos.created` webhook.
ReturnsPhoto
AcceptsPhotoInput
Response examples
201Photo created
{
"id": 1,
"albumId": 1,
"title": "Photo 1",
"url": "https://picsum.photos/seed/1/800/960",
"thumbnailUrl": "https://picsum.photos/seed/1/150/150",
"width": 800,
"height": 960,
"size": 4803273,
"format": "jpeg",
"createdAt": "2026-07-24T20:47:13.121Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}413413 — body exceeds 64 KB
{
"error": {
"status": 413,
"message": "Request body too large",
"details": {
"maxSize": "64 KB"
}
}
}429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}GET/photos/{id}
Get photo by ID
Retrieve a single photo. Supports ETag conditional requests via `If-None-Match`.
Parameters 4
| Name | Type | Description |
|---|---|---|
_fields | query · string | Sparse fieldset — comma-separated fields to return. Leave blank for the full object. |
_expand | query · string | Expand parent relations inline. Applies only when the resource has a matching parent (e.g. `user` on posts). |
_embed | query · string | Embed child collections. Applies only when the resource has a matching child (e.g. `comments` on posts). |
ReturnsPhoto
Response examples
200The photo
{
"id": 1,
"albumId": 1,
"title": "Photo 1",
"url": "https://picsum.photos/seed/1/800/960",
"thumbnailUrl": "https://picsum.photos/seed/1/150/150",
"width": 800,
"height": 960,
"size": 4803273,
"format": "jpeg",
"createdAt": "2026-07-24T20:47:13.121Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PUT/photos/{id}
Replace photo
Full replacement. All mutable fields overwritten. Triggers `photos.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsPhoto
AcceptsPhotoInput
Response examples
200Photo replaced
{
"id": 1,
"albumId": 1,
"title": "Photo 1",
"url": "https://picsum.photos/seed/1/800/960",
"thumbnailUrl": "https://picsum.photos/seed/1/150/150",
"width": 800,
"height": 960,
"size": 4803273,
"format": "jpeg",
"createdAt": "2026-07-24T20:47:13.121Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PATCH/photos/{id}
Partially update photo
Partial update — only provided fields change. Triggers `photos.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsPhoto
AcceptsPhotoInput
Response examples
200Photo updated
{
"id": 1,
"albumId": 1,
"title": "Photo 1",
"url": "https://picsum.photos/seed/1/800/960",
"thumbnailUrl": "https://picsum.photos/seed/1/150/150",
"width": 800,
"height": 960,
"size": 4803273,
"format": "jpeg",
"createdAt": "2026-07-24T20:47:13.121Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}DELETE/photos/{id}
Delete photo
Permanently remove a photo. Returns deleted resource. Triggers `photos.deleted` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsPhoto
Response examples
200Deleted photo
{
"id": 1,
"albumId": 1,
"title": "Photo 1",
"url": "https://picsum.photos/seed/1/800/960",
"thumbnailUrl": "https://picsum.photos/seed/1/150/150",
"width": 800,
"height": 960,
"size": 4803273,
"format": "jpeg",
"createdAt": "2026-07-24T20:47:13.121Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}posts
GET/posts
List all posts
Paginated list of posts. Supports filtering, range operators (`_gte`, `_lte`, `_gt`, `_lt`, `_ne`, `_like`), full-text search, sorting, field selection, and relation expansion.
Parameters 12
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsPost
Response examples
200Paginated array of posts
[
{
"id": 1,
"userId": 1,
"title": "Performance Optimization Tips",
"slug": "web-security-fundamentals",
"body": "Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio.\n\nCurabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra.",
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliq...",
"tags": [
"ux"
],
"status": "published",
"views": 16848,
"likes": 28,
"featured": false,
"coverImage": "https://picsum.photos/seed/1/800/400",
"readingTime": 7,
"createdAt": "2026-01-21T19:36:04.116Z",
"updatedAt": "2026-01-21T19:36:04.116Z"
}
]429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}POST/posts
Create post
Create a new post. Fields `id`, `createdAt`, `updatedAt` are auto-generated. Triggers `posts.created` webhook.
ReturnsPost
AcceptsPostInput
Response examples
201Post created
{
"id": 1,
"userId": 1,
"title": "Performance Optimization Tips",
"slug": "web-security-fundamentals",
"body": "Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio.\n\nCurabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra.",
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliq...",
"tags": [
"ux"
],
"status": "published",
"views": 16848,
"likes": 28,
"featured": false,
"coverImage": "https://picsum.photos/seed/1/800/400",
"readingTime": 7,
"createdAt": "2026-01-21T19:36:04.116Z",
"updatedAt": "2026-01-21T19:36:04.116Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}413413 — body exceeds 64 KB
{
"error": {
"status": 413,
"message": "Request body too large",
"details": {
"maxSize": "64 KB"
}
}
}429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}GET/posts/{id}
Get post by ID
Retrieve a single post. Supports ETag conditional requests via `If-None-Match`.
Parameters 4
| Name | Type | Description |
|---|---|---|
_fields | query · string | Sparse fieldset — comma-separated fields to return. Leave blank for the full object. |
_expand | query · string | Expand parent relations inline. Applies only when the resource has a matching parent (e.g. `user` on posts). |
_embed | query · string | Embed child collections. Applies only when the resource has a matching child (e.g. `comments` on posts). |
ReturnsPost
Response examples
200The post
{
"id": 1,
"userId": 1,
"title": "Performance Optimization Tips",
"slug": "web-security-fundamentals",
"body": "Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio.\n\nCurabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra.",
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliq...",
"tags": [
"ux"
],
"status": "published",
"views": 16848,
"likes": 28,
"featured": false,
"coverImage": "https://picsum.photos/seed/1/800/400",
"readingTime": 7,
"createdAt": "2026-01-21T19:36:04.116Z",
"updatedAt": "2026-01-21T19:36:04.116Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PUT/posts/{id}deprecated
Replace post
Full replacement. All mutable fields overwritten. Triggers `posts.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsPost
AcceptsPostInput
Response examples
200Post replaced
{
"id": 1,
"userId": 1,
"title": "Performance Optimization Tips",
"slug": "web-security-fundamentals",
"body": "Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio.\n\nCurabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra.",
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliq...",
"tags": [
"ux"
],
"status": "published",
"views": 16848,
"likes": 28,
"featured": false,
"coverImage": "https://picsum.photos/seed/1/800/400",
"readingTime": 7,
"createdAt": "2026-01-21T19:36:04.116Z",
"updatedAt": "2026-01-21T19:36:04.116Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PATCH/posts/{id}
Partially update post
Partial update — only provided fields change. Triggers `posts.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsPost
AcceptsPostInput
Response examples
200Post updated
{
"id": 1,
"userId": 1,
"title": "Performance Optimization Tips",
"slug": "web-security-fundamentals",
"body": "Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio.\n\nCurabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra.",
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliq...",
"tags": [
"ux"
],
"status": "published",
"views": 16848,
"likes": 28,
"featured": false,
"coverImage": "https://picsum.photos/seed/1/800/400",
"readingTime": 7,
"createdAt": "2026-01-21T19:36:04.116Z",
"updatedAt": "2026-01-21T19:36:04.116Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}DELETE/posts/{id}
Delete post
Permanently remove a post. Returns deleted resource. Triggers `posts.deleted` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsPost
Response examples
200Deleted post
{
"id": 1,
"userId": 1,
"title": "Performance Optimization Tips",
"slug": "web-security-fundamentals",
"body": "Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio.\n\nCurabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra.",
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliq...",
"tags": [
"ux"
],
"status": "published",
"views": 16848,
"likes": 28,
"featured": false,
"coverImage": "https://picsum.photos/seed/1/800/400",
"readingTime": 7,
"createdAt": "2026-01-21T19:36:04.116Z",
"updatedAt": "2026-01-21T19:36:04.116Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}GET/posts/{id}/comments
List post's comments
Retrieve post's comments. Same filtering, sorting, and pagination as `/comments`.
Parameters 13
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsComment
Response examples
200Array of comments
[
{
"id": 1,
"postId": 1,
"userId": 1,
"body": "How does this compare to the approach described in the official docs?",
"likes": 16,
"createdAt": "2023-04-28T06:59:47.906Z"
}
]404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}products
GET/products
List all products
Paginated list of products. Supports filtering, range operators (`_gte`, `_lte`, `_gt`, `_lt`, `_ne`, `_like`), full-text search, sorting, field selection, and relation expansion.
Parameters 12
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsProduct
Response examples
200Paginated array of products
[
{
"id": 1,
"categoryId": 4,
"name": "Desk Lamp",
"description": "Ultra-fast connectivity with rock-solid reliability.",
"price": 161.28,
"originalPrice": 231.38,
"currency": "USD",
"stock": 257,
"sku": "SKU-00001",
"rating": 4.4,
"reviewCount": 188,
"image": "https://picsum.photos/seed/prod1/400/400",
"images": [
"https://picsum.photos/seed/prod1-0/400/400",
"https://picsum.photos/seed/prod1-1/400/400",
"https://picsum.photos/seed/prod1-2/400/400",
"https://picsum.photos/seed/prod1-3/400/400",
"https://picsum.photos/seed/prod1-4/400/400"
],
"weight": 9.19,
"dimensions": {
"width": 33.4,
"height": 40,
"depth": 14.6
},
"isAvailable": true,
"isFeatured": false,
"tags": [
"backend"
],
"createdAt": "2024-05-30T01:37:26.059Z",
"updatedAt": "2026-12-15T02:55:19.943Z"
}
]429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}POST/products
Create product
Create a new product. Fields `id`, `createdAt`, `updatedAt` are auto-generated. Triggers `products.created` webhook.
ReturnsProduct
AcceptsProductInput
Response examples
201Product created
{
"id": 1,
"categoryId": 4,
"name": "Desk Lamp",
"description": "Ultra-fast connectivity with rock-solid reliability.",
"price": 161.28,
"originalPrice": 231.38,
"currency": "USD",
"stock": 257,
"sku": "SKU-00001",
"rating": 4.4,
"reviewCount": 188,
"image": "https://picsum.photos/seed/prod1/400/400",
"images": [
"https://picsum.photos/seed/prod1-0/400/400",
"https://picsum.photos/seed/prod1-1/400/400",
"https://picsum.photos/seed/prod1-2/400/400",
"https://picsum.photos/seed/prod1-3/400/400",
"https://picsum.photos/seed/prod1-4/400/400"
],
"weight": 9.19,
"dimensions": {
"width": 33.4,
"height": 40,
"depth": 14.6
},
"isAvailable": true,
"isFeatured": false,
"tags": [
"backend"
],
"createdAt": "2024-05-30T01:37:26.059Z",
"updatedAt": "2026-12-15T02:55:19.943Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}413413 — body exceeds 64 KB
{
"error": {
"status": 413,
"message": "Request body too large",
"details": {
"maxSize": "64 KB"
}
}
}429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}GET/products/{id}
Get product by ID
Retrieve a single product. Supports ETag conditional requests via `If-None-Match`.
Parameters 4
| Name | Type | Description |
|---|---|---|
_fields | query · string | Sparse fieldset — comma-separated fields to return. Leave blank for the full object. |
_expand | query · string | Expand parent relations inline. Applies only when the resource has a matching parent (e.g. `user` on posts). |
_embed | query · string | Embed child collections. Applies only when the resource has a matching child (e.g. `comments` on posts). |
ReturnsProduct
Response examples
200The product
{
"id": 1,
"categoryId": 4,
"name": "Desk Lamp",
"description": "Ultra-fast connectivity with rock-solid reliability.",
"price": 161.28,
"originalPrice": 231.38,
"currency": "USD",
"stock": 257,
"sku": "SKU-00001",
"rating": 4.4,
"reviewCount": 188,
"image": "https://picsum.photos/seed/prod1/400/400",
"images": [
"https://picsum.photos/seed/prod1-0/400/400",
"https://picsum.photos/seed/prod1-1/400/400",
"https://picsum.photos/seed/prod1-2/400/400",
"https://picsum.photos/seed/prod1-3/400/400",
"https://picsum.photos/seed/prod1-4/400/400"
],
"weight": 9.19,
"dimensions": {
"width": 33.4,
"height": 40,
"depth": 14.6
},
"isAvailable": true,
"isFeatured": false,
"tags": [
"backend"
],
"createdAt": "2024-05-30T01:37:26.059Z",
"updatedAt": "2026-12-15T02:55:19.943Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PUT/products/{id}
Replace product
Full replacement. All mutable fields overwritten. Triggers `products.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsProduct
AcceptsProductInput
Response examples
200Product replaced
{
"id": 1,
"categoryId": 4,
"name": "Desk Lamp",
"description": "Ultra-fast connectivity with rock-solid reliability.",
"price": 161.28,
"originalPrice": 231.38,
"currency": "USD",
"stock": 257,
"sku": "SKU-00001",
"rating": 4.4,
"reviewCount": 188,
"image": "https://picsum.photos/seed/prod1/400/400",
"images": [
"https://picsum.photos/seed/prod1-0/400/400",
"https://picsum.photos/seed/prod1-1/400/400",
"https://picsum.photos/seed/prod1-2/400/400",
"https://picsum.photos/seed/prod1-3/400/400",
"https://picsum.photos/seed/prod1-4/400/400"
],
"weight": 9.19,
"dimensions": {
"width": 33.4,
"height": 40,
"depth": 14.6
},
"isAvailable": true,
"isFeatured": false,
"tags": [
"backend"
],
"createdAt": "2024-05-30T01:37:26.059Z",
"updatedAt": "2026-12-15T02:55:19.943Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PATCH/products/{id}
Partially update product
Partial update — only provided fields change. Triggers `products.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsProduct
AcceptsProductInput
Response examples
200Product updated
{
"id": 1,
"categoryId": 4,
"name": "Desk Lamp",
"description": "Ultra-fast connectivity with rock-solid reliability.",
"price": 161.28,
"originalPrice": 231.38,
"currency": "USD",
"stock": 257,
"sku": "SKU-00001",
"rating": 4.4,
"reviewCount": 188,
"image": "https://picsum.photos/seed/prod1/400/400",
"images": [
"https://picsum.photos/seed/prod1-0/400/400",
"https://picsum.photos/seed/prod1-1/400/400",
"https://picsum.photos/seed/prod1-2/400/400",
"https://picsum.photos/seed/prod1-3/400/400",
"https://picsum.photos/seed/prod1-4/400/400"
],
"weight": 9.19,
"dimensions": {
"width": 33.4,
"height": 40,
"depth": 14.6
},
"isAvailable": true,
"isFeatured": false,
"tags": [
"backend"
],
"createdAt": "2024-05-30T01:37:26.059Z",
"updatedAt": "2026-12-15T02:55:19.943Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}DELETE/products/{id}
Delete product
Permanently remove a product. Returns deleted resource. Triggers `products.deleted` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsProduct
Response examples
200Deleted product
{
"id": 1,
"categoryId": 4,
"name": "Desk Lamp",
"description": "Ultra-fast connectivity with rock-solid reliability.",
"price": 161.28,
"originalPrice": 231.38,
"currency": "USD",
"stock": 257,
"sku": "SKU-00001",
"rating": 4.4,
"reviewCount": 188,
"image": "https://picsum.photos/seed/prod1/400/400",
"images": [
"https://picsum.photos/seed/prod1-0/400/400",
"https://picsum.photos/seed/prod1-1/400/400",
"https://picsum.photos/seed/prod1-2/400/400",
"https://picsum.photos/seed/prod1-3/400/400",
"https://picsum.photos/seed/prod1-4/400/400"
],
"weight": 9.19,
"dimensions": {
"width": 33.4,
"height": 40,
"depth": 14.6
},
"isAvailable": true,
"isFeatured": false,
"tags": [
"backend"
],
"createdAt": "2024-05-30T01:37:26.059Z",
"updatedAt": "2026-12-15T02:55:19.943Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}GET/products/{id}/reviews
List product's reviews
Retrieve product's reviews. Same filtering, sorting, and pagination as `/reviews`.
Parameters 13
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsReview
Response examples
200Array of reviews
[
{
"id": 1,
"productId": 1,
"userId": 1,
"rating": 4,
"title": "Works as advertised",
"body": "Great article! Really helped me understand the concept better.",
"isVerified": true,
"helpful": 1,
"createdAt": "2025-08-29T18:25:55.906Z"
}
]404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}reviews
GET/reviews
List all reviews
Paginated list of reviews. Supports filtering, range operators (`_gte`, `_lte`, `_gt`, `_lt`, `_ne`, `_like`), full-text search, sorting, field selection, and relation expansion.
Parameters 12
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsReview
Response examples
200Paginated array of reviews
[
{
"id": 1,
"productId": 1,
"userId": 1,
"rating": 4,
"title": "Works as advertised",
"body": "Great article! Really helped me understand the concept better.",
"isVerified": true,
"helpful": 1,
"createdAt": "2025-08-29T18:25:55.906Z"
}
]429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}POST/reviews
Create review
Create a new review. Fields `id`, `createdAt`, `updatedAt` are auto-generated. Triggers `reviews.created` webhook.
ReturnsReview
AcceptsReviewInput
Response examples
201Review created
{
"id": 1,
"productId": 1,
"userId": 1,
"rating": 4,
"title": "Works as advertised",
"body": "Great article! Really helped me understand the concept better.",
"isVerified": true,
"helpful": 1,
"createdAt": "2025-08-29T18:25:55.906Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}413413 — body exceeds 64 KB
{
"error": {
"status": 413,
"message": "Request body too large",
"details": {
"maxSize": "64 KB"
}
}
}429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}GET/reviews/{id}
Get review by ID
Retrieve a single review. Supports ETag conditional requests via `If-None-Match`.
Parameters 4
| Name | Type | Description |
|---|---|---|
_fields | query · string | Sparse fieldset — comma-separated fields to return. Leave blank for the full object. |
_expand | query · string | Expand parent relations inline. Applies only when the resource has a matching parent (e.g. `user` on posts). |
_embed | query · string | Embed child collections. Applies only when the resource has a matching child (e.g. `comments` on posts). |
ReturnsReview
Response examples
200The review
{
"id": 1,
"productId": 1,
"userId": 1,
"rating": 4,
"title": "Works as advertised",
"body": "Great article! Really helped me understand the concept better.",
"isVerified": true,
"helpful": 1,
"createdAt": "2025-08-29T18:25:55.906Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PUT/reviews/{id}
Replace review
Full replacement. All mutable fields overwritten. Triggers `reviews.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsReview
AcceptsReviewInput
Response examples
200Review replaced
{
"id": 1,
"productId": 1,
"userId": 1,
"rating": 4,
"title": "Works as advertised",
"body": "Great article! Really helped me understand the concept better.",
"isVerified": true,
"helpful": 1,
"createdAt": "2025-08-29T18:25:55.906Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PATCH/reviews/{id}
Partially update review
Partial update — only provided fields change. Triggers `reviews.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsReview
AcceptsReviewInput
Response examples
200Review updated
{
"id": 1,
"productId": 1,
"userId": 1,
"rating": 4,
"title": "Works as advertised",
"body": "Great article! Really helped me understand the concept better.",
"isVerified": true,
"helpful": 1,
"createdAt": "2025-08-29T18:25:55.906Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}DELETE/reviews/{id}
Delete review
Permanently remove a review. Returns deleted resource. Triggers `reviews.deleted` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsReview
Response examples
200Deleted review
{
"id": 1,
"productId": 1,
"userId": 1,
"rating": 4,
"title": "Works as advertised",
"body": "Great article! Really helped me understand the concept better.",
"isVerified": true,
"helpful": 1,
"createdAt": "2025-08-29T18:25:55.906Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}todos
GET/todos
List all todos
Paginated list of todos. Supports filtering, range operators (`_gte`, `_lte`, `_gt`, `_lt`, `_ne`, `_like`), full-text search, sorting, field selection, and relation expansion.
Parameters 12
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsTodo
Response examples
200Paginated array of todos
[
{
"id": 1,
"userId": 1,
"title": "Configure monitoring",
"completed": true,
"priority": "low",
"dueDate": null,
"tags": [],
"createdAt": "2024-01-25T00:38:32.919Z"
}
]429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}POST/todos
Create todo
Create a new todo. Fields `id`, `createdAt`, `updatedAt` are auto-generated. Triggers `todos.created` webhook.
ReturnsTodo
AcceptsTodoInput
Response examples
201Todo created
{
"id": 1,
"userId": 1,
"title": "Configure monitoring",
"completed": true,
"priority": "low",
"dueDate": null,
"tags": [],
"createdAt": "2024-01-25T00:38:32.919Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}413413 — body exceeds 64 KB
{
"error": {
"status": 413,
"message": "Request body too large",
"details": {
"maxSize": "64 KB"
}
}
}429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}GET/todos/{id}
Get todo by ID
Retrieve a single todo. Supports ETag conditional requests via `If-None-Match`.
Parameters 4
| Name | Type | Description |
|---|---|---|
_fields | query · string | Sparse fieldset — comma-separated fields to return. Leave blank for the full object. |
_expand | query · string | Expand parent relations inline. Applies only when the resource has a matching parent (e.g. `user` on posts). |
_embed | query · string | Embed child collections. Applies only when the resource has a matching child (e.g. `comments` on posts). |
ReturnsTodo
Response examples
200The todo
{
"id": 1,
"userId": 1,
"title": "Configure monitoring",
"completed": true,
"priority": "low",
"dueDate": null,
"tags": [],
"createdAt": "2024-01-25T00:38:32.919Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PUT/todos/{id}
Replace todo
Full replacement. All mutable fields overwritten. Triggers `todos.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsTodo
AcceptsTodoInput
Response examples
200Todo replaced
{
"id": 1,
"userId": 1,
"title": "Configure monitoring",
"completed": true,
"priority": "low",
"dueDate": null,
"tags": [],
"createdAt": "2024-01-25T00:38:32.919Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PATCH/todos/{id}
Partially update todo
Partial update — only provided fields change. Triggers `todos.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsTodo
AcceptsTodoInput
Response examples
200Todo updated
{
"id": 1,
"userId": 1,
"title": "Configure monitoring",
"completed": true,
"priority": "low",
"dueDate": null,
"tags": [],
"createdAt": "2024-01-25T00:38:32.919Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}DELETE/todos/{id}
Delete todo
Permanently remove a todo. Returns deleted resource. Triggers `todos.deleted` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsTodo
Response examples
200Deleted todo
{
"id": 1,
"userId": 1,
"title": "Configure monitoring",
"completed": true,
"priority": "low",
"dueDate": null,
"tags": [],
"createdAt": "2024-01-25T00:38:32.919Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}users
GET/users
List all users
Paginated list of users. Supports filtering, range operators (`_gte`, `_lte`, `_gt`, `_lt`, `_ne`, `_like`), full-text search, sorting, field selection, and relation expansion.
Parameters 12
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsUser
Response examples
200Paginated array of users
[
{
"id": 1,
"firstName": "Demo",
"lastName": "User",
"email": "demo@example.com",
"username": "demo",
"avatar": "https://i.pravatar.cc/150?u=demo",
"phone": "+1-555-000-0001",
"address": {
"street": "1 Demo Way",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"country": "US",
"geo": {
"lat": 30.2672,
"lng": -97.7431
}
},
"company": {
"name": "Demo Corp",
"catchPhrase": "Seeded for docs and testing."
},
"website": "https://example.com/demo",
"role": "admin",
"age": 30,
"bio": "Seeded demo account. Log in with any password.",
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2026-04-21T00:00:00.000Z"
}
]429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}POST/users
Create user
Create a new user. Fields `id`, `createdAt`, `updatedAt` are auto-generated. Triggers `users.created` webhook.
ReturnsUser
AcceptsUserInput
Response examples
201User created
{
"id": 1,
"firstName": "Demo",
"lastName": "User",
"email": "demo@example.com",
"username": "demo",
"avatar": "https://i.pravatar.cc/150?u=demo",
"phone": "+1-555-000-0001",
"address": {
"street": "1 Demo Way",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"country": "US",
"geo": {
"lat": 30.2672,
"lng": -97.7431
}
},
"company": {
"name": "Demo Corp",
"catchPhrase": "Seeded for docs and testing."
},
"website": "https://example.com/demo",
"role": "admin",
"age": 30,
"bio": "Seeded demo account. Log in with any password.",
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2026-04-21T00:00:00.000Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}413413 — body exceeds 64 KB
{
"error": {
"status": 413,
"message": "Request body too large",
"details": {
"maxSize": "64 KB"
}
}
}429429 — rate limit exceeded (120/60s)
{
"error": {
"status": 429,
"message": "Too many requests",
"details": {
"retryAfter": 45
}
}
}GET/users/{id}
Get user by ID
Retrieve a single user. Supports ETag conditional requests via `If-None-Match`.
Parameters 4
| Name | Type | Description |
|---|---|---|
_fields | query · string | Sparse fieldset — comma-separated fields to return. Leave blank for the full object. |
_expand | query · string | Expand parent relations inline. Applies only when the resource has a matching parent (e.g. `user` on posts). |
_embed | query · string | Embed child collections. Applies only when the resource has a matching child (e.g. `comments` on posts). |
ReturnsUser
Response examples
200The user
{
"id": 1,
"firstName": "Demo",
"lastName": "User",
"email": "demo@example.com",
"username": "demo",
"avatar": "https://i.pravatar.cc/150?u=demo",
"phone": "+1-555-000-0001",
"address": {
"street": "1 Demo Way",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"country": "US",
"geo": {
"lat": 30.2672,
"lng": -97.7431
}
},
"company": {
"name": "Demo Corp",
"catchPhrase": "Seeded for docs and testing."
},
"website": "https://example.com/demo",
"role": "admin",
"age": 30,
"bio": "Seeded demo account. Log in with any password.",
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2026-04-21T00:00:00.000Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PUT/users/{id}deprecated
Replace user
Full replacement. All mutable fields overwritten. Triggers `users.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsUser
AcceptsUserInput
Response examples
200User replaced
{
"id": 1,
"firstName": "Demo",
"lastName": "User",
"email": "demo@example.com",
"username": "demo",
"avatar": "https://i.pravatar.cc/150?u=demo",
"phone": "+1-555-000-0001",
"address": {
"street": "1 Demo Way",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"country": "US",
"geo": {
"lat": 30.2672,
"lng": -97.7431
}
},
"company": {
"name": "Demo Corp",
"catchPhrase": "Seeded for docs and testing."
},
"website": "https://example.com/demo",
"role": "admin",
"age": 30,
"bio": "Seeded demo account. Log in with any password.",
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2026-04-21T00:00:00.000Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PATCH/users/{id}
Partially update user
Partial update — only provided fields change. Triggers `users.updated` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsUser
AcceptsUserInput
Response examples
200User updated
{
"id": 1,
"firstName": "Demo",
"lastName": "User",
"email": "demo@example.com",
"username": "demo",
"avatar": "https://i.pravatar.cc/150?u=demo",
"phone": "+1-555-000-0001",
"address": {
"street": "1 Demo Way",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"country": "US",
"geo": {
"lat": 30.2672,
"lng": -97.7431
}
},
"company": {
"name": "Demo Corp",
"catchPhrase": "Seeded for docs and testing."
},
"website": "https://example.com/demo",
"role": "admin",
"age": 30,
"bio": "Seeded demo account. Log in with any password.",
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2026-04-21T00:00:00.000Z"
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}DELETE/users/{id}
Delete user
Permanently remove a user. Returns deleted resource. Triggers `users.deleted` webhook.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsUser
Response examples
200Deleted user
{
"id": 1,
"firstName": "Demo",
"lastName": "User",
"email": "demo@example.com",
"username": "demo",
"avatar": "https://i.pravatar.cc/150?u=demo",
"phone": "+1-555-000-0001",
"address": {
"street": "1 Demo Way",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"country": "US",
"geo": {
"lat": 30.2672,
"lng": -97.7431
}
},
"company": {
"name": "Demo Corp",
"catchPhrase": "Seeded for docs and testing."
},
"website": "https://example.com/demo",
"role": "admin",
"age": 30,
"bio": "Seeded demo account. Log in with any password.",
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2026-04-21T00:00:00.000Z"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}GET/users/{id}/albums
List user's albums
Retrieve user's albums. Same filtering, sorting, and pagination as `/albums`.
Parameters 13
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsAlbum
Response examples
200Array of albums
[
{
"id": 1,
"userId": 1,
"title": "Abstract",
"description": "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"coverImage": "https://picsum.photos/seed/album1/600/400",
"photoCount": 39,
"isPublic": true,
"createdAt": "2024-07-02T09:01:49.954Z"
}
]404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}GET/users/{id}/comments
List user's comments
Retrieve user's comments. Same filtering, sorting, and pagination as `/comments`.
Parameters 13
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsComment
Response examples
200Array of comments
[
{
"id": 1,
"postId": 1,
"userId": 1,
"body": "How does this compare to the approach described in the official docs?",
"likes": 16,
"createdAt": "2023-04-28T06:59:47.906Z"
}
]404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}GET/users/{id}/notifications
List user's notifications
Retrieve user's notifications. Same filtering, sorting, and pagination as `/notifications`.
Parameters 13
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsNotification
Response examples
200Array of notifications
[
{
"id": 1,
"userId": 1,
"type": "error",
"title": "Error notification",
"message": "New follower on your profile.",
"read": true,
"link": null,
"createdAt": "2026-03-23T15:22:15.402Z"
}
]404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}GET/users/{id}/orders
List user's orders
Retrieve user's orders. Same filtering, sorting, and pagination as `/orders`.
Parameters 13
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsOrder
Response examples
200Array of orders
[
{
"id": 1,
"userId": 1,
"items": [
{
"productId": 37,
"quantity": 2,
"price": 416.97
},
{
"productId": 16,
"quantity": 2,
"price": 478.87
}
],
"subtotal": 1791.68,
"tax": 143.33,
"shipping": 0,
"total": 1935.01,
"currency": "USD",
"status": "pending",
"paymentMethod": "credit_card",
"shippingAddress": {
"street": "6620 Maple Dr",
"city": "Fort Worth",
"state": "MI",
"zipCode": "16372",
"country": "US"
},
"trackingNumber": "TRK442765071",
"notes": null,
"createdAt": "2026-04-19T12:16:46.226Z",
"updatedAt": "2025-01-30T04:10:54.855Z"
}
]404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}GET/users/{id}/posts
List user's posts
Retrieve user's posts. Same filtering, sorting, and pagination as `/posts`.
Parameters 13
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsPost
Response examples
200Array of posts
[
{
"id": 1,
"userId": 1,
"title": "Performance Optimization Tips",
"slug": "web-security-fundamentals",
"body": "Fusce commodo aliquam arcu. Nam commodo suscipit quam. Quisque id odio.\n\nCurabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra.",
"excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliq...",
"tags": [
"ux"
],
"status": "published",
"views": 16848,
"likes": 28,
"featured": false,
"coverImage": "https://picsum.photos/seed/1/800/400",
"readingTime": 7,
"createdAt": "2026-01-21T19:36:04.116Z",
"updatedAt": "2026-01-21T19:36:04.116Z"
}
]404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}GET/users/{id}/reviews
List user's reviews
Retrieve user's reviews. Same filtering, sorting, and pagination as `/reviews`.
Parameters 13
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsReview
Response examples
200Array of reviews
[
{
"id": 1,
"productId": 1,
"userId": 1,
"rating": 4,
"title": "Works as advertised",
"body": "Great article! Really helped me understand the concept better.",
"isVerified": true,
"helpful": 1,
"createdAt": "2025-08-29T18:25:55.906Z"
}
]404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}GET/users/{id}/todos
List user's tasks
Retrieve user's tasks. Same filtering, sorting, and pagination as `/todos`.
Parameters 13
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
_start | query · integer | Slice start index (alternative to page-based) |
ReturnsTodo
Response examples
200Array of todos
[
{
"id": 1,
"userId": 1,
"title": "Configure monitoring",
"completed": true,
"priority": "low",
"dueDate": null,
"tags": [],
"createdAt": "2024-01-25T00:38:32.919Z"
}
]404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}utils
POST/batch
Batch operations
Up to 20 operations in one request, executed sequentially.
ReturnsBatchResult
AcceptsBatchOperation
Response examples
200Results
[
{
"status": 200,
"body": {}
}
]400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}GET/delay/{ms}
Delayed response
Wait N ms before responding. Test timeouts and loading states.
Parameters 1
| Name | Type | Description |
|---|---|---|
msrequired | path · integer |
Response examples
200Delayed response
{
"delayed": 0,
"timestamp": "2024-01-15T09:30:00Z"
}GET/echo
Echo request
Mirror request back as JSON.
ReturnsEchoResponse
Response examples
200Request mirror
{
"method": "string",
"url": "string",
"headers": {},
"query": {}
}POST/echo
Echo POST
Mirror the request body, query, and headers back — handy when you want to see exactly what your client is sending.
ReturnsEchoResponse
Response examples
200Request mirror
{
"method": "string",
"url": "string",
"headers": {},
"query": {}
}GET/health
Health check
ReturnsHealthCheck
Response examples
200Healthy
{
"status": "ok",
"uptime": 0,
"timestamp": "2024-01-15T09:30:00Z"
}GET/random/number
Random number(s)
Parameters 3
| Name | Type | Description |
|---|---|---|
min | query · integer | |
max | query · integer | |
count | query · integer |
GET/random/text
Lorem Ipsum
Parameters 1
| Name | Type | Description |
|---|---|---|
paragraphs | query · integer |
GET/random/uuid
Random UUID(s)
Parameters 1
| Name | Type | Description |
|---|---|---|
count | query · integer |
Response examples
200UUID(s)
{
"uuid": "00000000-0000-4000-8000-000000000000"
}GET/status/{code}
Return HTTP status code
Test error handling with any status code.
Parameters 1
| Name | Type | Description |
|---|---|---|
coderequired | path · integer |
GET/stream
SSE event stream
Server-Sent Events — 1 event/sec, max 50. Test real-time UI and EventSource.
Response examples
200SSE stream
"string"POST/upload
Mock file upload
Simulates upload — no actual file storage. Accepts raw binary, multipart form, or JSON with a filename hint. Returns a fake CDN URL so your frontend can wire the full happy path without real object storage.
ReturnsUploadResponse
Response examples
201Upload response
{
"id": "00000000-0000-4000-8000-000000000000",
"filename": "document.pdf",
"url": "https://example.com"
}webhooks
GET/webhooks
List webhooks
Parameters 2
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
ReturnsWebhook
Response examples
200Webhook list
[
{
"id": 1,
"url": "https://example.com/webhooks/receiver",
"events": [
"users.created",
"orders.*"
]
}
]POST/webhooks
Register webhook
Subscribe URL to events. Patterns: `*` (all), `users.*`, `*.created`, `users.created`. Deliveries are simulated (logged, not sent).
ReturnsWebhook
AcceptsWebhookInput
Response examples
201Registered
{
"id": 1,
"url": "https://example.com/webhooks/receiver",
"events": [
"users.created",
"orders.*"
]
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}GET/webhooks/{id}
Get webhook
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsWebhook
Response examples
200Webhook
{
"id": 1,
"url": "https://example.com/webhooks/receiver",
"events": [
"users.created",
"orders.*"
]
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}PATCH/webhooks/{id}
Update webhook
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsWebhook
AcceptsWebhookInput
Response examples
200Updated
{
"id": 1,
"url": "https://example.com/webhooks/receiver",
"events": [
"users.created",
"orders.*"
]
}400400 — invalid input or malformed JSON
{
"error": {
"status": 400,
"message": "Request body required"
}
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}DELETE/webhooks/{id}
Delete webhook
Remove webhook and all delivery records.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsWebhook
Response examples
200Deleted
{
"id": 1,
"url": "https://example.com/webhooks/receiver",
"events": [
"users.created",
"orders.*"
]
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}GET/webhooks/{id}/deliveries
Delivery history
Delivery log for a webhook — event, payload, simulated response, timing.
Parameters 3
| Name | Type | Description |
|---|---|---|
_page | query · integer | Page number (1-based) |
_limit | query · integer | Items per page |
idrequired | path · integer | Resource identifier |
ReturnsWebhookDelivery
Response examples
200Deliveries
[
{
"id": 1,
"webhookId": 1,
"event": "users.created",
"resource": "users"
}
]404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}POST/webhooks/{id}/test
Send test event
Trigger simulated `webhook.test` event.
Parameters 1
| Name | Type | Description |
|---|---|---|
idrequired | path · integer | Resource identifier |
ReturnsWebhookDelivery
Response examples
200Test delivery
{
"id": 1,
"webhookId": 1,
"event": "users.created",
"resource": "users"
}404404 — resource not found
{
"error": {
"status": 404,
"message": "users #999 not found"
}
}POSTalbums.createdwebhook
Album created
Fired when a album is created.
AcceptsWebhookPayload
POSTalbums.deletedwebhook
Album deleted
Fired when a album is deleted.
AcceptsWebhookPayload
POSTalbums.updatedwebhook
Album updated
Fired when a album is updated.
AcceptsWebhookPayload
POSTcategories.createdwebhook
Category created
Fired when a category is created.
AcceptsWebhookPayload
POSTcategories.deletedwebhook
Category deleted
Fired when a category is deleted.
AcceptsWebhookPayload
POSTcategories.updatedwebhook
Category updated
Fired when a category is updated.
AcceptsWebhookPayload
POSTcomments.createdwebhook
Comment created
Fired when a comment is created.
AcceptsWebhookPayload
POSTcomments.deletedwebhook
Comment deleted
Fired when a comment is deleted.
AcceptsWebhookPayload
POSTcomments.updatedwebhook
Comment updated
Fired when a comment is updated.
AcceptsWebhookPayload
POSTnotifications.createdwebhook
Notification created
Fired when a notification is created.
AcceptsWebhookPayload
POSTnotifications.deletedwebhook
Notification deleted
Fired when a notification is deleted.
AcceptsWebhookPayload
POSTnotifications.updatedwebhook
Notification updated
Fired when a notification is updated.
AcceptsWebhookPayload
POSTorders.createdwebhook
Order created
Fired when a order is created.
AcceptsWebhookPayload
POSTorders.deletedwebhook
Order deleted
Fired when a order is deleted.
AcceptsWebhookPayload
POSTorders.updatedwebhook
Order updated
Fired when a order is updated.
AcceptsWebhookPayload
POSTphotos.createdwebhook
Photo created
Fired when a photo is created.
AcceptsWebhookPayload
POSTphotos.deletedwebhook
Photo deleted
Fired when a photo is deleted.
AcceptsWebhookPayload
POSTphotos.updatedwebhook
Photo updated
Fired when a photo is updated.
AcceptsWebhookPayload
POSTposts.createdwebhook
Post created
Fired when a post is created.
AcceptsWebhookPayload
POSTposts.deletedwebhook
Post deleted
Fired when a post is deleted.
AcceptsWebhookPayload
POSTposts.updatedwebhook
Post updated
Fired when a post is updated.
AcceptsWebhookPayload
POSTproducts.createdwebhook
Product created
Fired when a product is created.
AcceptsWebhookPayload
POSTproducts.deletedwebhook
Product deleted
Fired when a product is deleted.
AcceptsWebhookPayload
POSTproducts.updatedwebhook
Product updated
Fired when a product is updated.
AcceptsWebhookPayload
POSTreviews.createdwebhook
Review created
Fired when a review is created.
AcceptsWebhookPayload
POSTreviews.deletedwebhook
Review deleted
Fired when a review is deleted.
AcceptsWebhookPayload
POSTreviews.updatedwebhook
Review updated
Fired when a review is updated.
AcceptsWebhookPayload
POSTtodos.createdwebhook
Todo created
Fired when a todo is created.
AcceptsWebhookPayload
POSTtodos.deletedwebhook
Todo deleted
Fired when a todo is deleted.
AcceptsWebhookPayload
POSTtodos.updatedwebhook
Todo updated
Fired when a todo is updated.
AcceptsWebhookPayload
POSTusers.createdwebhook
User created
Fired when a user is created.
AcceptsWebhookPayload
POSTusers.deletedwebhook
User deleted
Fired when a user is deleted.
AcceptsWebhookPayload
POSTusers.updatedwebhook
User updated
Fired when a user is updated.
AcceptsWebhookPayload
POSTwebhook.testwebhook
Test ping
Fired via `POST /webhooks/{id}/test`.
AcceptsWebhookPayload