Prefer Header

PostgREST honors the Prefer HTTP header specified on RFC 7240. It allows clients to specify required and optional behaviors for their requests.

The following preferences are supported.

Strict or Lenient Handling

The server ignores unrecognized or unfulfillable preferences by default. You can control this behavior with the handling preference. It can take two values: lenient (the default) or strict.

handling=strict will throw an error if you specify invalid preferences. For instance:

GET /projects HTTP/1.1
Prefer: handling=strict, foo, bar
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
{
    "code": "PGRST122",
    "message": "Invalid preferences given with handling=strict",
    "details": "Invalid preferences: foo, bar",
    "hint": null
}

handling=lenient ignores invalid preferences.

GET /projects HTTP/1.1
Prefer: handling=lenient, foo, bar
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

Timezone

The timezone preference allows you to change the PostgreSQL timezone. It accepts all timezones in pg_timezone_names.

GET /timestamps HTTP/1.1
Prefer: timezone=America/Los_Angeles
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Preference-Applied: timezone=America/Los_Angeles
[
  {"t":"2023-10-18T05:37:59.611-07:00"},
  {"t":"2023-10-18T07:37:59.611-07:00"},
  {"t":"2023-10-18T09:37:59.611-07:00"}
]

For an invalid timezone, PostgREST returns values with the default timezone (configured on postgresql.conf or as a setting on the authenticator).

GET /timestamps HTTP/1.1
Prefer: timezone=Jupiter/Red_Spot
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
[
  {"t":"2023-10-18T12:37:59.611+00:00"},
  {"t":"2023-10-18T14:37:59.611+00:00"},
  {"t":"2023-10-18T16:37:59.611+00:00"}
]

Note that there’s no Preference-Applied in the response.

However, with handling=strict, an invalid timezone preference will throw an error.

GET /timestamps HTTP/1.1
Prefer: handling=strict, timezone=Jupiter/Red_Spot
HTTP/1.1 400 Bad Request

Return Representation

The return preference can be used to obtain information about affected resource when it’s inserted, updated or deleted. This helps avoid a subsequent GET request.

Minimal

With Prefer: return=minimal, no response body will be returned. This is the default mode for all write requests.

Headers Only

If the table has a primary key, the response can contain a Location header describing where to find the new object by including the header Prefer: return=headers-only in the request. Make sure that the table is not write-only, otherwise constructing the Location header will cause a permissions error.

POST /projects HTTP/1.1
Prefer: return=headers-only

{"id":33, "name": "x"}
HTTP/1.1 201 Created
Location: /projects?id=eq.34
Preference-Applied: return=headers-only

Full

On the other end of the spectrum you can get the full created object back in the response to your request by including the header Prefer: return=representation. That way you won’t have to make another HTTP call to discover properties that may have been filled in on the server side. You can also apply the standard Vertical Filtering to these results.

POST /projects HTTP/1.1
Content-Type: application/json; charset=utf-8
Prefer: return=representation

{"id":33, "name": "x"}
HTTP/1.1 201 Created
Preference-Applied: return=representation

[
    {
        "id": 33,
        "name": "x"
    }
]