> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreflux.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Salesforce

> Client-mode REST API connector for a curated Salesforce REST API v62.0 slice: Cases from alarms, Asset telemetry, SOQL, Platform Events, and Composite

Technical Preview

## Overview

A client-mode connector for a **curated CRM / Field Service / IIoT bridge** slice of the [Salesforce REST API](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/) under `https://YOUR_INSTANCE.my.salesforce.com/services/data/v62.0/`:

| Catalog connector event | Entity / path | Notes |
| - | - | - |
| (discovery) | `GET /services/data/v62.0/sobjects` | Global sObject catalog; good first smoke |
| GET SOQL query?q= | `GET /services/data/v62.0/query?q=` | URL-encode the SOQL string |
| POST Case from alarm | `POST /services/data/v62.0/sobjects/Case` | Map IIoT alerts → Case |
| PATCH Asset with telemetry | `PATCH /services/data/v62.0/sobjects/Asset/{id}` | Update status / custom fields |
| POST Platform Event | `POST /services/data/v62.0/sobjects/{Event__e}` | `eventName` must end with `__e` |
| (batch) | `POST /services/data/v62.0/composite` | Multi-request in one round-trip |

`BASE_ADDRESS` is the org **instance URL** from the OAuth token response (no trailing slash). Topics use `crm/salesforce/<object>/<verb>`.

> [!NOTE]
>
> Use the `instance_url` returned with the access token (for example `https://mycompany.my.salesforce.com`). `login.salesforce.com` and `test.salesforce.com` are for OAuth token exchange only — calling `/services/data/` on the login host returns `URL_NOT_RESET`.

> [!NOTE]
>
> API version is pinned to **v62.0** (Hugo catalog `base_url`). Bump the path version in the `.lot` when you standardize on a newer org API version. Bulk 2.0 and Pub/Sub (gRPC) are out of scope for this REST\_API client template. Prefer Hub secrets for tokens. This template has not been verified against a live org.

## Basic Syntax

```lot wrap theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
# Coreflux REST_API template — Salesforce (REST API v62.0 curated slice)
# Auth: Bearer {value.json.access_token}
# BASE_ADDRESS: https://YOUR_INSTANCE.my.salesforce.com

DEFINE ROUTE SalesforceRestApi WITH TYPE REST_API
    ADD REST_API_CONFIG
        WITH BASE_ADDRESS "https://YOUR_INSTANCE.my.salesforce.com"
        WITH ENABLE_CLIENT "true"
        WITH USE_SSL "true"
        WITH REQUEST_TIMEOUT '60'
        WITH DEFAULT_CONTENT_TYPE "application/json"
    ADD EVENT Listsobjects
        WITH SOURCE_TOPIC "crm/salesforce/sobjects/list"
        WITH DESTINATION_TOPIC "crm/salesforce/sobjects/list/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/services/data/v62.0/sobjects"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "Authorization" "Bearer {value.json.access_token}"
    ADD EVENT Querysoql
        WITH SOURCE_TOPIC "crm/salesforce/query/soql"
        WITH DESTINATION_TOPIC "crm/salesforce/query/soql/response"
        WITH METHOD "GET"
        WITH ENDPOINT "/services/data/v62.0/query?q={value.json.q}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "Authorization" "Bearer {value.json.access_token}"
    ADD EVENT Createcase
        WITH SOURCE_TOPIC "crm/salesforce/case/create"
        WITH DESTINATION_TOPIC "crm/salesforce/case/create/response"
        WITH METHOD "POST"
        WITH ENDPOINT "/services/data/v62.0/sobjects/Case"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "Content-Type" "application/json"
            ADD "Authorization" "Bearer {value.json.access_token}"
        WITH BODY "{payload}"
    ADD EVENT Patchasset
        WITH SOURCE_TOPIC "crm/salesforce/asset/patch"
        WITH DESTINATION_TOPIC "crm/salesforce/asset/patch/response"
        WITH METHOD "PATCH"
        WITH ENDPOINT "/services/data/v62.0/sobjects/Asset/{value.json.assetId}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "Content-Type" "application/json"
            ADD "Authorization" "Bearer {value.json.access_token}"
        WITH BODY "{payload}"
    ADD EVENT Createplatformevent
        WITH SOURCE_TOPIC "crm/salesforce/platform-event/create"
        WITH DESTINATION_TOPIC "crm/salesforce/platform-event/create/response"
        WITH METHOD "POST"
        WITH ENDPOINT "/services/data/v62.0/sobjects/{value.json.eventName}"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "Content-Type" "application/json"
            ADD "Authorization" "Bearer {value.json.access_token}"
        WITH BODY "{payload}"
    ADD EVENT Composite
        WITH SOURCE_TOPIC "crm/salesforce/composite/post"
        WITH DESTINATION_TOPIC "crm/salesforce/composite/post/response"
        WITH METHOD "POST"
        WITH ENDPOINT "/services/data/v62.0/composite"
        WITH HEADERS
            ADD "Accept" "application/json"
            ADD "Content-Type" "application/json"
            ADD "Authorization" "Bearer {value.json.access_token}"
        WITH BODY "{payload}"

```

## Events

| Event | Method | Endpoint | Request topic | Response topic |
| - | - | - | - | - |
| Listsobjects | GET | `/services/data/v62.0/sobjects` | `crm/salesforce/sobjects/list` | `crm/salesforce/sobjects/list/response` |
| Querysoql | GET | `/services/data/v62.0/query?q={q}` | `crm/salesforce/query/soql` | `crm/salesforce/query/soql/response` |
| Createcase | POST | `/services/data/v62.0/sobjects/Case` | `crm/salesforce/case/create` | `crm/salesforce/case/create/response` |
| Patchasset | PATCH | `/services/data/v62.0/sobjects/Asset/{assetId}` | `crm/salesforce/asset/patch` | `crm/salesforce/asset/patch/response` |
| Createplatformevent | POST | `/services/data/v62.0/sobjects/{eventName}` | `crm/salesforce/platform-event/create` | `crm/salesforce/platform-event/create/response` |
| Composite | POST | `/services/data/v62.0/composite` | `crm/salesforce/composite/post` | `crm/salesforce/composite/post/response` |

## Auth

**OAuth 2.0 Bearer access token — default in the template:**

1. In Salesforce Setup, create a **Connected App** with the OAuth scopes your integration needs (at least API access).
2. Obtain an `access_token` (authorization code, JWT bearer, or client credentials where the org enables it).
3. Set connector `BASE_ADDRESS` to the token response `instance_url` (My Domain host).
4. Pass `access_token` on the MQTT request payload so headers resolve:
   * `Authorization: Bearer {value.json.access_token}`
5. Store the token in Hub secrets / `GET SECRET`. Never commit real credentials.

## Example payloads

**List sObjects (smoke):** include `access_token` on the MQTT JSON root used for header substitution.

**SOQL:**

```json theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
{
  "access_token": "YOUR_ACCESS_TOKEN",
  "q": "SELECT+Id,+Subject,+Status+FROM+Case+LIMIT+10"
}
```

**Create Case:**

```json theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
{
  "Subject": "Line sensor fault — Zone A",
  "Description": "Vibration above threshold",
  "Origin": "IoT",
  "Priority": "High",
  "Status": "New"
}
```

**PATCH Asset:** path uses `assetId`; body is the field map.

**Platform Event:** set `eventName` to the API name ending in `__e` (for example `DeviceAlert__e`); body is the event field map.

## Deploy notes

* Deploy **`SalesforceRestApi.lot` only** (`-addRoute`). Do **not** deploy `hub-metadata.lot` as a connector — it exists for Hub / `-listTemplates` (`ADD METADATA` + `WITH IMAGE` base64).
* Hub category: **REST API Connectors**.
* Doc link: [https://docs.coreflux.org/latest/lot-language/routes/rest-api-apps/salesforce](https://docs.coreflux.org/latest/lot-language/routes/rest-api-apps/salesforce)

## Related

* [REST API Connectors](/latest/lot-language/routes/rest-api-routes)
* [REST API Apps catalog](/latest/lot-language/routes/rest-api-apps)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.