API
GraphQL
Query dan ubah record dengan GraphQL, memakai izin dan objek query yang sama dengan REST.
Setiap workspace punya satu endpoint GraphQL. Setiap koleksi mendapat field-nya sendiri, dinamai sesuai koleksi. Izinnya sama dengan REST.
Endpoint
POST /api/v1/workspaces/:workspace/graphql
Kirim query dan variables opsional sebagai JSON, bersama tokenmu.
curl -X POST 'http://127.0.0.1:8080/api/v1/workspaces/YOUR_WORKSPACE_ID/graphql' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
--data '{"query":"query ($query: JSON) { records_deals(limit: 20, query: $query) { id title stage amount } }","variables":{"query":{"filters":[{"field":"stage","operator":"eq","value":"Lead"}]}}}' const res = await fetch(`http://127.0.0.1:8080/api/v1/workspaces/${workspaceId}/graphql`, {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
query: `query ($query: JSON) {
records_deals(limit: 20, query: $query) { id title stage amount }
}`,
variables: { query: { filters: [{ field: 'stage', operator: 'eq', value: 'Lead' }] } }
})
});
const { data } = await res.json(); payload, _ := json.Marshal(map[string]any{
"query": `query ($query: JSON) { records_deals(limit: 20, query: $query) { id title stage amount } }`,
"variables": map[string]any{"query": map[string]any{
"filters": []map[string]any{{"field": "stage", "operator": "eq", "value": "Lead"}},
}},
})
req, _ := http.NewRequest("POST", "http://127.0.0.1:8080/api/v1/workspaces/"+workspaceID+"/graphql", bytes.NewReader(payload))
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req) res = requests.post(
f"http://127.0.0.1:8080/api/v1/workspaces/{workspace_id}/graphql",
headers={"Authorization": f"Bearer {token}"},
json={
"query": "query ($query: JSON) { records_deals(limit: 20, query: $query) { id title stage amount } }",
"variables": {"query": {"filters": [{"field": "stage", "operator": "eq", "value": "Lead"}]}},
},
)
data = res.json()["data"] Respons:
{
"data": {
"records_deals": [
{
"id": "adb696e5c90257c2c313d635f892a776",
"title": "Warehouse analytics",
"stage": "Lead",
"amount": 7300000
}
]
},
"extensions": { "meta": { "request_id": "...", "response_time": 6.3 } }
} Metadata ada di extensions.meta, bukan meta.
Field per koleksi
Untuk koleksi bernama deals:
| Field | Tipe | Fungsinya |
|---|---|---|
records_deals(limit, offset, query) | query | Daftar record. query menerima objek query. |
record_deals(id) | query | Ambil satu record. |
create_deals(input) | mutation | Buat record. |
update_deals(id, input) | mutation | Ubah sebagian field. |
delete_deals(id) | mutation | Hapus record. |
Field hasil join tersedia sebagai _related saat query memakai joins.
Mutation
mutation {
create_deals(input: { title: "Cafe loyalty app", stage: "Lead", amount: 4500000 }) {
id
}
} mutation {
update_deals(id: "YOUR_RECORD_ID", input: { stage: "Qualified" }) {
id
stage
}
} Mutation butuh akses tulis yang sama dengan REST. Referensi API di Studio menampilkan query siap pakai untuk setiap koleksimu dan konsol untuk menjalankannya.