Skip to main content
RapidDev - Software Development Agency
retool-integrationsREST API Resource

How to Integrate Retool with Infusionsoft (by Keap)

Infusionsoft is now Keap. Connect Retool to the legacy Infusionsoft XML-RPC API using a REST API Resource with API key authentication for older integrations, or use the modern Keap REST API v2 with OAuth 2.0 for new builds. Build a CRM migration panel that works with both API versions during the transition from Infusionsoft's XML-RPC patterns to Keap's modern REST endpoints.

What you'll learn

  • How to understand the Infusionsoft vs Keap API versions and which approach fits your integration
  • How to configure a Retool REST API Resource for the Keap REST API v2 with OAuth 2.0 authentication
  • How to query contacts, opportunities, and tags from the Keap REST API in Retool
  • How to build a CRM management dashboard for Keap contacts, pipeline, and email campaigns
  • How to identify migration paths from legacy Infusionsoft XML-RPC patterns to modern Keap REST API calls
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate15 min read35 minutesOtherLast updated April 2026RapidDev Engineering Team
TL;DR

Infusionsoft is now Keap. Connect Retool to the legacy Infusionsoft XML-RPC API using a REST API Resource with API key authentication for older integrations, or use the modern Keap REST API v2 with OAuth 2.0 for new builds. Build a CRM migration panel that works with both API versions during the transition from Infusionsoft's XML-RPC patterns to Keap's modern REST endpoints.

Quick facts about this guide
FactValue
ToolInfusionsoft (by Keap)
CategoryOther
MethodREST API Resource
DifficultyIntermediate
Time required35 minutes
Last updatedApril 2026

Build a Keap (Infusionsoft) CRM Management Panel in Retool

Infusionsoft rebranded to Keap in 2019 and simultaneously introduced a modern REST API v2 alongside the legacy XML-RPC API. Many businesses that adopted Infusionsoft early still have integrations built against the XML-RPC API, while newer Keap installations should use the REST v2 API. Understanding which API version your account uses and building Retool around the appropriate endpoint set is the first architectural decision for this integration.

The Keap REST API v2 is a well-structured REST API covering contacts, companies, opportunities, tags, email records, and automation campaigns. It uses OAuth 2.0 for authentication — a standard flow that Retool supports natively in REST API Resources. Operations teams can use a Retool dashboard built on this API to manage contact records faster than Keap's native interface, track pipeline opportunities with custom filtering, bulk-tag contacts for campaign enrollment, and review email campaign performance statistics.

For teams currently using legacy Infusionsoft XML-RPC integrations, Retool can also call XML-RPC endpoints by sending properly formatted XML payloads via POST requests. This allows you to build read-only reporting dashboards against the old API while planning migration to the REST v2 API, giving your team a bridge period to move incrementally.

Integration method

REST API Resource

Infusionsoft/Keap exposes two distinct API surfaces. The legacy Infusionsoft XML-RPC API at https://api.infusionsoft.com/crm/xmlrpc/v1 uses an application API key passed as a parameter in each request — this is suitable for maintaining existing integrations. The modern Keap REST API v2 at https://api.infusionsoft.com/crm/rest/v2 uses OAuth 2.0 with client credentials and is the recommended approach for all new builds. Retool connects to both via REST API Resource, with different authentication configurations for each. All requests route through Retool's server-side proxy.

Prerequisites

  • A Keap (formerly Infusionsoft) account with API access (Pro or Max plan required for REST API access)
  • A Keap developer application registered at https://keys.developer.keap.com with OAuth 2.0 client credentials
  • Your Keap account's application name (used in some API endpoints) from Settings → Application Settings
  • A Retool account with permission to create Resources
  • Clarity on which API version you need: Keap REST API v2 (recommended for new builds) or legacy Infusionsoft XML-RPC (for maintaining existing integrations)

Step-by-step guide

1

Register a Keap developer application and obtain OAuth credentials

The modern Keap REST API v2 uses OAuth 2.0 for authentication. To obtain credentials, navigate to the Keap Developer Portal at https://keys.developer.keap.com and sign in with your Keap account. Click 'Create a new application' if you have not done so already. Fill in the application name (e.g., 'Retool Integration'), description, and website URL. For the Redirect URI, you must enter the OAuth callback URL that Retool uses — for Retool Cloud this is typically https://oauth.retool.com/oauthcallback. Check your Retool resource configuration for the exact callback URL before entering it here. Select the OAuth scopes your integration requires. For a CRM management dashboard, the key scopes are: 'full' (provides access to all Keap REST API endpoints) or more granular scopes like 'contacts.read', 'contacts.write', 'opportunities.read', 'opportunities.write'. After creating the application, the Keap developer portal displays your Client Key (Client ID) and Client Secret. Copy both values — you will need them in the next step. Note that if you are maintaining a legacy Infusionsoft XML-RPC integration, you can find the XML-RPC API key in your Keap account under Admin → Settings → Application Settings. Look for the 'API Key' section. This is a static key used as a parameter in XML-RPC calls.

Pro tip: If your Keap plan does not include API access (Lite plan), you will need to upgrade to Pro or Max. API access is included in Pro and higher plans. Verify your plan before registering a developer application.

Expected result: You have a registered Keap developer application with OAuth 2.0 client credentials (Client Key and Client Secret) or have located the legacy XML-RPC API key for your account.

2

Create the Keap REST API Resource in Retool with OAuth 2.0

In Retool, click the Resources tab in the left sidebar and click Add Resource. Select REST API from the resource type list. Name the resource 'Keap CRM API'. In the Base URL field, enter: https://api.infusionsoft.com/crm/rest/v2 — note that despite the Infusionsoft domain, this is the current Keap REST API v2 endpoint. Scroll to the Authentication section and select OAuth 2.0 from the dropdown. In the Authorization URL field, enter: https://accounts.infusionsoft.com/app/oauth/authorize. In the Access Token URL field, enter: https://api.infusionsoft.com/token. Enter your Client Key as the Client ID and your Client Secret in the corresponding fields. In the Scopes field, enter 'full' (or your specific scope list, space-separated). Set OAuth flow to Authorization Code. Click the Connect button to initiate the OAuth authorization flow — a browser window opens for you to sign in to your Keap account and grant access. After authorization, Retool stores the access and refresh tokens. Click Save Changes. For teams using the legacy Infusionsoft XML-RPC API, create a separate resource with Base URL https://api.infusionsoft.com/crm/xmlrpc/v1 and no authentication configured in Retool (the API key is passed as a parameter inside the XML body of each request instead).

Pro tip: Keap's OAuth access tokens expire after 24 hours. Retool's OAuth 2.0 resource automatically refreshes tokens using the refresh token when they expire, so the resource remains functional as long as the refresh token is valid (refresh tokens last up to 90 days if used regularly).

Expected result: A Keap CRM API resource appears in your Resources list with a green connected indicator after OAuth authorization completes.

3

Query Keap contacts, tags, and opportunities

Create the foundational queries for the CRM dashboard. In a Retool app, open the Code panel and click + to add a new query. Select your Keap CRM API resource. Name the first query 'getContacts'. Set Method to GET and Path to /contacts. Add URL parameters to control the query: 'limit' set to {{ pagination.pageSize || 50 }}, 'offset' set to {{ pagination.offset || 0 }}, 'given_name' bound to a search text input component, and 'order' set to 'id' with 'order_direction' set to 'descending'. Add a URL parameter 'optional_properties' set to 'custom_fields,opt_in_reason' to retrieve additional contact properties. This endpoint returns a paginated list of contacts with their core fields. Create a second query named 'getTags' with Method GET and Path /tags. This returns all available tags in your Keap account — use this to populate a filter dropdown in the UI. Create a third query named 'getOpportunities' with Method GET and Path /opportunities. Add parameters for 'limit', 'offset', and 'stage_name' filter. Add JavaScript transformers to both the getContacts and getOpportunities queries to normalize the nested response data into flat arrays for display in Retool Tables.

contacts_transformer.js
1// Transformer: normalize Keap contacts for Table display
2const contacts = data.contacts || [];
3return contacts.map(contact => ({
4 id: contact.id,
5 name: [contact.given_name, contact.family_name].filter(Boolean).join(' ') || '(No name)',
6 email: (contact.email_addresses || []).find(e => e.field === 'EMAIL1')?.email || '',
7 phone: (contact.phone_numbers || []).find(p => p.field === 'PHONE1')?.number || '',
8 company: contact.company?.company_name || '',
9 tags: (contact.tag_ids || []).join(', '),
10 owner: contact.owner_name || 'Unassigned',
11 date_created: contact.date_created
12 ? new Date(contact.date_created).toLocaleDateString()
13 : ''
14}));

Pro tip: The Keap API returns phone numbers and email addresses as arrays with field identifiers (EMAIL1, EMAIL2, PHONE1, PHONE2). Always use .find() with the field name to extract the primary address rather than accessing index [0] directly.

Expected result: The getContacts query returns a normalized list of Keap contacts ready for display in a Table. The getTags query returns all available tags for filter dropdowns.

4

Build the Keap CRM management dashboard UI

Assemble the dashboard interface. Drag a Text Input component to the top of the canvas for contact name search — name it 'nameSearch'. Drag a Select component for tag filtering — populate it with {{ getTags.data.tags }} using name as the label and id as the value. Drag a Table component below the search controls. Set its Data to {{ getContacts.data }}. Configure visible columns: name, email, phone, company, tags, owner, date_created. Add a row selection event handler: when a row is selected in the contacts table, trigger the getContactDetail query (Method GET, Path /contacts/{{ contactsTable.selectedRow.id }}, with optional_properties parameter for full fields). Display the contact detail in a right-side Container with panels for basic info, tags, associated opportunities, and recent email history. Add a Tags section to the detail panel: create a query named 'applyTag' with Method POST, Path /contacts/{{ contactsTable.selectedRow.id }}/tags, Body Type JSON, Body { tagIds: [{{ parseInt(tagSelect.value) }}] }. Add a 'Remove Tag' query with Method DELETE, Path /contacts/{{ contactsTable.selectedRow.id }}/tags/{{ selectedTag.value }}. Create an update opportunity stage query using PATCH method to /opportunities/{{ opportunitiesTable.selectedRow.id }} with a body containing the updated stage_name. Configure all write queries with On Success handlers that trigger a refresh of the relevant list query.

apply_tag_body.json
1// Query: Apply a tag to the selected contact
2// Method: POST
3// Path: /contacts/{{ contactsTable.selectedRow.id }}/tags
4// Body Type: JSON
5{
6 "tagIds": [{{ parseInt(tagSelect.value) }}]
7}

Pro tip: Keap's contact update endpoint is PATCH /contacts/{contactId}. When updating contact fields, only include the fields you are modifying in the PATCH body — sending all fields can overwrite data. Use separate Retool query configurations for each field type you need to update.

Expected result: A functional Keap CRM dashboard displays searchable contacts with tag filtering, a contact detail panel, and tag management and opportunity stage update capabilities.

5

Handle legacy Infusionsoft XML-RPC API for existing integrations

For teams maintaining integrations built against the legacy Infusionsoft XML-RPC API, Retool can call XML-RPC endpoints via POST requests with XML bodies. The legacy API is at https://api.infusionsoft.com/crm/xmlrpc/v1. XML-RPC requests are POST requests with Content-Type text/xml, and the body is an XML payload specifying the method name and parameters including your static API key. Create a REST API Resource in Retool with this base URL and no Retool-level authentication (authentication happens via the API key in the XML body). For each query, set Method to POST, Path to empty or /, Body Type to 'raw', and Content-Type header to text/xml. The XML body follows the XML-RPC protocol: include the methodName (e.g., 'ContactService.findByEmail'), a params element with a struct containing the key (your API key) and query parameters. The response is also XML — use a JavaScript transformer to parse the XML string using the DOMParser API: const parser = new DOMParser(); const xml = parser.parseFromString(data, 'text/xml'). Extract values from the XML DOM. Key XML-RPC methods available include ContactService.findByEmail, ContactService.load, InvoiceService.calculateAmountOwed, and DataService.query for generic table queries. For complex integrations involving both legacy XML-RPC data and modern REST API data during a migration period, RapidDev's team can help architect a unified Retool dashboard that bridges both API versions.

xmlrpc_request.xml
1<!-- Example Infusionsoft XML-RPC request body -->
2<!-- Method: POST to https://api.infusionsoft.com/crm/xmlrpc/v1 -->
3<!-- Content-Type: text/xml -->
4<?xml version='1.0' encoding='UTF-8'?>
5<methodCall>
6 <methodName>ContactService.findByEmail</methodName>
7 <params>
8 <param><value><string>{{ retoolContext.configVars.INFUSIONSOFT_API_KEY }}</string></value></param>
9 <param><value><string>{{ emailSearch.value }}</string></value></param>
10 <param><value><array><data>
11 <value><string>Id</string></value>
12 <value><string>FirstName</string></value>
13 <value><string>LastName</string></value>
14 <value><string>Email</string></value>
15 </data></array></value></param>
16 </params>
17</methodCall>

Pro tip: The legacy Infusionsoft XML-RPC API is not being actively developed and Keap has announced plans to eventually deprecate it. If you are building a new integration, use the Keap REST API v2 from the start rather than the XML-RPC API, even if your existing processes still use XML-RPC.

Expected result: Legacy Infusionsoft XML-RPC API queries execute successfully from Retool, returning contact data that can be parsed from XML responses using DOMParser in JavaScript transformers.

Common use cases

Build a Keap contact and opportunity management panel

Create a Retool CRM dashboard that displays Keap contacts with filterable search by tag, company, owner, and status. Show contact detail panels with their associated opportunities, recent email activity, and tag history. Add a quick-action panel for adding tags, updating opportunity stages, and creating follow-up tasks — giving sales teams a faster CRM interface than Keap's native application for high-volume contact management scenarios.

Retool Prompt

Build a Retool dashboard that searches Keap contacts by name, email, or company and displays results in a Table with columns for name, email, phone, primary tag, and owner. When a contact is selected, show a detail panel with their open opportunities and recent email history. Add buttons to update the opportunity stage and apply tags to the selected contact.

Copy this prompt to try it in Retool

Build a sales pipeline and opportunity tracking dashboard

Create a Retool opportunity management panel that shows all open opportunities in Keap grouped by pipeline stage. Display opportunity value, owner, estimated close date, and days since last activity. Use Charts to visualize pipeline value by stage and forecast charts for expected monthly close value. Add inline editing for opportunity stages and owner reassignment so sales managers can update pipeline status directly from the Retool dashboard.

Retool Prompt

Build a Retool sales pipeline dashboard that queries all Keap opportunities, groups them by stage in a Chart, and displays them in a Table with opportunity name, value, owner, close date, and days since last activity. Include a stage update dropdown that triggers a Keap API update when changed, and a Chart showing pipeline value by stage with month-over-month trend.

Copy this prompt to try it in Retool

Build a Keap contact tag management and segmentation tool

Create a Retool bulk contact management panel that allows marketing operations teams to search for contacts matching specific criteria and apply or remove tags in bulk for campaign segmentation. Show tag application history and contact count per tag. Add a campaign enrollment panel that triggers Keap automation sequences for the selected contact segment. This is particularly useful for teams managing large Keap contact databases where Keap's native bulk operations are slow or limited.

Retool Prompt

Build a Retool contact segmentation tool that queries Keap contacts with multi-select filters for tags, owner, and date added. Display matching contacts in a Table with checkboxes for bulk selection. Add 'Apply Tag' and 'Remove Tag' buttons that call the Keap API to update all selected contacts. Show a summary chart of contact distribution by primary tag.

Copy this prompt to try it in Retool

Troubleshooting

OAuth 2.0 flow fails with 'invalid_client' error during Retool resource authorization

Cause: The Client Key (Client ID) or Client Secret entered in Retool does not match what was issued by the Keap developer portal, or the redirect URI configured in Retool does not match the one registered in the Keap developer app.

Solution: In the Keap developer portal at https://keys.developer.keap.com, verify your application's Client Key and Client Secret. Compare these exactly with what is configured in Retool's Resource OAuth settings. Check that the Redirect URI in the Keap developer app exactly matches the OAuth callback URL shown in Retool's resource configuration (including whether it uses a trailing slash or not). Even a minor difference causes the invalid_client error.

Keap API returns 403 Forbidden for write operations (creating contacts, applying tags)

Cause: The OAuth scope granted during authorization does not include write permissions. Using the 'full' scope during initial authorization is recommended, but if a more limited scope was used, write operations may be blocked.

Solution: In Retool, delete and recreate the Keap CRM API Resource. During OAuth configuration, ensure the Scopes field includes 'full' or the specific write scopes needed. Then re-authorize the resource. The OAuth token obtained during initial authorization is scoped to whatever permissions were requested at that time — adding write scopes later requires a full re-authorization.

Contact search returns empty results even though contacts exist in the Keap account

Cause: The search parameter format for Keap contacts is case-sensitive for field names, and partial matches may not work for all fields. The 'given_name' and 'family_name' parameters perform prefix matching, not contains matching.

Solution: Verify the URL parameter names match Keap's API documentation exactly: use 'given_name' (not 'first_name') and 'family_name' (not 'last_name'). For email search, use the 'email' parameter. Test the query with no filter parameters first to confirm the base query returns contacts, then add filters incrementally. For full-text search across multiple fields, use the '/contacts/search' endpoint which supports broader query matching.

Legacy Infusionsoft XML-RPC requests return an error struct in the XML response instead of expected data

Cause: XML-RPC API errors are returned as successful HTTP 200 responses with a 'fault' element in the response XML rather than HTTP error codes. Standard error checking that relies on HTTP status codes will miss these errors.

Solution: In your JavaScript transformer for XML-RPC responses, check for the presence of a 'fault' element in the XML response before attempting to parse the data: const fault = xml.querySelector('fault'); if (fault) { throw new Error('XML-RPC fault: ' + fault.textContent); }. Common fault codes include 1200 (bad API key), 1201 (bad method name), and various contact service errors documented in the legacy Infusionsoft API reference.

typescript
1// Check for XML-RPC fault before parsing data
2const parser = new DOMParser();
3const xml = parser.parseFromString(data, 'text/xml');
4const fault = xml.querySelector('methodResponse > fault');
5if (fault) {
6 const faultString = fault.querySelector('name + value')?.textContent;
7 throw new Error('XML-RPC Error: ' + faultString);
8}
9// Continue with normal response parsing...

Best practices

  • Use the Keap REST API v2 for all new Retool integrations — the legacy XML-RPC API is not being actively developed and will eventually be deprecated, making new XML-RPC integrations a migration liability
  • Store the Keap client secret in Retool Configuration Variables as a secret rather than embedding it directly in resource OAuth settings — this enables credential rotation without disrupting the resource configuration
  • Request the 'full' OAuth scope during initial Keap authorization unless your security requirements demand granular scope control — re-authorization is required to add scopes later
  • Use PATCH requests (not PUT) when updating Keap contacts and opportunities — PATCH updates only the specified fields, while PUT would replace the entire object and could overwrite data unintentionally
  • Add confirmation modals to all write operations (tag application, opportunity stage updates, contact deletions) to prevent accidental modifications to production CRM data
  • For bulk contact operations on large lists, use Retool Workflows with a Loop block and configurable batch sizes rather than triggering API calls in JavaScript forEach loops — this provides retry logic and avoids Keap's rate limits
  • Cache the getTags query results (they change infrequently) with a long cache duration (10-15 minutes) to reduce API calls when multiple team members use the CRM dashboard simultaneously

Alternatives

Frequently asked questions

Is Infusionsoft the same as Keap? Which API should I use?

Yes, Infusionsoft was rebranded to Keap in 2019. The company offers two API surfaces: the legacy Infusionsoft XML-RPC API (still available but not actively developed) and the modern Keap REST API v2 (recommended for all new integrations). If you have existing integrations built against the XML-RPC API, they continue to work. For new Retool integrations, use the Keap REST API v2 with OAuth 2.0 authentication.

Does Retool have a native Keap or Infusionsoft connector?

No, Retool does not have a native Keap or Infusionsoft connector. You connect using a REST API Resource — for the modern Keap REST API v2 with OAuth 2.0, or for legacy Infusionsoft XML-RPC with API key authentication embedded in XML request bodies. Configure one resource per API version if you need to query both during a migration period.

What Keap plan is required to use the API?

Keap API access requires a Pro or Max plan. The Lite plan does not include API access. If you are evaluating the integration, verify your Keap account plan before registering a developer application. Contact Keap support to confirm which API endpoints are available for your plan tier.

How do I handle rate limits in the Keap API?

Keap's REST API v2 enforces rate limits per application — the specific limits depend on your plan. If you encounter 429 Too Many Requests responses in Retool, add query caching (Settings → Cache in query configuration) to reduce redundant API calls. For bulk operations that process many contacts, use Retool Workflows with a Loop block that includes a delay between iterations using a Wait block to stay within rate limits.

Can I migrate data from Infusionsoft XML-RPC to Keap REST API v2 using Retool?

Retool can facilitate migration by reading data from the XML-RPC API using one resource and writing it (in the correct REST API v2 format) using a separate Keap REST API resource — but this is complex because data structures differ between the two APIs. For large-scale data migrations, Keap's own migration tools or a dedicated ETL service are more appropriate. Retool is better suited for building operational dashboards that work with whichever API version your current account supports.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire Retool integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.