# Supabase-compatible API (/en/docs/api/compatible/supabase)



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.

[Guide →](/en/docs/developers/services/database/quickstart)

## Base URL [#base-url]

`https://api.deepraxis.ai/supabase/{database_id}/`

| Part | Meaning |
| --- | --- |
| &#123;database_id&#125; | 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.

```typescript
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 [#table-endpoint]

[GET / HEAD / POST / PATCH / DELETE](/en/docs/api/compatible/supabase/tables)

`/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 [#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 [#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 [#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 [#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 [#unavailable-services]

| Path | HTTP | code |
| --- | --- | --- |
| /supabase/&#123;database_id&#125;/auth/v1/&#123;+path&#125; | 501 | not_implemented |
| /supabase/&#123;database_id&#125;/storage/v1/&#123;+path&#125; | 501 | not_implemented |
| /supabase/&#123;database_id&#125;/realtime/v1/&#123;+path&#125; | 501 | not_implemented |
| /supabase/&#123;database_id&#125;/functions/v1/&#123;+path&#125; | 501 | not_implemented |
| /supabase/&#123;database_id&#125;/graphql/v1/&#123;+path&#125; | 501 | not_implemented |

These services return x-should-retry: false. Their error body has only code and message, unlike table endpoint errors.

[Error codes and envelopes](/en/docs/api/native/database/errors)
