Retool

Retool

Gate AI-initiated actions in Retool internal tools — database writes, bulk updates, and external API calls — behind a human approval step using Cheqpoint's inbound webhooks.

Use case

Retool is often used to build admin panels where AI assists with bulk data operations. Cheqpoint provides a safety valve: before your Retool Workflow executes a query that mutates data, it hits Cheqpoint and waits for a human verdict. This prevents "hallucinated" bulk edits from reaching your production database.

Prerequisites

  • Retool workspace with Workflows or Apps enabled.
  • Cheqpoint Connection Key.

Sample request payload — bulk role update

json
{
  "action": "bulk_update_user_roles",
  "summary": "AI tool requesting bulk role upgrade for 340 users",
  "details": {
    "role_from": "viewer",
    "role_to": "editor",
    "user_count": 340,
    "filter_criteria": "active_last_30_days"
  }
}

Sample Cheqpoint response

json
{
  "status": "approved",
  "modifiedDetails": {
    "user_count": 290,
    "filter_criteria": "tenure_months > 3"
  },
  "decisionNote": "Approved with tighter filter — exclude recently onboarded users."
}

Implementation in Retool Workflows

Use a REST API block or a JavaScript block to communicate with Cheqpoint.

// Retool Workflow JS block to gate a sensitive action
const CQ_API_KEY = process.env.CQ_API_KEY;

const response = await fetch('https://cheqpoint.co/api/webhooks/inbound', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-api-key': CQ_API_KEY
  },
  body: JSON.stringify({
    action: "db_bulk_delete",
    summary: "AI requesting deletion of inactive users",
    details: {
      userIds: [102, 441, 502],
      reason: "Inactive for > 12 months"
    }
  })
});

const approval = await response.json();

if (approval.status === 'approved') {
  // Use modifiedDetails if available, otherwise original
  const finalIds = approval.modifiedDetails?.userIds || [102, 441, 502];
  return await db_delete_query.trigger({ userIds: finalIds });
} else if (approval.status === 'pending') {
  // Handle async: either poll or use a callback URL
  throw new Error("Approval pending. Workflow will resume on callback.");
} else {
  throw new Error(`Rejected: ${approval.decisionNote}`);
}

Async handling

For long-running human reviews, pass a callbackUrl in your request. Cheqpoint will POST the decision to that URL, which can trigger a second Retool Workflow to resume the process.

Get your Connection Key at cheqpoint.co/signup.