encore-api
Original:🇺🇸 English
Translated
Create type-safe API endpoints with Encore.ts.
14installs
Sourceencoredev/skills
Added on
NPX Install
npx skill4agent add encoredev/skills encore-apiTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →Encore API Endpoints
Instructions
When creating API endpoints with Encore.ts, follow these patterns:
1. Import the API module
typescript
import { api } from "encore.dev/api";2. Define typed request/response interfaces
Always define explicit TypeScript interfaces for request and response types:
typescript
interface CreateUserRequest {
email: string;
name: string;
}
interface CreateUserResponse {
id: string;
email: string;
name: string;
}3. Create the endpoint
typescript
export const createUser = api(
{ method: "POST", path: "/users", expose: true },
async (req: CreateUserRequest): Promise<CreateUserResponse> => {
// Implementation
}
);API Options
| Option | Type | Description |
|---|---|---|
| string | HTTP method: GET, POST, PUT, PATCH, DELETE |
| string | URL path, supports |
| boolean | If true, accessible from outside (default: false) |
| boolean | If true, requires authentication |
Parameter Types
Path Parameters
typescript
// Path: "/users/:id"
interface GetUserRequest {
id: string; // Automatically mapped from :id
}Query Parameters
typescript
import { Query } from "encore.dev/api";
interface ListUsersRequest {
limit?: Query<number>;
offset?: Query<number>;
}Headers
typescript
import { Header } from "encore.dev/api";
interface WebhookRequest {
signature: Header<"X-Webhook-Signature">;
payload: string;
}Request Validation
Encore validates requests at runtime using TypeScript types. Add constraints for stricter validation:
typescript
import { api, Min, Max, MinLen, MaxLen, IsEmail, IsURL } from "encore.dev/api";
interface CreateUserRequest {
email: string & IsEmail; // Must be valid email
username: string & MinLen<3> & MaxLen<20>; // 3-20 characters
age: number & Min<13> & Max<120>; // Between 13 and 120
website?: string & IsURL; // Optional, must be URL if provided
}Available Validators
| Validator | Applies To | Example |
|---|---|---|
| number | |
| number | |
| string, array | |
| string, array | |
| string | |
| string | |
Validation Error Response
Invalid requests return 400 with details:
json
{
"code": "invalid_argument",
"message": "validation failed",
"details": { "field": "email", "error": "must be a valid email" }
}Raw Endpoints
Use for webhooks or when you need direct request/response access:
api.rawtypescript
export const stripeWebhook = api.raw(
{ expose: true, path: "/webhooks/stripe", method: "POST" },
async (req, res) => {
const sig = req.headers["stripe-signature"];
// Handle raw request...
res.writeHead(200);
res.end();
}
);Error Handling
Use for proper HTTP error responses:
APIErrortypescript
import { APIError, ErrCode } from "encore.dev/api";
// Throw with error code
throw new APIError(ErrCode.NotFound, "user not found");
// Or use shorthand
throw APIError.notFound("user not found");
throw APIError.invalidArgument("email is required");
throw APIError.unauthenticated("invalid token");Common Error Codes
| Code | HTTP Status | Usage |
|---|---|---|
| 404 | Resource doesn't exist |
| 400 | Bad input |
| 401 | Missing/invalid auth |
| 403 | Not allowed |
| 409 | Duplicate resource |
Static Assets
Serve static files (HTML, CSS, JS, images) with :
api.statictypescript
import { api } from "encore.dev/api";
// Serve files from ./assets under /static/*
export const assets = api.static(
{ expose: true, path: "/static/*path", dir: "./assets" }
);
// Serve at root (use !path for fallback routing)
export const frontend = api.static(
{ expose: true, path: "/!path", dir: "./dist" }
);
// Custom 404 page
export const app = api.static(
{ expose: true, path: "/!path", dir: "./public", notFound: "./404.html" }
);Guidelines
- Always use not
importrequire - Define explicit interfaces for type safety
- Use only for public endpoints
expose: true - Use for webhooks,
api.rawfor everything elseapi - Throw instead of returning error objects
APIError - Path parameters are automatically extracted from the path pattern
- Use validation constraints (,
Min, etc.) for user inputMaxLen