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:

FieldTipeFungsinya
records_deals(limit, offset, query)queryDaftar record. query menerima objek query.
record_deals(id)queryAmbil satu record.
create_deals(input)mutationBuat record.
update_deals(id, input)mutationUbah sebagian field.
delete_deals(id)mutationHapus 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.

Langkah berikutnya

Traktir kopi