Customer API
Manage the customer records your field teams visit and report against: create them, search them, and read or update their details.
Overview & Solution
A journey plan or a check-in is only as useful as the customer record behind it. The Customer API gives field and CRM-adjacent systems a direct way to create, search and update those records, so a visit in PJP always resolves to a real, current customer.
Key Value Propositions
- Tenant-defined schema - every tenant can shape its own customer fields; call the schema endpoint first to discover what yours defines.
- Feeds journey planning - the same customer records that visits in the PJP API are planned against.
Industry Use Cases
1. Field Sales & Collections
- Customer-linked visits: Keep the customer master in sync with the field, so every planned or logged visit points at a current, correct record.
2. CRM Enrichment
- Bi-directional sync: Create or update customer records from a CRM, and read them back for reporting against field activity.
API reference
Field Force Mobility Execution APIs · Requires Intelomatic tenant
Field definitions: Customer
Endpoints
| Method | Path | Purpose |
|---|---|---|
POST | /api/app-base/data-layer/CUSTOMER/layer-detail | Get the CUSTOMER layer's field definitions (schema) |
POST | /api/app-base/data-layer/CUSTOMER | Create a customer |
POST | /api/app-base/data-layer/CUSTOMER/search | Search customers |
PUT | /api/app-base/data-layer/CUSTOMER/{id} | Update a customer |
GET | /api/app-base/data-layer/CUSTOMER/{id}/detail | Get one customer with all its values |
DELETE | /api/app-base/data-layer/CUSTOMER/{id} | Delete a customer |
All requests require a bearer token and the api-key query parameter:
Authorization: Bearer <access_token>
?api-key=<apiKey>
Get the CUSTOMER layer's field definitions (schema)
POST /api/app-base/data-layer/CUSTOMER/layer-detail
Request Parameters
| Parameter | In | Type | Required | Description | Example |
|---|---|---|---|---|---|
properties | body | object | No | ||
properties.layerSettings | body | boolean | No | ||
properties.isTakeAll | body | boolean | No |
Request body
{
"properties": {
"layerSettings": true,
"isTakeAll": true
}
}
Response Schema
200 OK
{
"layerName": "CUSTOMER",
"version": 8,
"properties": [
{
"propertyName": "customer_full_name",
"displayName": "Full name",
"dataType": 3,
"required": true,
"isSystem": false,
"isAdditional": true
},
{
"propertyName": "customer_category",
"displayName": "Category",
"dataType": 10,
"required": false,
"isSystem": false,
"isAdditional": true
}
],
"layerSettings": {}
}
| Field | Type | Description |
|---|---|---|
layerName | string | Layer the schema belongs to. |
version | integer | Schema version. It increases every time the layer definition is changed - compare it to detect that your integration is reading an outdated field list. |
properties | array | One entry per field on the layer. This is the list of keys a create or update body may use. |
properties[] | object | |
properties[].propertyName | string | |
properties[].displayName | string | |
properties[].dataType | integer | |
properties[].required | boolean | |
properties[].isSystem | boolean | |
properties[].isAdditional | boolean | |
layerSettings | object | Layer-level configuration, returned when layerSettings: true is requested. |
Read this before writing to the layer. properties[] is the authoritative field list - a create or update body may only use these propertyName keys.
| Property attribute | Meaning |
|---|---|
propertyName | The key to send in a request body |
displayName | Human label shown in the platform UI - never sent to the API |
dataType | Numeric type code. See Field data types for the codes and the JSON value each expects |
required | true means the field must be present on create |
isSystem | Set by the platform. Do not send these, except Title and Description |
isAdditional | A custom field defined for this tenant |
Fields of dataType 10 (List) also carry their allowed values, or the layer they read from and any dependency on another field - see Field data types.
Create a customer
POST /api/app-base/data-layer/CUSTOMER
Request Parameters
| Parameter | In | Type | Required | Description | Example |
|---|---|---|---|---|---|
customer_full_name | body | string | No | ||
customer_phone_number | body | string | No | ||
customer_email | body | string | No | ||
customer_category | body | string | No | ||
customer_postal_code | body | string | No | ||
customer_address | body | string | No | ||
customer_location | body | string | No | ||
customer_is_active | body | string | No |
Request body
{
"customer_full_name": "Sample Record",
"customer_phone_number": "919000000001",
"customer_category": "Default",
"customer_postal_code": "412108",
"customer_address": "Mulshi, Pune, MAHARASHTRA - 412108",
"customer_location": "{\"coordinates\":[73.55986487231496,18.462925230845542],\"type\":\"Point\"}",
"customer_is_active": "true"
}
Response Schema
200 OK
{
"customer_guid": "6ab380e8e2e38fdef6e66f64",
"customer_full_name": "Sample Record",
"customer_phone_number": "919000000001",
"customer_category": "Default",
"customer_postal_code": "412108",
"customer_address": "Mulshi, Pune, MAHARASHTRA - 412108",
"customer_location": "{\"coordinates\":[73.55986487231496,18.462925230845542],\"type\":\"Point\"}",
"customer_is_active": "true",
"customer_created_from": 2,
"customer_last_modified_from": 2,
"Title": "Sample Record",
"customer_administrative_1": 33,
"customer_administrative_2": 138,
"customer_administrative_3": 14204,
"customer_assigned_team": "2",
"customer_assignee": "6a9fc4765f1d93f41e0a548f",
"Id": "33f9d21c-10d2-40ea-9561-f3a0a44c1a8c",
"Path": "/<internal storage path>"
}
| Field | Type | Description |
|---|---|---|
customer_guid | string | Business identifier of the customer, used by other APIs such as a visit target. |
customer_full_name | string | The value stored. |
customer_phone_number | string | The value stored. |
customer_email | string | The value stored. |
customer_category | string | Customer category. |
customer_postal_code | string | Postal code (PIN). |
customer_address | string | Address text. |
customer_location | string | Customer position as GeoJSON serialized to a string ([longitude, latitude]). |
customer_is_active | string | "true" when the customer is active - returned as a string. |
customer_created_from | integer | Channel that created the record, set by the platform: 1 Mobile, 2 Web, 3 Others. |
customer_last_modified_from | integer | Channel of the last change, set by the platform: 1 Mobile, 2 Web, 3 Others. |
Title | string | Display label of the record, kept in step with the full name. |
customer_administrative_1 | integer | Numeric ID of the state. |
customer_administrative_2 | integer | Numeric ID of the district. |
customer_administrative_3 | integer | Numeric ID of the tehsil. |
customer_assigned_team | string | Team the customer belongs to. |
customer_assignee | string | GUID of the employee who owns this customer. |
Id | string | Record identifier - the value to use for detail, update and delete. |
Path | string | Internal storage location. Read-only. |
Two identifiers come back: Id is the record ID used by detail, update and delete; customer_guid is the business identifier other APIs reference, for example as a visit target.
Search customers
POST /api/app-base/data-layer/CUSTOMER/search
Request Parameters
| Parameter | In | Type | Required | Description | Example |
|---|---|---|---|---|---|
skip | body | integer | No | ||
take | body | integer | No |
Request body
{
"skip": 0,
"take": 20
}
skip and take are paging properties:
skip- number of records to skip before the page starts.0is the first page.take- maximum number of records returned in this page.-1returns every match, which is only safe on small datasets.
The response reports total, the number of records matching the query regardless of paging - keep requesting pages until skip + take reaches it.
Response Schema
200 OK
{
"data": [
{
"Id": "00000000-0000-0000-0000-000000000001",
"Layer": "CUSTOMER",
"CreatedDate": "2026-07-15T11:15:45Z",
"Title": "Sample Record",
"customer_full_name": "Sample Record",
"customer_phone_number": "919000000001"
}
],
"total": 1
}
| Field | Type | Description |
|---|---|---|
data | array | The page of matching records. Each entry carries the layer's own fields plus the system fields every record has. |
data[] | object | |
data[].Id | string | |
data[].Layer | string | |
data[].CreatedDate | string | |
data[].Title | string | |
data[].customer_full_name | string | |
data[].customer_phone_number | string | |
total | integer | Total number of records matching the query, ignoring skip and take - use it to drive paging. |
Update a customer
PUT /api/app-base/data-layer/CUSTOMER/{id}
Request Parameters
| Parameter | In | Type | Required | Description | Example |
|---|---|---|---|---|---|
id | path | string | Yes | Id of the customer record to update | a7045037-7f06-478a-8eb4-127e7fcf9526 |
customer_full_name | body | string | No |
Request body
{
"customer_full_name": "Updated Name"
}
Response Schema
200 OK
{
"Id": "a7045037-7f06-478a-8eb4-127e7fcf9526",
"id": "6a9f866935eb145649301618",
"customer_guid": "6a9f866935eb145649301618",
"customer_full_name": "Updated Name",
"customer_assignee": "6a9b6a8a868d302be9d97ac6",
"customer_assigned_team": "2",
"customer_created_from": 2,
"customer_last_modified_from": 2,
"Title": "ZFLCFX_CUSTOMER",
"Path": "/<internal storage path>"
}
| Field | Type | Description |
|---|---|---|
Id | string | Record identifier - the value you sent in the path, and the one to use for detail and delete. |
id | string | Lower case id is not a copy of Id here: it carries customer_guid. Do not use it where a record ID is expected. |
customer_guid | string | Business identifier of the customer, used by other APIs such as a visit target. |
customer_full_name | string | The value this call wrote. |
customer_assignee | string | GUID of the employee who owns this customer, unchanged by this call. |
customer_assigned_team | string | Team the customer belongs to, unchanged by this call. |
customer_created_from | integer | Channel the record was created from: 1 Mobile, 2 Web, 3 Others. |
customer_last_modified_from | integer | Channel of this change, set by the platform. |
Title | string | Returned as the internal layer name rather than a per-record label. Do not rely on it to identify the customer. |
Path | string | Internal storage location. Read-only. |
The customer update response is compact, not the full record. It returns the identifiers, the fields this call wrote, and a few ownership fields - not every customer_* value. Read the record back with {id}/detail if you need its full state.
Two identifiers are in play: Id is the record ID used by detail and delete; customer_guid (also returned as lower case id) is the business identifier other APIs reference, for example as a visit target.
Title reflects the layer name rather than a per-record label for the customer.
Get one customer with all its values
GET /api/app-base/data-layer/CUSTOMER/{id}/detail
Request Parameters
| Parameter | In | Type | Required | Description | Example |
|---|---|---|---|---|---|
id | path | string | Yes | Customer record ID |
Response Schema
200 OK
{
"Id": "<uuid>",
"Layer": "CUSTOMER",
"CreatedDate": "2026-07-15T11:15:45Z",
"Title": "<title>",
"customer_full_name": "<value>",
"customer_phone_number": "<value>"
}
| Field | Type | Description |
|---|---|---|
Id | string | Record identifier, the value to pass to update and delete. |
Layer | string | Layer the record belongs to. |
CreatedDate | string | When the record was created, UTC. |
Title | string | Display label of the record. |
customer_full_name | string | |
customer_phone_number | string |
Delete a customer
DELETE /api/app-base/data-layer/CUSTOMER/{id}
Request Parameters
| Parameter | In | Type | Required | Description | Example |
|---|---|---|---|---|---|
id | path | string | Yes | Customer record ID |
Response Schema
200 OK
{
"count": 1
}
| Field | Type | Description |
|---|---|---|
count | integer | Number of records actually deleted. 1 = the customer was found and removed, 0 = nothing matched the ID. The call returns 200 OK either way, so check this value to confirm the delete. |
Example
curl -X POST '$BASE_URL/api/app-base/data-layer/CUSTOMER/layer-detail?api-key=$API_KEY' \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' \
-d '{"properties": {"layerSettings": true, "isTakeAll": true}}'
Notes
The customer_* fields shown here are the ones observed across tenants; the exact field set is tenant-specific. Call the schema endpoint first to discover what your tenant's customer records actually define.
Search responses use the standard { "data": [...], "total": N } envelope, and every record carries the usual system fields (Id, CreatedDate, ModifiedDate, Title) alongside its customer_* values.