Announcing Convex 0.9.0
HTTP endpoints are here! Convex 0.9.0 extends the platform by allowing you to build your HTTP API right within Convex.
The full list of changes in 0.9.0 is:
- HTTP Endpoints
- File Storage in the Dashboard
- Breaking: API Changes in Actions
- Breaking:
runAt
Now Uses Milliseconds
Details below.
HTTP Endpoints
You can now define HTTP endpoints right within Convex!
This enables you to build a HTTP API that interacts with all of your Convex data. This is useful for building a public API or receiving webhooks from external applications.
HTTP endpoints are defined with httpEndpoint
. Endpoints receive the Request
object; can call Convex functions with runQuery
, runMutation
, and runAction
; and return a Response
object.
To expose the endpoints, use httpRouter
in convex/http.js
or convex/http.ts
. The endpoints will be available at https://<your deployment name>.convex.site
. The convex.site
domain signifies that these are your routes running under Convex, as opposed to convex.cloud
which serves the Convex API.
Here’s an example of a router with a single endpoint:
You can call this endpoint with:
export DEPLOYMENT_NAME=... # example: "tall-sheep-123"
curl -d '{ "author": "User 123", "body": "Hello world" }' \\
-H 'content-type: application/json' "https://$DEPLOYMENT_NAME.convex.site/postMessage"
To learn more, read the docs!
File Storage in the Dashboard
We’ve added a new page to the dashboard for managing file storage. Now you can upload, view, and delete files from the dashboard. Check it out!
Breaking: API Changes in Actions
We’ve renamed two functions used in Convex actions:
ActionCtx.mutation
→ActionCtx.runMutation
ActionCtx.query
→ActionCtx.runQuery
Now, actions should be defined like:
export default action(async ({ runMutation, runQuery }) => {
// Action logic. Call `runMutation` and `runQuery` in here!
});
This change makes actions consistent with how HTTP endpoints call queries and mutations. It also differentiates calling a query or mutation (runQuery
or runMutation
) from defining a query or mutation (query
or mutation
).
Breaking: runAt
Now Uses Milliseconds
We’ve changed the API for scheduling functions to run at a timestamp. Now scheduler.runAt
accepts a timestamp in milliseconds since the epoch instead of seconds since the epoch. This is more consistent with runAfter
which accepts delay in milliseconds and timestamps in Convex in general.