Reference · Tools

Keap

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.

Node type
Action (binary)
Parameters
86
Outputs
Output, Error
Credentials
Keap OAuth2

Keap

Manage Keap CRM contacts, companies, orders, emails, and files

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.

Category: Sales
Tool Name: keap
Version: 1

Appearance: Icon: lucide-CircleDollarSign | Color: #39C049

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 NamestringYesName of the company to create.
Additional FieldscollectionNo{}Optional fields sent with the new company.
— EmailstringNoEmail address for the company.
— NotesstringNoFree-text notes stored on the company record.
— Opt In ReasonstringNoWhy the company opted in to marketing.
— WebsitestringNoCompany 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 NamestringNoCompany name to query on
— OrderoptionsNoWhich field the results are sorted by.
Options: datecreated (Date Created), id, name
— Order DirectionoptionsNoSort direction.
Options: ascending (ASC), descending (DESC)
— FieldsstringNoComma-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.
— AnniversarystringNoThe contact’s anniversary date.
— Company IDnumberNo0ID of the company the contact belongs to.
— Contact TypestringNoContact type. Use GET /setting/contact/optionTypes to list available types.
— Family NamestringNoThe contact’s family (last) name.
— Given NamestringNoThe contact’s given (first) name.
— IP AddressstringNoOriginating IP address recorded with the contact.
— Job TitlestringNoThe contact’s job title.
— Lead Source IDnumberNo0ID of the lead source the contact came from.
— Middle NamestringNoThe contact’s middle name.
— Opt In ReasonstringNoWhy the contact opted in to marketing.
— Owner IDstringNoUser ID of the contact owner. Use GET /users to list available users.
— Preferred LocalestringNoThe contact’s preferred locale.
— Preferred NamestringNoThe name the contact prefers to be called.
— Source TypeoptionsNoHow the contact record originated.
Options: API, IMPORT (Import), LANDINGPAGE (Landing Page), MANUAL (Manual), OTHER (Other), UNKNOWN (Unknown)
— Spouse NamestringNoName of the contact’s spouse.
— TimezonestringNoIANA timezone string (e.g. America/New_York)
— WebsitestringNoThe 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 IDstringYesID of the contact to delete.

Contact: Get

ParameterTypeRequiredDefaultDescription
Contact IDstringYesID of the contact to retrieve.
OptionscollectionNo{}Extra settings applied to the lookup.
— FieldsstringNoComma-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.
— EmailstringNoReturn contacts with this email address.
— Given NamestringNoReturn contacts with this given (first) name.
— Family NamestringNoReturn contacts with this family (last) name.
— OrderoptionsNoWhich field the results are sorted by.
Options: date (Date), email, id, name
— Order DirectionoptionsNoSort direction.
Options: ascending (ASC), descending (DESC)
— SincestringNoDate to start searching from (LastUpdated)
— UntilstringNoDate to search to (LastUpdated)

Contact Note: Create

ParameterTypeRequiredDefaultDescription
User IDstringNoThe Keap user ID to create the note on behalf of. Use GET /users to list available users.
Contact IDstringNoID of the contact the note is attached to.
Additional FieldscollectionNo{}Optional fields sent with the new note.
— BodystringNoBody text of the note.
— TitlestringNoTitle of the note.
— TypeoptionsNoWhat kind of interaction the note records.
Options: appointment, call, email, fax, letter, other

Contact Note: Delete

ParameterTypeRequiredDefaultDescription
Note IDstringYesID of the note to delete.

Contact Note: Get

ParameterTypeRequiredDefaultDescription
Note IDstringYesID 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 IDstringNoFilter by user ID. Use GET /users to list available users.

Contact Note: Update

ParameterTypeRequiredDefaultDescription
Note IDstringYesID of the note to update.
Additional FieldscollectionNo{}The fields to change. Anything you leave out is left as it is.
— BodystringNoBody text of the note.
— Contact IDnumberNo0Move the note to this contact.
— TitlestringNoTitle of the note.
— TypeoptionsNoWhat kind of interaction the note records.
Options: appointment, call, email, fax, letter, other
— User IDstringNoThe Keap user ID. Use GET /users to list available users.

Contact Tag: Create

ParameterTypeRequiredDefaultDescription
Contact IDstringYesThe contact whose tags you are working with.
Tag IDsstringYesComma-separated tag IDs to apply. Use GET /tags to list available tags.

Contact Tag: Delete

ParameterTypeRequiredDefaultDescription
Contact IDstringYesThe contact whose tags you are working with.
Tag IDsstringYesComma-separated tag IDs to remove.

Contact Tag: Get Many

ParameterTypeRequiredDefaultDescription
Contact IDstringYesThe 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 IDstringYesID of the contact the order belongs to.
Order DatestringYesISO 8601 date string
Order TitlestringYesTitle 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 CodesstringNoComma-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 IDstringYesID of the order to delete.

Ecommerce Order: Get

ParameterTypeRequiredDefaultDescription
Order IDstringYesID 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.
— SincestringNoOnly return orders from this date onwards.
— UntilstringNoOnly return orders up to this date.
— PaidbooleanNofalseOnly return paid orders.
— OrderstringNoWhich 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 NamestringYesName of the product to create.
Additional FieldscollectionNo{}Optional fields sent with the new product.
— ActivebooleanNofalseWhether the product is active.
— Product DescriptionstringNoLong description of the product.
— Product PricenumberNo0Price of the product.
— Product Short DescriptionstringNoShort description of the product.
— SKUstringNoStock-keeping unit code.
— Subscription OnlybooleanNofalseWhether the product is sold only as a subscription.

Ecommerce Product: Delete

ParameterTypeRequiredDefaultDescription
Product IDstringYesID of the product to delete.

Ecommerce Product: Get

ParameterTypeRequiredDefaultDescription
Product IDstringYesID 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 AddressstringYesAddress the email was sent to.
Sent From AddressstringYesAddress the email was sent from.
Additional FieldscollectionNo{}Optional fields stored on the email record.
— Clicked DatestringNoWhen a link in the email was clicked.
— Contact IDnumberNo0Contact the email record belongs to.
— HeadersstringNoRaw email headers.
— HTML ContentstringNoBase64 encoded HTML
— Opened DatestringNoWhen the email was opened.
— Original ProvideroptionsNoUNKNOWNWhich system originally sent the email.
Options: UNKNOWN, INFUSIONSOFT, MICROSOFT, GOOGLE
— Original Provider IDstringNoThe sending system’s own identifier for the email.
— Plain ContentstringNoBase64 encoded text
— Provider Source IDstringNoSource identifier supplied by the provider.
— Received DatestringNoWhen the email was received.
— Sent DatestringNoWhen the email was sent.
— Sent From Reply AddressstringNoReply-to address used for the email.
— Sent To BCC AddressesstringNoBCC recipients of the email.
— Sent To CC AddressesstringNoCC recipients of the email.
— SubjectstringNoSubject line of the email.

Email: Delete Record

ParameterTypeRequiredDefaultDescription
Email Record IDstringYesID 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.
— EmailstringNoOnly return emails for this address.
— Since Sent DatestringNoOnly return emails sent on or after this date.
— Until Sent DatestringNoOnly return emails sent on or before this date.

Email: Send

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

File: Delete

ParameterTypeRequiredDefaultDescription
File IDstringYesID 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.
— NamestringNoFilter by name. Use * for LIKE queries.
— PermissionoptionsNobothWhose files to return.
Options: user, company, both
— TypeoptionsNoRestrict 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 IDstringYesID of the contact to attach the file to. (shown when File Association is contact)
File NamestringYesFilename including extension (used when binaryData is false) (shown when Binary File is false)
File DatastringYesBase64-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 AccountcredentialNoConnect 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 }}.

Usage Examples

  • 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

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

Manage Keap CRM data including contacts, companies, tags, orders, emails with attachments, and file uploads.

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 the Keap node

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 updated . Spotted something wrong? Tell us.