titlestring- Required
- Yes
- Unique
- No
- Default
- None
- Enum
- None
- Notes
- Required on create. String value
A demo hosted API for collecting and prioritizing product feedback.
This documentation is generated from the project schema in EndpointOS. It shows the public method surface, authentication model, request schemas, response contracts, errors, pagination, usage limits, and OpenAPI export.
Quickstart
Use a project API key with the base URL and one of the generated resource paths. EndpointOS never displays private API keys in public documentation.
Authorization: Bearer sapi_live_xxxxxxxx or x-api-key./feature-requestscurl "https://endpointos.dev/api/public/endpointos-demo/feature-requests-api/feature-requests?limit=20&offset=0" \
-H "Authorization: Bearer sapi_live_xxxxxxxx"JSON envelope{
"data": [],
"pagination": {
"limit": 20,
"offset": 0,
"total": 0
}
}Authentication
Every public request requires an EndpointOS API key. Key permissions are checked first, then each resource access mode decides which generated methods are exposed.
| Header | Value | Use when |
|---|---|---|
Authorization | Bearer sapi_live_xxxxxxxx | Recommended for server-to-server calls. |
x-api-key | sapi_test_xxxxxxxx | Useful for curl examples and simple clients. |
Either format worksAuthorization: Bearer sapi_live_xxxxxxxxx-api-key: sapi_test_xxxxxxxxBase URL
All endpoints below are relative to this base URL. The username and project slug are part of the namespace so different builders can publish APIs with the same project name without collisions.
Resource behavior
Each resource controls its public method surface. API key permissions still apply, but a resource can intentionally expose fewer methods for dataset, lookup, or intake APIs.
Read/write
GET, POST, PATCH, DELETEManaged APIs that need the full record lifecycle.Read-only
GETPublic datasets, reporting feeds, lookup APIs, and partner data products.Write-only
POSTLead capture, form submissions, events, and private intake APIs./feature-requestsFeature request records available through the generated CRUD API.
| Field | Type | Required | Unique | Default | Enum values | Notes |
|---|---|---|---|---|---|---|
title | string | Yes | No | None | None | Required on create. String value |
description | string | No | No | None | None | String value |
submitterEmail | string | Yes | No | None | None | Required on create. String value |
status | enum | No | No | None | new, planned, inProgress, shipped, closed | Must match one enum value |
priority | enum | No | No | None | low, medium, high | Must match one enum value |
votes | number | No | No | None | None | Finite numeric value |
isPublic | boolean | No | No | None | None | true or false |
titlestringdescriptionstringsubmitterEmailstringstatusenumpriorityenumvotesnumberisPublicboolean/feature-requestsReturns non-deleted records with pagination, filters, search, and sorting.
This endpoint does not accept a request body.
200OK | success | Request succeeded and returned a JSON response. |
401Unauthorized | client | Missing or invalid API key. |
429Rate limited | client | The project reached its monthly request limit. |
GET /feature-requestscurl "https://endpointos.dev/api/public/endpointos-demo/feature-requests-api/feature-requests" \
-H "Authorization: Bearer sapi_live_xxxxxxxx"200 OK{
"data": [
{
"id": "rec_abc123",
"title": "Dark mode",
"description": "Add a darker theme for late-night work sessions.",
"submitterEmail": "founder@example.com",
"status": "new",
"priority": "low",
"votes": 42,
"isPublic": true,
"createdAt": "2026-05-11T10:30:00.000Z",
"updatedAt": "2026-05-11T10:30:00.000Z"
}
],
"pagination": {
"limit": 20,
"offset": 0,
"total": 1
}
}Consistent error object{
"error": {
"code": "UNAUTHORIZED",
"message": "A valid EndpointOS API key is required.",
"details": {}
}
}/feature-requestsValidates the JSON body against the resource schema and creates a record.
| Field | Type | Required | Notes |
|---|---|---|---|
title | string | Yes | Required on create. String value |
description | string | No | String value |
submitterEmail | string | Yes | Required on create. String value |
status | enum | No | Must match one enum value |
priority | enum | No | Must match one enum value |
votes | number | No | Finite numeric value |
isPublic | boolean | No | true or false |
titlestringdescriptionstringsubmitterEmailstringstatusenumpriorityenumvotesnumberisPublicboolean201Created | success | Record created and returned in the data envelope. |
400Validation error | client | Required, typed, enum, or unknown-field validation failed. |
401Unauthorized | client | Missing or invalid API key. |
403Forbidden | client | The key or resource access mode does not permit this method. |
429Rate limited | client | The project reached its monthly request limit. |
POST /feature-requestscurl -X POST "https://endpointos.dev/api/public/endpointos-demo/feature-requests-api/feature-requests" \
-H "Authorization: Bearer sapi_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"title":"Dark mode","description":"Add a darker theme for late-night work sessions.","submitterEmail":"founder@example.com","status":"new","priority":"low","votes":42,"isPublic":true}'201 Created{
"data": {
"id": "rec_abc123",
"title": "Team workspace",
"description": "Let teams share one API project workspace.",
"submitterEmail": "founder@example.com",
"status": "new",
"priority": "low",
"votes": 42,
"isPublic": true,
"createdAt": "2026-05-11T10:30:00.000Z",
"updatedAt": "2026-05-11T10:42:00.000Z"
}
}Consistent error object{
"error": {
"code": "VALIDATION_ERROR",
"message": "Unknown field 'unexpected' is not defined on this resource.",
"details": {
"field": "unexpected"
}
}
}/feature-requests/{id}Returns one non-deleted record by id.
This endpoint does not accept a request body.
200OK | success | Request succeeded and returned a JSON response. |
401Unauthorized | client | Missing or invalid API key. |
404Not found | client | The record id does not exist or was soft-deleted. |
429Rate limited | client | The project reached its monthly request limit. |
GET /feature-requests/{id}curl "https://endpointos.dev/api/public/endpointos-demo/feature-requests-api/feature-requests/rec_abc123" \
-H "Authorization: Bearer sapi_live_xxxxxxxx"200 OK{
"data": {
"id": "rec_abc123",
"title": "Team workspace",
"description": "Let teams share one API project workspace.",
"submitterEmail": "founder@example.com",
"status": "new",
"priority": "low",
"votes": 42,
"isPublic": true,
"createdAt": "2026-05-11T10:30:00.000Z",
"updatedAt": "2026-05-11T10:42:00.000Z"
}
}Consistent error object{
"error": {
"code": "RECORD_NOT_FOUND",
"message": "Record not found.",
"details": {
"id": "rec_abc123"
}
}
}/feature-requests/{id}Accepts a partial JSON body and validates any supplied fields.
| Field | Type | Required | Notes |
|---|---|---|---|
title | string | No | Optional on PATCH. |
description | string | No | Optional on PATCH. |
submitterEmail | string | No | Optional on PATCH. |
status | enum | No | Optional on PATCH. |
priority | enum | No | Optional on PATCH. |
votes | number | No | Optional on PATCH. |
isPublic | boolean | No | Optional on PATCH. |
titlestringdescriptionstringsubmitterEmailstringstatusenumpriorityenumvotesnumberisPublicboolean200OK | success | Request succeeded and returned a JSON response. |
400Validation error | client | Required, typed, enum, or unknown-field validation failed. |
401Unauthorized | client | Missing or invalid API key. |
403Forbidden | client | The key or resource access mode does not permit this method. |
404Not found | client | The record id does not exist or was soft-deleted. |
429Rate limited | client | The project reached its monthly request limit. |
PATCH /feature-requests/{id}curl -X PATCH "https://endpointos.dev/api/public/endpointos-demo/feature-requests-api/feature-requests/rec_abc123" \
-H "Authorization: Bearer sapi_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"title":"Team workspace","description":"Let teams share one API project workspace."}'200 OK{
"data": {
"id": "rec_abc123",
"title": "Team workspace",
"description": "Let teams share one API project workspace.",
"submitterEmail": "founder@example.com",
"status": "new",
"priority": "low",
"votes": 42,
"isPublic": true,
"createdAt": "2026-05-11T10:30:00.000Z",
"updatedAt": "2026-05-11T10:42:00.000Z"
}
}Consistent error object{
"error": {
"code": "VALIDATION_ERROR",
"message": "Unknown field 'unexpected' is not defined on this resource.",
"details": {
"field": "unexpected"
}
}
}/feature-requests/{id}Soft deletes the record. List endpoints exclude deleted records.
This endpoint does not accept a request body.
200OK | success | Request succeeded and returned a JSON response. |
401Unauthorized | client | Missing or invalid API key. |
403Forbidden | client | The key or resource access mode does not permit this method. |
404Not found | client | The record id does not exist or was soft-deleted. |
429Rate limited | client | The project reached its monthly request limit. |
DELETE /feature-requests/{id}curl -X DELETE "https://endpointos.dev/api/public/endpointos-demo/feature-requests-api/feature-requests/rec_abc123" \
-H "Authorization: Bearer sapi_live_xxxxxxxx"200 OK{
"data": {
"id": "rec_abc123",
"deleted": true
}
}Consistent error object{
"error": {
"code": "RECORD_NOT_FOUND",
"message": "Record not found.",
"details": {
"id": "rec_abc123"
}
}
}Conventions
List endpoints support limit and offset. The default limit is 20 and the maximum limit is 100.
limitnumber | optional | Page size. Defaults to 20 and caps at 100. |
offsetnumber | optional | Zero-based offset for the first returned record. |
Paginated{
"data": [
{
"id": "rec_abc123",
"title": "Dark mode",
"createdAt": "2026-05-11T10:30:00.000Z",
"updatedAt": "2026-05-11T10:30:00.000Z"
}
],
"pagination": {
"limit": 20,
"offset": 0,
"total": 1
}
}Conventions
Collection endpoints accept field filters, comparison operators, text search, and deterministic sorting. Plain field=value remains an equality filter.
field=valuestring | optional | Equality filter for a defined field. |
field[ne]string | optional | Exclude records matching this value. |
field[in]string | optional | Comma-separated values for a field. |
field[gte]string | optional | Comparison operators work with number, date, and datetime fields. |
qstring | optional | Search string and enum fields. |
sortstring | optional | Sort by a field, createdAt, or updatedAt. |
GETGET /feature-requests?status[in]=new,planned&votes[gte]=10&sort=-createdAtConventions
EndpointOS returns stable error codes so clients can handle validation, auth, missing records, and usage limits without parsing prose.
| Code | Status | Meaning |
|---|---|---|
UNAUTHORIZED | 401 | Missing, malformed, or invalid API key. |
FORBIDDEN | 403 | The API key cannot perform this operation. |
PROJECT_NOT_FOUND | 404 | The project slug does not resolve to an API. |
RESOURCE_NOT_FOUND | 404 | The resource slug does not exist in the project. |
RECORD_NOT_FOUND | 404 | The record id does not exist or was deleted. |
VALIDATION_ERROR | 400 | The request body failed schema validation. |
RATE_LIMITED | 429 | The project has reached its monthly request limit. |
INTERNAL_ERROR | 500 | EndpointOS could not complete the request. |
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Field 'title' is required.",
"details": {
"field": "title"
}
}
}Conventions
EndpointOS counts public API requests per project each month. When the project reaches its limit, the API returns 429 RATE_LIMITED.
429 RATE_LIMITED{
"error": {
"code": "RATE_LIMITED",
"message": "Monthly request limit exceeded.",
"details": {
"limit": 1000,
"resetAt": "2026-06-01T00:00:00.000Z"
}
}
}Validation policy
EndpointOS rejects fields that are not defined on the resource schema. This keeps generated APIs predictable and prevents accidental writes to undeclared data.