Supabase-compatible API
Base URL, SDK setup and PostgREST support matrix.
Database exposes its row API through Supabase client paths. Use a base URL ending in /supabase/<database_id>/, including the trailing slash, and a Praxis credential. Unlike Supabase, storage uses SQLite; define tables and fields through /database/v1, not SQL migrations, and do not expect Supabase Auth, RLS policies or realtime subscriptions. Auth, storage, realtime, functions and graphql service paths return 501 with x-should-retry=false. See the Database domain for supported concepts and differences.
Use the official supabase-js client to read and write tables in one database.
Base URL
https://api.deepraxis.ai/supabase/{database_id}/
| Part | Meaning |
|---|---|
| {database_id} | ID returned by database creation; each database has its own URL. |
| / | Keep the trailing slash so supabase-js preserves the database ID when adding rest/v1. |
The API Key is the Authorization: Bearer credential; pass that same key as the second supabase-js argument. These examples run on the server.
import { createClient } from "@supabase/supabase-js";
const supabase = createClient(
`https://api.deepraxis.ai/supabase/${process.env.DATABASE_ID}/`,
process.env.PRAXIS_API_KEY,
{ auth: { persistSession: false, autoRefreshToken: false } },
);Table endpoint
GET / HEAD / POST / PATCH / DELETE
/supabase/{database_id}/rest/v1/{table}
Only the PostgREST subset below is available. Unsupported syntax returns HTTP 400 with code PGRST127; invalid or unknown parameters can return PGRST100.
Filter operators
| Value | Support |
|---|---|
eq | supported |
neq | supported |
gt | supported |
gte | supported |
lt | supported |
lte | supported |
like | supported |
ilike | supported |
in | supported |
is | supported |
cs | supported |
cd | supported |
ov | supported |
fts | unsupported |
plfts | unsupported |
phfts | unsupported |
wfts | unsupported |
match | unsupported |
imatch | unsupported |
isdistinct | unsupported |
sl | unsupported |
sr | unsupported |
nxl | unsupported |
nxr | unsupported |
adj | unsupported |
Prefer
| Value | Support |
|---|---|
return=minimal | supported |
return=headers-only | supported |
return=representation | supported |
count=exact | supported |
count=planned | partial |
count=estimated | partial |
resolution=merge-duplicates | supported |
resolution=ignore-duplicates | supported |
missing=default | partial |
handling=strict | supported |
handling=lenient | supported |
Accept
| Value | Support |
|---|---|
application/json | supported |
*/* | supported |
application/vnd.pgrst.object+json | supported |
text/csv | unsupported |
application/geo+json | unsupported |
application/vnd.pgrst.plan* | unsupported |
Query syntax
| Value | Support |
|---|---|
not | supported |
and/or/not.and/not.or | supported |
JSON paths (->, ->>) | supported |
aliases | supported |
link embedding | supported |
!field hint | supported |
embedded filters/order/pagination | unsupported |
casts (::) | unsupported |
aggregates | unsupported |
spread (...) | unsupported |
!inner/!left | unsupported |
operator(any)/operator(all) | unsupported |
planned/estimated currently return exact counts. Fields can declare a default. In a bulk insert, a column some rows supply and others omit takes the field default where omitted with missing=default, and null otherwise, as in PostgREST; a column no row supplies always takes the default (null without one). cs/cd/ov accept arrays ({a,b} or ["a"]); on json fields cs/cd also accept a JSON object and use jsonb containment, e.g. meta=cs.{"color":"red"} (keys and values are contained recursively); cs also accepts a JSON scalar, matching a top-level array that holds it, e.g. meta=cs."a". cs.{}/cd.{} is the empty object on json fields and the empty array on array fields. Rows deleted by one DELETE may reference each other; a referencing row outside that DELETE still returns 409 23503. like/ilike apply only to string fields and ->> text paths; other types return 400 42883. Strings compare and sort in binary order (case-sensitive, uppercase before lowercase); ordering by lower() is not supported, so store a lowercase copy in another field and order by it for case-insensitive sorting. GET/HEAD with If-None-Match matching the current ETag return 304 with no body. Unsupported Accept values return 406 PGRST107. Upsert accepts id or one unique field.
Unknown Prefer values are ignored by default; handling=strict returns 400 PGRST122. Singular Accept returns an object for exactly one row, otherwise 406 PGRST116. Other unsupported Accept values return 406 PGRST107.
Unavailable services
| Path | HTTP | code |
|---|---|---|
| /supabase/{database_id}/auth/v1/{+path} | 501 | not_implemented |
| /supabase/{database_id}/storage/v1/{+path} | 501 | not_implemented |
| /supabase/{database_id}/realtime/v1/{+path} | 501 | not_implemented |
| /supabase/{database_id}/functions/v1/{+path} | 501 | not_implemented |
| /supabase/{database_id}/graphql/v1/{+path} | 501 | not_implemented |
These services return x-should-retry: false. Their error body has only code and message, unlike table endpoint errors.