--- title: Functions API Reference description: Serverless edge functions via REST API --- ## Overview The Functions API provides endpoints for invoking and managing serverless functions. In cloud environments, functions run on Deno Subhosting at the edge. In self-hosted (Docker) environments, functions run in a local Deno runtime. ## Headers ```bash Content-Type: application/json ``` For authenticated function invocations: ```bash Authorization: Bearer your-jwt-token-or-anon-key ``` For admin endpoints: ```bash Authorization: Bearer admin-jwt-token-or-api-key ``` --- ## Invoke Function Execute a deployed function using any HTTP method (GET, POST, PUT, PATCH, DELETE, etc.). The server preserves and forwards the caller's original method to the function runtime. ``` ANY /functions/{slug} ``` Note: Function invocation uses `/functions/{slug}` (without `/api` prefix), not `/api/functions/{slug}`. ### Path Parameters | Parameter | Type | Description | |-----------|------|-------------| | `slug` | string | Function slug identifier | ### Request Body Any JSON payload that the function expects. ### Example ```bash curl -X POST "https://your-app.insforge.app/functions/hello-world" \ -H "Content-Type: application/json" \ -d '{ "name": "John" }' ``` ### Response The response depends on what the function returns: ```json { "message": "Hello, John!" } ``` --- ## Admin Endpoints These endpoints require admin authentication. ### List All Functions ``` GET /api/functions ``` ### Example ```bash curl "https://your-app.insforge.app/api/functions" \ -H "Authorization: Bearer admin-jwt-token-or-api-key" ``` ### Response ```json [ { "id": "123e4567-e89b-12d3-a456-426614174000", "slug": "hello-world", "name": "Hello World Function", "description": "Returns a greeting message", "status": "active", "created_at": "2024-01-21T10:30:00Z", "updated_at": "2024-01-21T10:35:00Z", "deployed_at": "2024-01-21T10:35:00Z" }, { "id": "223e4567-e89b-12d3-a456-426614174001", "slug": "process-webhook", "name": "Webhook Processor", "description": "Processes incoming webhooks", "status": "draft", "created_at": "2024-01-22T14:20:00Z", "updated_at": "2024-01-22T14:20:00Z", "deployed_at": null } ] ``` --- ### Get Function Details ``` GET /api/functions/{slug} ``` ### Example ```bash curl "https://your-app.insforge.app/api/functions/hello-world" \ -H "Authorization: Bearer admin-jwt-token-or-api-key" ``` ### Response ```json { "id": "123e4567-e89b-12d3-a456-426614174000", "slug": "hello-world", "name": "Hello World Function", "description": "Returns a greeting message", "code": "export default async function(request) {\n const { name = 'World' } = await request.json();\n return new Response(\n JSON.stringify({ message: `Hello, ${name}!` }),\n { headers: { 'Content-Type': 'application/json' } }\n );\n}", "status": "active", "created_at": "2024-01-21T10:30:00Z", "updated_at": "2024-01-21T10:35:00Z", "deployed_at": "2024-01-21T10:35:00Z" } ``` --- ### Create Function Currently, InsForge only supports JavaScript/TypeScript functions running in a Deno environment. ``` POST /api/functions ``` ### Request Body | Field | Type | Required | Description | |-------|------|----------|-------------| | `name` | string | Yes | Display name for the function | | `code` | string | Yes | JavaScript/TypeScript code | | `slug` | string | No | URL-friendly identifier (auto-generated if not provided) | | `description` | string | No | Description of the function | | `status` | string | No | `draft` or `active` (default: `active`) | ### Example ```bash curl -X POST "https://your-app.insforge.app/api/functions" \ -H "Authorization: Bearer admin-jwt-token-or-api-key" \ -H "Content-Type: application/json" \ -d '{ "name": "Hello World Function", "slug": "hello-world", "description": "Returns a personalized greeting", "code": "export default async function(request) {\n const { name = \"World\" } = await request.json();\n return new Response(\n JSON.stringify({ message: `Hello, ${name}!` }),\n { headers: { \"Content-Type\": \"application/json\" } }\n );\n}", "status": "active" }' ``` ### Response ```json { "success": true, "function": { "id": "123e4567-e89b-12d3-a456-426614174000", "slug": "hello-world", "name": "Hello World Function", "description": "Returns a personalized greeting", "status": "active", "created_at": "2024-01-21T10:30:00Z" } } ``` --- ### Update Function ``` PUT /api/functions/{slug} ``` ### Request Body | Field | Type | Required | Description | |-------|------|----------|-------------| | `name` | string | No | Updated display name | | `code` | string | No | Updated function code | | `description` | string | No | Updated description | | `status` | string | No | `draft`, `active`, or `error` | ### Example ```bash curl -X PUT "https://your-app.insforge.app/api/functions/hello-world" \ -H "Authorization: Bearer admin-jwt-token-or-api-key" \ -H "Content-Type: application/json" \ -d '{ "name": "Hello World Function v2", "code": "export default async function(request) {\n const { name = \"World\" } = await request.json();\n return new Response(\n JSON.stringify({ message: `Hello, ${name}! Welcome to v2.`, version: 2 }),\n { headers: { \"Content-Type\": \"application/json\" } }\n );\n}" }' ``` ### Response ```json { "success": true, "function": { "id": "123e4567-e89b-12d3-a456-426614174000", "slug": "hello-world", "name": "Hello World Function v2", "description": "Returns a personalized greeting", "status": "active", "updated_at": "2024-01-21T11:00:00Z" } } ``` --- ### Delete Function ``` DELETE /api/functions/{slug} ``` ### Example ```bash curl -X DELETE "https://your-app.insforge.app/api/functions/old-function" \ -H "Authorization: Bearer admin-jwt-token-or-api-key" ``` ### Response ```json { "success": true, "message": "Function old-function deleted successfully" } ``` --- ## Function Code Structure Functions must export a default async function that receives a `Request` object and returns a `Response`: ```javascript export default async function(request) { // Parse request body const body = await request.json(); // Process request const result = { message: `Hello, ${body.name}!` }; // Return response return new Response( JSON.stringify(result), { headers: { 'Content-Type': 'application/json' }, status: 200 } ); } ``` ### Accessing Request Data ```javascript export default async function(request) { // Get JSON body const body = await request.json(); // Get headers const authHeader = request.headers.get('Authorization'); // Get query parameters const url = new URL(request.url); const param = url.searchParams.get('param'); // Get request method const method = request.method; return new Response(JSON.stringify({ body, authHeader, param, method })); } ``` --- ## Function Status | Status | Description | |--------|-------------| | `draft` | Function is saved but not deployed | | `active` | Function is deployed and can be invoked | | `error` | Function has a deployment error | --- ## Error Responses ### Function Not Found (404) ```json { "error": "Function not found" } ``` ### Function Not Active (404) ```json { "error": "Function not found or not active" } ``` ### Execution Error (502) When the function runtime is unreachable (self-hosted: local Deno runtime down; cloud: subhosting proxy failure): ```json { "error": "Failed to proxy function" } ``` ### Function Runtime Error (500) When the function code throws an error: ```json { "error": "Function execution failed", "message": "TypeError: Cannot read property 'name' of undefined" } ``` ### Slug Already Exists (409) ```json { "error": "Function with this slug already exists", "details": "duplicate key value violates unique constraint" } ``` ### Dangerous Code Detected (400) ```json { "error": "Code contains potentially dangerous patterns", "pattern": "/Deno\\.run/i" } ```