rembrembdocs

Error Codes

Identify PostgREST errors and resolve them


The docs reflect the error codes and information in PostgREST's official docs.

PostgREST error codes#

Error codes from the Data API are returned as JSON objects

1{2  "code": "42703",3  "details": null,4  "hint": "Perhaps you meant to reference the column some_table.fake_col",5  "message": "column some_table.fake_col does not exist"6}

Here is the full list of error codes and their descriptions:

Database level errors#

To understand the errors reference the Postgres Error Docs.

Here's the text formatted as a proper markdown table:

Postgres error code(s)

HTTP status

Error description

08*

503

connection error

09*

500

triggered action exception

0L*

403

invalid grantor

0P*

403

invalid role specification

23503

409

foreign key violation

23505

409

uniqueness violation

25006

405

read only SQL transaction

25*

500

invalid transaction state

28*

403

invalid auth specification

2D*

500

invalid transaction termination

38*

500

external routine exception

39*

500

external routine invocation

3B*

500

savepoint exception

40*

500

transaction rollback

53400

500

config limit exceeded

53*

503

insufficient resources

54*

500

too complex

55*

500

obj not in prerequisite state

57*

500

operator intervention

58*

500

system error

F0*

500

config file error

HV*

500

foreign data wrapper error

P0001

400

default code for "raise"

P0*

500

PL/pgSQL error

XX*

500

internal error

42883

404

undefined function

42P01

404

undefined table

42P17

500

infinite recursion

42501

if authenticated 403, else 401

insufficient privileges

other

400

API level errors#

Connection errors#

Errors that prevent that data API from interacting with Postgres.

Code

HTTP status

Description

PGRST000

503

Could not connect with the database due to an incorrect connection string or due to the Postgres service not running.

PGRST001

503

Could not connect with the database due to an internal error.

PGRST002

503

Could not connect with the database when building the schema cache

PGRST003

504

The request timed out waiting for a connection from PostgREST's internal pool

API requests#

Errors with data structures or request formatting

Code

HTTP status

Description

PGRST100

400

Parsing error in the query string parameter.

PGRST101

405

For database functions, only GET and POST verbs are allowed. Any other verb will throw this error.

PGRST102

400

An invalid request body was sent(e.g. an empty body or malformed JSON).

PGRST103

416

An invalid range was specified for limits.

PGRST105

405

An invalid UPDATE/UPSERT request was done

PGRST106

406

The schema specified when switching schemas is not exposed to the API.

PGRST107

415

The Content-Type sent in the request is invalid.

PGRST108

400

The filter is applied to an embedded resource that is not specified in the select part of the query string.

PGRST111

500

An invalid response.headers was set.

PGRST112

500

The status code must be a positive integer.

PGRST114

400

For an UPSERT using PUT when limits and offsets are used.

PGRST115

400

For an UPSERT using PUT when the primary key in the query string and the body are different.

PGRST116

406

More than 1 or no items where returned when requesting a singular response.

PGRST117

405

The HTTP verb used in the request in not supported.

PGRST118

400

Could not order the result using the related table because there is no many-to-one or one-to-one relationship between them.

PGRST120

400

An embedded resource can only be filtered using the is.null or not.is.null operators.

PGRST121

500

API can't parse the JSON objects in RAISE PGRST error.

PGRST122

400

Invalid preferences found in Prefer header with Prefer: handling=strict.

PGRST123

400

Aggregate functions are disabled.

PGRST124

400

max-affected preference is violated.

PGRST125

404

Invalid path is specified in request URL.

PGRST126

404

Open API config is disabled but API root path is accessed.

PGRST127

400

The feature specified in the details field is not implemented.

PGRST128

400

max-affected preference is violated with RPC call.

Schema cache errors#

The API is unable to identify relationships or objects within the query requests.

Code

HTTP status

Description

PGRST200

400

Caused by stale foreign key relationships, otherwise any of the embedding resources or the relationship itself may not exist in the database.

PGRST201

300

An ambiguous embedding request was made.

PGRST202

404

Caused by a stale function signature, otherwise the function may not exist in the database.

PGRST203

300

Caused by requesting overloaded functions with the same argument names but different types, or by using a POST verb to request overloaded functions with a JSON or JSONB type unnamed parameter. The solution is to rename the function or add/modify the names of the arguments.

PGRST204

400

Caused when the column specified in the columns query parameter is not found.

PGRST205

404

Caused when the table specified in the URI is not found.

Authentication errors#

The request lacks the proper credentials to request data

Code

HTTP status

Description

PGRST300

500

PostgREST does not have an active JWT secret to validate requests

PGRST301

401

Provided JWT couldn't be decoded or it is invalid.

PGRST302

401

Attempted to do a request without the header Auth: Bearer when the anonymous role is disabled.

PGRST303

401

JWT claims validation or parsing failed.

Internal errors#

Data API error unspecified

Code

HTTP status

Description

PGRSTX00

500

Internal errors related to the library used for connecting to the database.

Viewing errors in the logs#

One can filter for API errors in the log explorer. Below are useful queries for filtering and analyzing API errors:

Find all API errors that occurred at the database level#

1select2  cast(postgres_logs.timestamp as datetime) as timestamp,3  event_message,4  parsed.error_severity,5  parsed.user_name,6  parsed.query,7  parsed.detail,8  parsed.hint,9  parsed.sql_state_code,10  parsed.backend_type11from12  postgres_logs13  cross join unnest(metadata) as metadata14  cross join unnest(metadata.parsed) as parsed15where16  regexp_contains(parsed.error_severity, 'ERROR|FATAL|PANIC')17  and parsed.user_name = 'authenticator' -- the authenticator role represents the database API18order by timestamp desc19limit 100;

Find specific database error from the data API#

1select2  cast(postgres_logs.timestamp as datetime) as timestamp,3  event_message,4  parsed.error_severity,5  parsed.user_name,6  parsed.query,7  parsed.detail,8  parsed.hint,9  parsed.sql_state_code,10  parsed.backend_type11from12  postgres_logs13  cross join unnest(metadata) as metadata14  cross join unnest(metadata.parsed) as parsed15where parsed.sql_state_code like '42501' and parsed.user_name = 'authenticator' -- the authenticator role represents the database API16order by timestamp desc17limit 100;

PostgREST error codes are only captured in the logs for projects running V14+. You can check your PostgREST version and upgrade your project in the Infrastructure Settings

Find specific API error#

1select2  cast(timestamp as datetime) as timestamp,3  status_code,4  event_message,5  coalesce(proxy_status, 'not_recorded') as error_codes,6  path7from8  edge_logs9  cross join unnest(metadata) as metadata10  cross join unnest(response) as response11  cross join unnest(request) as request12where13  status_code >= 30014  and regexp_contains(path, '^/rest/v1/')15  and regexp_contains(proxy_status, '(?i)THE_RELEVANT_STATUS_CODE');

Count errors per path by hour:#

1select2  format_timestamp(3    "%c",4    timestamp_trunc(cast(edge_logs.timestamp as timestamp), hour),5    "UTC"6  ) as hour,7  count(proxy_status) as error_count,8  path,9  coalesce(proxy_status, 'not_recorded') as error_codes10from11  edge_logs12  cross join unnest(metadata) as metadata13  cross join unnest(response) as response14  cross join unnest(response.headers) as headers15  cross join unnest(request) as request16where status_code >= 300 and regexp_contains(path, '^/rest/v1/')17group by hour, proxy_status, path;

Find data API request from specific authenticated user#

1select2  cast(timestamp as datetime) as timestamp,3  event_message,4  cf_connecting_ip as requesters_ip,5  url as request_url,6  request.method as request_method,7  sb.auth_user as user_id,8  apikey_payload.role as apikey_role,9  authorization_payload.role as authorization_token_role,10  user_agent,11  city,12  country,13  continent,14  postalCode15from16  edge_logs17  cross join unnest(metadata) as metadata18  cross join unnest(request) as request19  cross join unnest(sb) as sb20  cross join unnest(jwt) as jwt21  cross join unnest(jwt.apikey) as jwt_apikey22  cross join unnest(jwt_apikey.payload) as apikey_payload23  cross join unnest(authorization) as authorization_key24  cross join unnest(authorization_key.payload) as authorization_payload25  cross join unnest(headers) as headers26  cross join unnest(cf) as cf27  cross join unnest(response) as response28where regexp_contains(path, '^/rest/v1/') and sb.auth_user = 'SOME_USER_ID' -- <---ADD USER_ID from auth.users table29order by timestamp desc;