Setting Up Retool for REST/GraphQL API Integration
Retool connects to any REST or GraphQL API as a resource. This allows building internal tools on top of existing APIs without direct database access.
REST API Resource
In Retool → Resources → REST API:
Base URL: https://api.example.com/v1
Headers:
Authorization: Bearer {{ retoolContext.userInfo.email }}
Content-Type: application/json
X-Service: retool-internal
For dynamic tokens, use Custom Auth with OAuth2 or retrieve a token via a separate query.
REST Queries in Retool
// Query: getUsers
{
"method": "GET",
"path": "/users",
"queryParams": {
"search": "{{ searchInput.value }}",
"status": "{{ statusFilter.value }}",
"page": "{{ currentPage.value }}",
"limit": "20"
}
}
// Query: updateUserStatus
{
"method": "PATCH",
"path": "/users/{{ usersTable.selectedRow.data.id }}",
"body": {
"status": "{{ newStatusSelect.value }}",
"reason": "{{ reasonInput.value }}"
}
}
GraphQL Resource
# Query: fetchDashboardData
query GetDashboard($userId: ID!, $ordersLimit: Int!) {
user(id: $userId) {
id
name
email
subscription { plan, status, expiresAt }
orders(limit: $ordersLimit) {
id
status
total
createdAt
}
}
}
Variables in Retool:
{
"userId": "{{ userIdInput.value }}",
"ordersLimit": 10
}
Transformers
JavaScript for transforming API responses:
// Transformer for formatting table data
return data.users.map(user => ({
...user,
createdAt: new Date(user.createdAt).toLocaleDateString('en-US'),
statusLabel: { active: 'Active', blocked: 'Blocked' }[user.status] || user.status,
lifetimeValue: `$${user.lifetimeValue.toLocaleString('en-US')}`
}));
Webhook Triggers
Retool Workflows can be triggered via Webhook from external systems. Example: when a complaint arrives in Zendesk, automatically open the user profile in the Retool support tool.
Timeline
Connecting REST/GraphQL resources and 5–10 queries with transformers — 1–2 days.







