Search all guides

Reference · Tools

Keap integration

Manage companies, contacts, notes, tags, e-commerce orders, products, emails, and files in Keap (formerly Infusionsoft).

Action (binary) Sales v1 Binary data

The Keap node covers a wide slice of the CRM: companies, contacts, notes, tags, e-commerce orders and products, emails with attachments, and file uploads. A typical build is upserting a contact on purchase, tagging them by product, and attaching the receipt to their record.

Works as
Action (binary)
Tool name
keap
Operations
10 — Create , Get Many , Create or Update , Delete , Get and 5 more
Parameters
86
Outputs
Output, Error
Credentials
Keap OAuth2
Official docs
Keap docs developer.keap.com

What you can build with Keap

  • Create a new contact in Keap.
  • Upload a file to a Keap contact record.
  • Send an email with binary attachments through Keap.
  • List all companies in Keap CRM.
  • Create an ecommerce order in Keap.

Overview

The Keap tool provides comprehensive CRM operations against the Keap (Infusionsoft) REST API v1. It supports 8 resources: Company (create, getAll), Contact (upsert, delete, get, getAll), Contact Note (create, delete, get, getAll, update), Contact Tag (create, delete, getAll), Ecommerce Order (create, delete, get, getAll), Ecommerce Product (create, delete, get, getAll), Email (createRecord, deleteRecord, getAll, send with binary attachments), and File (delete, getAll, upload with binary data). File upload reads binary data from upstream items. Email send supports attaching binary data from upstream items. Uses OAuth2 Bearer token authentication with automatic refresh.

Node Type

Action (Binary) — handles file/binary data operations

Input / Output

DirectionPort(s)
InputInput
OutputOutput, Error

Credentials

This tool requires Keap OAuth2 credentials. See the Credentials Guide for setup instructions.

Resources

ResourceValue
Companycompany
Contactcontact
Contact NotecontactNote
Contact TagcontactTag
Ecommerce OrderecommerceOrder
Ecommerce ProductecommerceProduct
Emailemail
Filefile

Operations

Which operations are available depends on the selected resource — see the parameter subsections below.

OperationValueDescription
CreatecreateCreate a company, note, order or product — or add tags to a contact.
Get ManygetAllRetrieve many records of the selected resource.
Create or UpdateupsertCreate a new contact, or update if it already exists (upsert).
DeletedeleteDelete a contact, note, order, product or file — or remove tags from a contact.
GetgetRetrieve a single contact, note, order or product.
UpdateupdateUpdate a note.
Create RecordcreateRecordCreate a record of an email sent.
Delete RecorddeleteRecordDelete an email record.
SendsendSend an email.
UploaduploadUpload a file.

Parameters

Company: Create

ParameterTypeRequiredDefaultDescription
Company NamestringYes—Name of the company to create.
Additional FieldscollectionNo{}Optional fields sent with the new company.
— EmailstringNo—Email address for the company.
— NotesstringNo—Free-text notes stored on the company record.
— Opt In ReasonstringNo—Why the company opted in to marketing.
— WebsitestringNo—Company website address.
AddressjsonNo{}Company address as JSON: { “country_code”: “US”, “line1”: “123 Main St”, “locality”: “City”, “region”: “CA”, “zip_code”: “90210” }
FaxjsonNo{}Company fax as JSON: { “type”: “FAX1”, “number”: “+1234567890” }
PhonejsonNo{}Company phone as JSON: { “type”: “PHONE1”, “number”: “+1234567890” }

Company: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit
LimitnumberNo100Max number of results to return (shown when Return All is false)
OptionscollectionNo{}Extra settings applied to the search.
— Company NamestringNo—Company name to query on
— OrderoptionsNo—Which field the results are sorted by.
Options: datecreated (Date Created), id, name
— Order DirectionoptionsNo—Sort direction.
Options: ascending (ASC), descending (DESC)
— FieldsstringNo—Comma-delimited list of Company properties to include in the response.

Contact: Create or Update

ParameterTypeRequiredDefaultDescription
Duplicate OptionoptionsYesemailDuplicate checking option. If a match is found, the existing contact is updated.
Options: email, emailAndName (Email And Name)
Additional FieldscollectionNo{}Optional fields sent with the contact.
— AnniversarystringNo—The contact’s anniversary date.
— Company IDnumberNo0ID of the company the contact belongs to.
— Contact TypestringNo—Contact type. Use GET /setting/contact/optionTypes to list available types.
— Family NamestringNo—The contact’s family (last) name.
— Given NamestringNo—The contact’s given (first) name.
— IP AddressstringNo—Originating IP address recorded with the contact.
— Job TitlestringNo—The contact’s job title.
— Lead Source IDnumberNo0ID of the lead source the contact came from.
— Middle NamestringNo—The contact’s middle name.
— Opt In ReasonstringNo—Why the contact opted in to marketing.
— Owner IDstringNo—User ID of the contact owner. Use GET /users to list available users.
— Preferred LocalestringNo—The contact’s preferred locale.
— Preferred NamestringNo—The name the contact prefers to be called.
— Source TypeoptionsNo—How the contact record originated.
Options: API, IMPORT (Import), LANDINGPAGE (Landing Page), MANUAL (Manual), OTHER (Other), UNKNOWN (Unknown)
— Spouse NamestringNo—Name of the contact’s spouse.
— TimezonestringNo—IANA timezone string (e.g. America/New_York)
— WebsitestringNo—The contact’s website address.
AddressesjsonNo[]Contact addresses as JSON array: [{ “field”: “BILLING”, “country_code”: “US”, “line1”: “123 Main St”, “locality”: “City”, “region”: “CA”, “zip_code”: “90210” }]
EmailsjsonNo[]Contact emails as JSON array: [{ “field”: “EMAIL1”, “email”: “user@example.com” }]
FaxesjsonNo[]Contact fax numbers as JSON array: [{ “field”: “FAX1”, “number”: “+1234567890” }]
PhonesjsonNo[]Contact phones as JSON array: [{ “field”: “PHONE1”, “number”: “+1234567890” }]
Social AccountsjsonNo[]Social accounts as JSON array: [{ “type”: “Facebook”, “name”: “username” }]

Contact: Delete

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—ID of the contact to delete.

Contact: Get

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—ID of the contact to retrieve.
OptionscollectionNo{}Extra settings applied to the lookup.
— FieldsstringNo—Comma-delimited list of Contact properties to include.

Contact: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit
LimitnumberNo100Max number of results to return (shown when Return All is false)
OptionscollectionNo{}Filters and sorting applied to the search.
— EmailstringNo—Return contacts with this email address.
— Given NamestringNo—Return contacts with this given (first) name.
— Family NamestringNo—Return contacts with this family (last) name.
— OrderoptionsNo—Which field the results are sorted by.
Options: date (Date), email, id, name
— Order DirectionoptionsNo—Sort direction.
Options: ascending (ASC), descending (DESC)
— SincestringNo—Date to start searching from (LastUpdated)
— UntilstringNo—Date to search to (LastUpdated)

Contact Note: Create

ParameterTypeRequiredDefaultDescription
User IDstringNo—The Keap user ID to create the note on behalf of. Use GET /users to list available users.
Contact IDstringNo—ID of the contact the note is attached to.
Additional FieldscollectionNo{}Optional fields sent with the new note.
— BodystringNo—Body text of the note.
— TitlestringNo—Title of the note.
— TypeoptionsNo—What kind of interaction the note records.
Options: appointment, call, email, fax, letter, other

Contact Note: Delete

ParameterTypeRequiredDefaultDescription
Note IDstringYes—ID of the note to delete.

Contact Note: Get

ParameterTypeRequiredDefaultDescription
Note IDstringYes—ID of the note to retrieve.

Contact Note: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit
LimitnumberNo100Max number of results to return (shown when Return All is false)
FilterscollectionNo{}Narrow which notes are returned.
— Contact IDnumberNo0Only return notes attached to this contact.
— User IDstringNo—Filter by user ID. Use GET /users to list available users.

Contact Note: Update

ParameterTypeRequiredDefaultDescription
Note IDstringYes—ID of the note to update.
Additional FieldscollectionNo{}The fields to change. Anything you leave out is left as it is.
— BodystringNo—Body text of the note.
— Contact IDnumberNo0Move the note to this contact.
— TitlestringNo—Title of the note.
— TypeoptionsNo—What kind of interaction the note records.
Options: appointment, call, email, fax, letter, other
— User IDstringNo—The Keap user ID. Use GET /users to list available users.

Contact Tag: Create

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—The contact whose tags you are working with.
Tag IDsstringYes—Comma-separated tag IDs to apply. Use GET /tags to list available tags.

Contact Tag: Delete

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—The contact whose tags you are working with.
Tag IDsstringYes—Comma-separated tag IDs to remove.

Contact Tag: Get Many

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—The contact whose tags you are working with.
Return AllbooleanNofalseWhether to return all results or only up to a given limit
LimitnumberNo100Max number of results to return (shown when Return All is false)

Ecommerce Order: Create

ParameterTypeRequiredDefaultDescription
Contact IDstringYes—ID of the contact the order belongs to.
Order DatestringYes—ISO 8601 date string
Order TitlestringYes—Title of the order.
Order TypeoptionsYesofflineWhether the order was placed online or offline.
Options: offline, online
Additional FieldscollectionNo{}Optional fields sent with the new order.
— Lead Affiliate IDnumberNo0ID of the affiliate credited with the lead.
— Promo CodesstringNo—Comma-separated promo codes
— Sales Affiliate IDnumberNo0ID of the affiliate credited with the sale.
Shipping AddressjsonNo{}Shipping address as JSON: { “company”: “Acme”, “country_code”: “US”, “first_name”: “John”, “last_name”: “Doe”, “line1”: “123 Main St”, “locality”: “City”, “region”: “CA”, “zip_code”: “90210” }
Order ItemsjsonNo[]Order items as JSON array: [{ “description”: “Widget”, “price”: 10.00, “product_id”: 1, “quantity”: 2 }]

Ecommerce Order: Delete

ParameterTypeRequiredDefaultDescription
Order IDstringYes—ID of the order to delete.

Ecommerce Order: Get

ParameterTypeRequiredDefaultDescription
Order IDstringYes—ID of the order to retrieve.

Ecommerce Order: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit
LimitnumberNo100Max number of results to return (shown when Return All is false)
OptionscollectionNo{}Filters applied to the search.
— SincestringNo—Only return orders from this date onwards.
— UntilstringNo—Only return orders up to this date.
— PaidbooleanNofalseOnly return paid orders.
— OrderstringNo—Which field the results are sorted by.
— Contact IDnumberNo0Only return orders belonging to this contact.
— Product IDnumberNo0Only return orders containing this product.

Ecommerce Product: Create

ParameterTypeRequiredDefaultDescription
Product NamestringYes—Name of the product to create.
Additional FieldscollectionNo{}Optional fields sent with the new product.
— ActivebooleanNofalseWhether the product is active.
— Product DescriptionstringNo—Long description of the product.
— Product PricenumberNo0Price of the product.
— Product Short DescriptionstringNo—Short description of the product.
— SKUstringNo—Stock-keeping unit code.
— Subscription OnlybooleanNofalseWhether the product is sold only as a subscription.

Ecommerce Product: Delete

ParameterTypeRequiredDefaultDescription
Product IDstringYes—ID of the product to delete.

Ecommerce Product: Get

ParameterTypeRequiredDefaultDescription
Product IDstringYes—ID of the product to retrieve.

Ecommerce Product: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit
LimitnumberNo100Max number of results to return (shown when Return All is false)
FilterscollectionNo{}Narrow which products are returned.
— ActivebooleanNofalseOnly return active products.

Email: Create Record

ParameterTypeRequiredDefaultDescription
Sent To AddressstringYes—Address the email was sent to.
Sent From AddressstringYes—Address the email was sent from.
Additional FieldscollectionNo{}Optional fields stored on the email record.
— Clicked DatestringNo—When a link in the email was clicked.
— Contact IDnumberNo0Contact the email record belongs to.
— HeadersstringNo—Raw email headers.
— HTML ContentstringNo—Base64 encoded HTML
— Opened DatestringNo—When the email was opened.
— Original ProvideroptionsNoUNKNOWNWhich system originally sent the email.
Options: UNKNOWN, INFUSIONSOFT, MICROSOFT, GOOGLE
— Original Provider IDstringNo—The sending system’s own identifier for the email.
— Plain ContentstringNo—Base64 encoded text
— Provider Source IDstringNo—Source identifier supplied by the provider.
— Received DatestringNo—When the email was received.
— Sent DatestringNo—When the email was sent.
— Sent From Reply AddressstringNo—Reply-to address used for the email.
— Sent To BCC AddressesstringNo—BCC recipients of the email.
— Sent To CC AddressesstringNo—CC recipients of the email.
— SubjectstringNo—Subject line of the email.

Email: Delete Record

ParameterTypeRequiredDefaultDescription
Email Record IDstringYes—ID of the email record to delete.

Email: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit
LimitnumberNo100Max number of results to return (shown when Return All is false)
FilterscollectionNo{}Narrow which sent emails are returned.
— Contact IDnumberNo0Only return emails for this contact.
— EmailstringNo—Only return emails for this address.
— Since Sent DatestringNo—Only return emails sent on or after this date.
— Until Sent DatestringNo—Only return emails sent on or before this date.

Email: Send

ParameterTypeRequiredDefaultDescription
User IDstringYes—The Keap user to send the email on behalf of. Use GET /users to list available users.
Contact IDsstringNo—Comma-separated contact IDs to receive the email.
SubjectstringNo—Subject line of the email.
Additional FieldscollectionNo{}Optional fields sent with the email.
— Address FieldstringNo—Email field of each Contact record to address the email to (e.g. EmailAddress1)
— HTML ContentstringNo—HTML content encoded in Base64
— Plain ContentstringNo—Plain text content encoded in Base64
Manual AttachmentsjsonNo[]Manual attachments as JSON array: [{ “file_data”: “base64…”, “file_name”: “doc.pdf” }]
Binary Attachment PropertiesstringNo—Comma-separated binary property names from upstream items to attach to the email.

File: Delete

ParameterTypeRequiredDefaultDescription
File IDstringYes—ID of the file to delete.

File: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit
LimitnumberNo100Max number of results to return (shown when Return All is false)
FilterscollectionNo{}Narrow which files are returned.
— Contact IDnumberNo0Only return files attached to this contact.
— NamestringNo—Filter by name. Use * for LIKE queries.
— PermissionoptionsNobothWhose files to return.
Options: user, company, both
— TypeoptionsNo—Restrict results to one kind of stored file.
Options: application, attachment, contact, digitalProduct (Digital Product), fax, funnel, hidden, image, import, logoThumnail (Logo Thumbnail), reSampledImage (Re Sampled Image), styleCart (Style Cart), templateThumnail (Template Thumbnail), ticket, webform
— ViewableoptionsNobothRestrict results by visibility.
Options: public, private, both

File: Upload

ParameterTypeRequiredDefaultDescription
Binary FilebooleanNofalseWhether to upload binary data from the upstream item
Binary PropertystringNodataName of the binary property on the upstream item containing the file to upload (shown when Binary File is true)
File AssociationoptionsYescontactWhat the uploaded file is attached to.
Options: company, contact, user
Contact IDstringYes—ID of the contact to attach the file to. (shown when File Association is contact)
File NamestringYes—Filename including extension (used when binaryData is false) (shown when Binary File is false)
File DatastringYes—Base64-encoded file content (used when binaryData is false) (shown when Binary File is false)
Is PublicbooleanNofalseWhether the uploaded file is publicly readable.

All Operations

ParameterTypeRequiredDefaultDescription
Keap AccountcredentialNo—Connect your Keap account via OAuth2.
Max ConcurrencynumberNo10Maximum number of items to process concurrently.

Output Data

Keap’s response is merged onto the input item’s JSON in every operation — your existing fields survive and Keap’s fields are added alongside them, overwriting any key of the same name. Binary data on the input item is forwarded to the output item, including on the file and email operations that read binary from it.

OperationOutput items per input item
getAll (every resource)One per record returned, so a single input item fans out across the whole result set.
create, upsert, get, update, createRecord, uploadOne — the record Keap returned, merged onto the item.
delete, deleteRecord, sendOne — a fixed acknowledgement merged onto the item.

Deletes (contact, note, tag removal, order, product, email record, file) and Email: Send do not return a record. They merge this onto the item instead:

{
  "success": true
}

Three behaviours are worth planning for:

  • A getAll that matches nothing produces no output items at all. The input item does not pass through — that branch of the workflow simply goes quiet. If a downstream node must run regardless, do not depend on this node emitting something.
  • Return All changes how much is fetched, not the shape. On, Keap is paged through until every record is collected. Off, one page is fetched, capped at Limit — which accepts values from 1 to 200 and defaults to 100.
  • An operation that returns no content leaves the item untouched. Nothing is merged, so the item arrives downstream carrying only the fields it came in with. Test for a field you expect rather than assuming the call wrote something.

The record fields themselves are whatever Keap returns, under Keap’s own property names — the node does not rename, nest or filter them. Those names are snake_case, which is also the form the Fields options take (id,company_name,email_address). Reference them downstream by expression, e.g. {{ $json.id }}.

Example Configuration

Create a company with an address and a phone number:

{
  "type": "keap",
  "parameters": {
    "resource": "company",
    "operation": "create",
    "companyName": "{{ $json.company }}",
    "additionalFields": {
      "emailAddress": "{{ $json.email }}",
      "notes": "New potential client",
      "website": "{{ $json.website }}"
    },
    "addressesUi": {
      "country_code": "US",
      "line1": "123 Business Ave",
      "locality": "New York",
      "region": "NY",
      "zip_code": "10001"
    },
    "phonesUi": {
      "type": "PHONE1",
      "number": "{{ $json.phone }}"
    }
  }
}

Create a contact, or update the existing one when the email already exists:

{
  "type": "keap",
  "parameters": {
    "resource": "contact",
    "operation": "upsert",
    "duplicateOption": "email",
    "additionalFields": {
      "givenName": "{{ $json.firstName }}",
      "familyName": "{{ $json.lastName }}",
      "jobTitle": "{{ $json.title }}",
      "sourceType": "API",
      "optInReason": "Website contact form"
    },
    "emailsUi": [
      {
        "field": "EMAIL1",
        "email": "{{ $json.email }}"
      }
    ],
    "phonesUi": [
      {
        "field": "PHONE1",
        "number": "{{ $json.phone }}"
      }
    ]
  }
}

List recently updated contacts, newest first, one output item per contact:

{
  "type": "keap",
  "parameters": {
    "resource": "contact",
    "operation": "getAll",
    "returnAll": false,
    "limit": 50,
    "options": {
      "order": "date",
      "orderDirection": "descending",
      "since": "2026-01-01T00:00:00Z"
    }
  }
}

Attach a file that arrived from an upstream node to a contact record:

{
  "type": "keap",
  "parameters": {
    "resource": "file",
    "operation": "upload",
    "binaryData": true,
    "binaryPropertyName": "data",
    "fileAssociation": "contact",
    "contactId": "{{ $json.contactId }}",
    "isPublic": false
  }
}

Send an email to several contacts with an upstream file attached:

{
  "type": "keap",
  "parameters": {
    "resource": "email",
    "operation": "send",
    "userId": "{{ $json.keapUserId }}",
    "contactIds": "{{ $json.contactIds }}",
    "subject": "Your invoice",
    "additionalFields": {
      "addressField": "EmailAddress1",
      "htmlContent": "{{ $json.htmlBase64 }}"
    },
    "attachmentsBinary": "data"
  }
}

Error Handling

ModeBehavior
stopHalts workflow on first error
continueSkips failed items, passes successful ones through
errorPortRoutes failed items to Error output port

Tips

The Keap tool manages companies, contacts, notes, tags, ecommerce orders, products, emails, and files. It is ideal for comprehensive CRM operations, including creating, updating, deleting, and retrieving various records, and for sending emails with attachments or uploading files. It produces updated CRM records, sent emails, and uploaded files, or retrieves requested information about these objects.

Common Patterns

Pattern 1: Complete Contact Management Workflow

  1. Create/Update Contact: Use upsert operation with email duplicate checking
  2. Add Tags: Use contactTag create to categorize contacts
  3. Add Notes: Use contactNote create for activity tracking
  4. Upload Files: Attach documents to contact records

Pattern 2: E-commerce Integration

  1. Create Products: Set up product catalog
  2. Create Orders: Process customer orders with line items
  3. Send Confirmation: Use email send with order details
  4. Track Activity: Create email records for sent communications

Pattern 3: Company and Contact Relationship

  1. Create Company: Establish company record
  2. Create Contacts: Link contacts to company using companyId
  3. Manage Communications: Send emails and track interactions
  4. Document Management: Upload and organize files by association

Key Implementation Notes

  1. Collection Parameters: Always use flat object structure
  2. JSON Fields: Use proper JSON format for complex fields like addresses and emails
  3. ID References: Many operations require existing IDs from previous operations
  4. Pagination: Use returnAll: false with limit for large datasets
  5. Binary Data: Choose between binaryData: true (from upstream) or binaryData: false (manual upload)
  6. Duplicate Handling: Use duplicateOption for contact upsert operations to control matching logic

Frequently asked questions

How do I avoid duplicate contacts?

Use the upsert operation with email duplicate checking, which matches an existing contact rather than creating a second one — the foundation of any repeatable contact sync.

What does a full contact workflow look like?

Create or update the contact, add tags with contactTag create to categorise them, add activity with contactNote create, and upload any documents onto the record.

Can it handle e-commerce?

Yes — products and orders with line items are both supported, so a purchase can create the product catalogue entry and the order in the same workflow.

Which credential does it need?

A Keap OAuth2 credential, which also covers the Keap Trigger.

Build with Keap

Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need Keap OAuth2 credentials first.

Open BusyBot

Last reviewed . Spotted something wrong? Tell us.