Complete reference for the BetterBase GraphQL API.
POST /graphql
For GET requests:
GET /graphql?query={...}&variables={...}
Access GraphQL Playground at:
http://localhost:3000/graphql
query {
__schema {
types {
name
kind
fields {
name
type {
name
kind
}
}
}
}
}query GetUsers {
users {
id
name
email
createdAt
}
}query GetPublishedPosts {
posts(where: { published: { _eq: true } }) {
id
title
content
author {
name
}
}
}query GetPaginatedPosts {
posts(offset: 0, limit: 10, order_by: { createdAt: desc }) {
id
title
createdAt
}
}query GetUserById {
users_by_pk(id: "user-123") {
id
name
email
}
}query GetPostStats {
posts_aggregate(where: { published: { _eq: true } }) {
aggregate {
count
sum {
viewCount
}
avg {
viewCount
}
max {
createdAt
}
min {
createdAt
}
}
}
}mutation CreateUser {
insert_users_one(object: { name: "John", email: "john@example.com" }) {
id
name
email
}
}mutation CreateUsers {
insert_users(objects: [
{ name: "Alice", email: "alice@example.com" },
{ name: "Bob", email: "bob@example.com" }
]) {
returning {
id
name
}
}
}mutation UpdateUser {
update_users_by_pk(
pk_columns: { id: "user-123" }
_set: { name: "John Updated" }
) {
id
name
updatedAt
}
}mutation UpdatePosts {
update_posts(
where: { published: { _eq: false } }
_set: { published: true }
) {
returning {
id
title
published
}
}
}mutation DeleteUser {
delete_users_by_pk(pk_columns: { id: "user-123" }) {
id
name
}
}mutation DeletePosts {
delete_posts(
where: { createdAt: { _lt: "2024-01-01" } }
) {
returning {
id
title
}
}
}subscription OnNewUser {
users_insert {
id
name
email
createdAt
}
}subscription OnUserUpdate {
users_update {
id
old {
name
}
new {
name
}
}
}subscription OnUserDelete {
users_delete {
id
name
}
}subscription OnPublishedPost {
posts_insert(where: { published: { _eq: true } }) {
id
title
author {
name
}
}
}# Boolean
where: { published: { _eq: true } }
# String
where: { name: { _eq: "John" } }
# Number
where: { age: { _gt: 18 } }
# Array
where: { role: { _in: ["admin", "moderator"] } }
# Null check
where: { deletedAt: { _is_null: true } }
# Multiple conditions
where: {
_and: [
{ published: { _eq: true } }
{ authorId: { _eq: "user-123" } }
]
}
# Or
where: {
_or: [
{ status: { _eq: "active" } }
{ status: { _eq: "pending" } }
]
}order_by: { createdAt: desc }
order_by: { title: asc, createdAt: desc }| Operator | Description |
|---|---|
_eq |
Equals |
_neq |
Not equals |
_gt |
Greater than |
_gte |
Greater or equal |
_lt |
Less than |
_lte |
Less or equal |
_like |
Like pattern |
_ilike |
Case-insensitive like |
_in |
In array |
_is_null |
Is null |
_and |
And |
_or |
Or |
fragment UserFields on users {
id
name
email
createdAt
}
query GetUsers {
users {
...UserFields
posts {
id
title
}
}
}query GetUser($id: uuid!) {
users_by_pk(id: $id) {
id
name
email
}
}Variables:
{
"id": "user-123"
}query GetData {
activeUsers: users(where: { active: { _eq: true } }) {
id
name
}
inactiveUsers: users(where: { active: { _eq: false } }) {
id
name
}
}query GetUser($includePosts: Boolean!) {
users_by_pk(id: "user-123") {
id
name
posts @include(if: $includePosts) {
id
title
}
}
}Built-in directives:
@include(if: Boolean)@skip(if: Boolean)
{
"errors": [
{
"message": "Field 'users' doesn't exist on type 'query_root'",
"locations": [{ "line": 2, "column": 3 }],
"path": ["query", "users"]
}
]
}Set complexity limits:
export default defineConfig({
graphql: {
complexityLimit: 1000,
depthLimit: 7
}
})Queries are automatically batched for efficiency.
- REST API - REST API reference
- Client SDK - Using GraphQL from client
- GraphQL Feature - GraphQL features