---
id: 01-contact-flow-salesforce-lambdas
title: Accessing the Salesforce API from Amazon Connect Contact Flows Using AWS Lambda
---
import useBaseUrl from "@docusaurus/useBaseUrl";
The most commonly used feature of the AWS Serverless Application
Repository for Salesforce is accessing/updating Salesforce data using
the sfInvokeAPI Lambda function. This function allows an Amazon Connect
contact flow to perform the following operations against your Salesforce
org:
- **Lookup:** queries Salesforce for objects based on the parameters
passed to it
- **Create:** creates a Salesforce object based on the parameters
passed to it
- **Update:** updates a Salesforce object based on the parameters
passed to it
- **Phone Lookup:** uses Salesforce Object Search Language (SOLS) to
construct text-based search queries against the search index, which
gives significant performance improvement when searching phone
number fields.
- **Delete:** deletes a Salesforce object based on the parameters
passed to it
- **Query:** executes a Salesforce Object Query Language (SOQL) query
on the Salesforce instance. Can return multiple entries.
- **QueryOne:** executes a Salesforce Object Query Language (SOQL)
query on the Salesforce instance. Returns result only when one entry
is returned from the query.
- **CreateChatterPost:** creates a chatter post.
- **CreateChatterComment:** creates a chatter comment.
- **Search:** performs a search against the Salesforce instance, returning all results.
- **SearchOne:** performs a search against the Salesforce instance, returning at most one result.
**NOTE:** naming of the Lambda function will vary based on template
data, but sfInvokeAPI will always be a part of the name.
When you invoke this Lambda function from your contact flows, you will
need to pass along parameters that inform the function as to which
Salesforce operation you wish to execute, as well as pass along any
required parameters. Depedning on your use case, this can require
reference to the [Salesforce REST
API](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_list.htm)
or the [Salesforce Connect REST
API](https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/intro_what_is_chatter_connect.htm)
documentation. The core parameters are:
- **sf_operation:** specifies with operation to run. Options are
lookup, create, update, phoneLookup, query, queryOne,
createChatterPost, createChatterComment
- **sf_object:** defines what type of object you are referencing.
Examples include Case, Contact, Task, etc.
- **sf_fields:** the fields you want to receive back from Salesforce
when an operation completes successfully
- **sf_id:** the unique identifier for a Salesforce object. Typically
used in update operations
- **sf_phone:** contains the phone number used to search when
performing a phone lookup
### Salesforce Lookup
This operation is invoked by setting **sf_operation** to **lookup**. In
this case, the Lambda function queries Salesforce for objects based on
the parameters passed to it. For lookup, the following parameters are
required:
- sf_object
- sf_fields
Any additional parameters passed will be evaluated as conditional
arguments for the lookup.
Note that this operation only returns the first item of the query
results. If you want to have all results returned from Salesforce, set
**sf_operation** to **lookup_all**.
In the contact flow example below, we are looking for a specific case
based on customer input.
This operation returns a response of:
```json
{
"Id": "5006g00000AaIs7AAF",
"sf_count": 1
}
```
For **lookup_all** the operation returns a response of:
```json
{
"sf_records_0_Id": "5006g00000AaIs7AAF",
"sf_records_1_Id": "5006g00000AaIs7AAE",
"sf_count": 2
}
```
Note that `sf_count` is the count of records matched and not the count of fields in the response. This means all fields that start with `sf_records_i_` count as one record. If the query above returned the Name as well as the Id the response will be:
```json
{
"sf_records_0_Id": "5006g00000AaIs7AAF",
"sf_records_0_Name": "Name0",
"sf_records_1_Id": "5006g00000AaIs7AAE",
"sf_records_1_Name": "Name1",
"sf_count": 2
}
```
### Salesforce Create
This operation is invoked by setting **sf_operation** to **create**. In
this case, the Lambda function creates a Salesforce object based on the
parameters passed to it. For create, the following parameters are
required:
- sf_object
- Specify additional parameters for the Salesforce object to be
created. Please be sure to include all parameters required to create
the Salesforce object.
In the contact flow example below, we creating a new case based on
customer input.
This operation returns a response of:
```json
{
"Id": "5006g00000BLqurAAD"
}
```
### Salesforce Update
This operation is invoked by setting **sf_operation** to **update**. In
this case, the Lambda function updates a Salesforce object based on the
parameters passed to it. For update, the following parameters are
required:
- sf_object
- sf_id
- Specify additional parameters for the Salesforce object to be
created. Please be sure to include all parameters required to create
the Salesforce object.
In the contact flow example below, we are updating a specific case.
This operation returns a response of:
```json
{
"Status": "204"
}
```
The "204" status indicates a success.
### Salesforce Phone Lookup
This operation is invoked by setting **sf_operation** to
**phoneLookup**. In this case, the Lambda function uses Salesforce
Object Search Language (SOLS) to construct text-based search queries.
For phoneLookup, the following parameters are required:
- sf_phone
- sf_fields
In the contact flow example below, we look for a customer by phone
number.
This operation returns a response of:
```json
{
"Id": "5006g00000BLqurAAD",
"sf_count": "1",
"Name": "Jim Smith"
}
```
### Salesforce Delete
This operation is invoked by setting **sf_operation** to **delete**. In
this case, the Lambda function deletes a Salesforce object based on the
parameters passed to it. For delete, the following parameters are
required:
- sf_object
- sf_id
In the contact flow example below, we deleting an existing case based on
customer input.
This operation returns a response of:
```json
{
"Response": "None"
}
```
### Salesforce query
This operation is invoked by setting **sf_operation** to **query**. In
this case, the Lambda function uses Salesforce Object Query Language
(SOQL) to conduct a query against the Salesforce instance. For query,
the following parameter is required:
- query
Any additional parameters will replace text values in the original query
so that queries can be dynamic based on values stored within the contact
flow. For example, the parameter set:
- query: "select field from object"
- field: "Id"
- object: "Task"
Will result in the query: "select Id from Task".
In the contact flow example below, we look for a customer by phone
number.
(full text of the value is "select Id from Contact where Phone LIKE
'%number%'")
This operation returns a response of:
```json
{
"sf_records_0_Id": "00303000001RZfIAAW",
"sf_count": 1
}
```
Note that `sf_count` is the count of records matched and not the count of fields in the response. This means all fields that start with `sf_records_i_` count as one record. If the query above returned the Name as well as the Id and matched more than one record, the response will be:
```json
{
"sf_records_0_Id": "00303000001RZfIAAW",
"sf_records_0_Name": "Name0",
"sf_records_1_Id": "00303000001RZfIAAE",
"sf_records_1_Name": "Name1",
"sf_count": 2
}
```
### Salesforce queryOne
This operation is invoked by setting **sf_operation** to **queryOne**
(case sensitive). In this case, the Lambda function uses Salesforce
Object Query Language (SOQL) to conduct a query against the Salesforce
instance, returning a result only when one record is returned from the
query. For query, the following parameter is required:
- query
Any additional parameters will replace text values in the original query
so that queries can be dynamic based on values stored within the contact
flow. For example, the parameter set:
- query: "select field from object"
- field: "Id"
- object: "Task"
Will result in the query: "select Id from Task".
In the contact flow example below, we look for a customer by phone
number.
(full text of the value is "select Id from Contact where Phone LIKE
'%number%'")
This operation returns a response of:
```json
{
"Id": "00303000001RZfIAAW",
"sf_count": 1
}
```
### Salesforce createChatterPost
This operation is invoked by setting **sf_operation** to
**createChatterPost** (case sensitive). In this case, the Lambda
function uses the Salesforce Connect REST API to create a chatter post
(see
[here](https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/quickreference_post_feed_item.htm)).
For createChatterPost, the following parameters are required:
- sf_feedElementType
- sf_subjectId
- sf_messageType
- sf_message
The following parameter is optional:
- sf_mention
(refer to the api reference for value types)
Any additional parameters will replace text values in the sf_message so
that messages can be dynamic based on values stored within the contact
flow. For example, the parameter set:
- sf_message: "Please help me with case `caseId`"
- caseId: 1234
Will result in the message: "Please help me with case 1234".
In the contact flow example below, we leave a chatter post on a contact.
(full text of the value is "I had a problem during the call. My contact
id is `contactId`.")
The operation returns a response of:
```json
{
"Id": "0D503000000ILY5CAO"
}
```
See the chatter post appear attached to the Subject:
### Salesforce createChatterComment
This operation is invoked by setting **sf_operation** to
**createChatterComment** (case sensitive). In this case, the Lambda
function uses the Salesforce Connect REST to create a chatter comment
(see
[here](https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/connect_resources_feed_element_capability_comments_items.htm)).
For createChatterComment, the following parameters are required:
- sf_feedElementId
- sf_commentType
- sf_commentMessage
(refer to the api reference for value types)
Any additional parameters will replace text values in the
sf_commentMessage so that messages can be dynamic based on values stored
within the contact flow. For example, the parameter set:
- sf_commentMessage: "Please help me with case ` caseId `"
- caseId: 1234
In the contact flow example below, we leave a comment on a chatter post.
The operation returns a response of:
```json
{
"Id": "0D703000000ChhNCAS"
}
```
See the chatter post appear attached to the Subject:
### Salesforce search
This operation is invoked by setting **sf_operation** to
**search** (case sensitive). In this case, the Lambda
function uses the Salesforce REST to perform a parameterized search
(see
[here](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_search_parameterized.htm)).
For search, the following parameters are required:
- q
- sf_fields
- sf_object
The following parameters are optional:
- where
- overallLimit
(refer to the api reference for value types)
See the below example:
The operation returns a response of:
```json
{
"sf_records_0_Id": "50001000001B9e6AAG",
"sf_records_0_Subject": "test subject",
"sf_records_0_Status": "New",
"sf_records_1_Id": "50001000001B9eWAAS",
"sf_records_1_Subject": "test subject",
"sf_records_1_Status": "New",
"sf_records_2_Id": "50001000001BDgiAAG",
"sf_records_2_Subject": "test subject",
"sf_records_2_Status": "New",
"sf_count": 3
}
```
Note that `sf_count` is the count of records matched and not the count of fields in the response. This means all fields that start with `sf_records_i_` count as one record.
### Salesforce searchOne
This operation is invoked by setting **sf_operation** to
**searchOne** (case sensitive). In this case, the Lambda
function uses the Salesforce REST to perform a parameterized search
(see
[here](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_search_parameterized.htm)).
For search, the following parameters are required:
- q
- sf_fields
- sf_object
The following parameter is optional:
- where
(refer to the api reference for value types)
See the below example:
The operation returns a response of:
```json
{
"Id": "50001000001BIn6AAG",
"Subject": "test subject unique",
"Status": "New",
"sf_count": 1
}
```