
Convex Http Actions
Expose Convex-backed HTTP routes and webhooks so external services and browsers can call your app without going through the Convex client SDK.
Overview
Convex HTTP Actions is an agent skill for the Build phase that helps solo builders implement Convex httpRouter endpoints for webhooks, external API integration, and authenticated HTTP request/response handling.
Install
npx skills add https://github.com/waynesutton/convexskills --skill convex-http-actionsWhat is this skill?
- Route HTTP methods and paths for Convex httpRouter endpoints
- Handle request bodies, query strings, headers, and JSON responses
- Authenticate inbound webhooks and optional caller identity
- Bridge external systems (Stripe, Slack, OAuth providers) into Convex mutations and queries
- Patterns for idempotency, error status codes, and CORS where browsers call your action
Adoption & trust: 2.2k installs on skills.sh; 402 GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need third parties or unauthenticated clients to hit your Convex backend over HTTP, but Convex’s default client SDK path does not cover webhooks and custom REST-style routes.
Who is it for?
Indie SaaS on Convex accepting payment or SaaS webhooks, building partner APIs, or exposing a small set of HTTP endpoints without standing up a separate Node server.
Skip if: Teams that only use Convex queries/mutations from the React client with no inbound HTTP, or apps that need a full custom API gateway outside Convex’s HTTP action model.
When should I use this skill?
You need external API integration or webhook handling on Convex, including HTTP endpoint routing, request/response handling, or authentication on inbound HTTP traffic.
What do I get? / Deliverables
After the skill runs, you have routed HTTP actions with clear auth, validated payloads, and handlers that call Convex functions—ready to test with real webhook providers and deploy with your Convex app.
- Configured httpRouter routes and httpAction handler implementations
- Auth or signature verification for inbound HTTP calls
- Documented test steps (curl or provider test events) for each route
Recommended Skills
Journey fit
HTTP actions sit at the boundary between your Convex backend and the outside world—typical work while wiring integrations during product build, not ideation or growth analytics. Subphase integrations matches webhook receivers, third-party API callbacks, REST-style handlers, and auth on public HTTP endpoints defined in Convex.
How it compares
Use this skill for Convex-native httpAction routes instead of bolting a separate Express layer only to forward traffic into Convex.
Common Questions / FAQ
Who is Convex HTTP Actions for?
Solo and indie builders using Convex who must integrate external APIs, receive webhooks, or serve authenticated HTTP endpoints without maintaining a separate API server.
When should I use Convex HTTP Actions?
During Build while wiring integrations—e.g. Stripe or Clerk webhooks, OAuth callbacks, partner POST hooks, or browser-callable endpoints that need CORS and token checks.
Is Convex HTTP Actions safe to install?
Treat it like any third-party agent skill: review what it suggests before pasting secrets or opening network routes. Check the Security Audits panel on this Prism page and restrict webhook secrets in Convex environment variables.
SKILL.md
READMESKILL.md - Convex Http Actions
interface: icon_small: "./assets/small-logo.svg" icon_large: "./assets/large-logo.png" <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> <g clip-path="url(#clip0_3_23)"> <g clip-path="url(#clip1_3_23)"> <path d="M10.0643 12.5735C12.3769 12.3166 14.5572 11.0843 15.7577 9.02756C15.1892 14.1148 9.62646 17.3302 5.08583 15.356C4.66743 15.1746 4.30728 14.8728 4.06013 14.4848C3.03973 12.8825 2.7043 10.8437 3.18626 8.99344C4.56327 11.37 7.3632 12.8267 10.0643 12.5735Z" fill="#F3B01C"/> <path d="M3.1018 7.50072C2.16436 9.66714 2.12376 12.2034 3.27303 14.2907C-0.771507 11.2479 -0.72737 4.7362 3.2236 1.72378C3.58904 1.44535 4.02333 1.2801 4.47881 1.25494C6.3519 1.15614 8.25501 1.88006 9.58963 3.22909C6.87799 3.25604 4.23695 4.99308 3.1018 7.50072Z" fill="#8D2676"/> <path d="M10.8974 3.89562C9.52924 1.98794 7.38779 0.68921 5.04156 0.649695C9.57686 -1.40888 15.1555 1.92867 15.7629 6.86314C15.8194 7.32119 15.7452 7.78824 15.5421 8.20138C14.6948 9.92223 13.1236 11.2569 11.2876 11.7508C12.6328 9.25579 12.4668 6.20748 10.8974 3.89562Z" fill="#EE342F"/> </g> </g> <defs> <clipPath id="clip0_3_23"> <rect width="16" height="16" fill="white"/> </clipPath> <clipPath id="clip1_3_23"> <rect width="16" height="16" fill="white"/> </clipPath> </defs> </svg> --- name: convex-http-actions displayName: Convex HTTP Actions description: External API integration and webhook handling including HTTP endpoint routing, request/response handling, authentication, CORS configuration, and webhook signature validation version: 1.0.0 author: Convex tags: [convex, http, actions, webhooks, api, endpoints] --- # Convex HTTP Actions Build HTTP endpoints for webhooks, external API integrations, and custom routes in Convex applications. ## Documentation Sources Before implementing, do not assume; fetch the latest documentation: - Primary: https://docs.convex.dev/functions/http-actions - Actions Overview: https://docs.convex.dev/functions/actions - Authentication: https://docs.convex.dev/auth - For broader context: https://docs.convex.dev/llms.txt ## Instructions ### HTTP Actions Overview HTTP actions allow you to define HTTP endpoints in Convex that can: - Receive webhooks from third-party services - Create custom API routes - Handle file uploads - Integrate with external services - Serve dynamic content ### Basic HTTP Router Setup ```typescript // convex/http.ts import { httpRouter } from "convex/server"; import { httpAction } from "./_generated/server"; const http = httpRouter(); // Simple GET endpoint http.route({ path: "/health", method: "GET", handler: httpAction(async (ctx, request) => { return new Response(JSON.stringify({ status: "ok" }), { status: 200, headers: { "Content-Type": "application/json" }, }); }), }); export default http; ``` ### Request Handling ```typescript // convex/http.ts import { httpRouter } from "convex/server"; import { httpAction } from "./_generated/server"; const http = httpRouter(); // Handle JSON body http.route({ path: "/api/data", method: "POST", handler: httpAction(async (ctx, request) => { // Parse JSON body const body = await request.json(); // Access headers const authHeader = request.headers.get("Authorization"); // Access URL parameters const url = new URL(request.url); const queryParam = url.searchParams.get("filter"); return new Response( JSON.stringify({ received: body, filter: queryParam }), { status: 200, headers: { "Content-Type": "application/json" }, } ); }), }); // Handle form data http.route({ path: "/api/form", method: "POST", handler: httpAction(async (ctx, request) => { const formData = await request.formData(); const name = formData.get("name"); const email = formData.get("email"); return new Response( JSON.stringify({ name, email }), { status: 200, headers: { "Content-Type": "applic