Skip to main content

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​

MethodPathPurpose
POST/api/app-base/data-layer/CUSTOMER/layer-detailGet the CUSTOMER layer's field definitions (schema)
POST/api/app-base/data-layer/CUSTOMERCreate a customer
POST/api/app-base/data-layer/CUSTOMER/searchSearch customers
PUT/api/app-base/data-layer/CUSTOMER/{id}Update a customer
GET/api/app-base/data-layer/CUSTOMER/{id}/detailGet 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

ParameterInTypeRequiredDescriptionExample
propertiesbodyobjectNo
properties.layerSettingsbodybooleanNo
properties.isTakeAllbodybooleanNo

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": {}
}
FieldTypeDescription
layerNamestringLayer the schema belongs to.
versionintegerSchema version. It increases every time the layer definition is changed - compare it to detect that your integration is reading an outdated field list.
propertiesarrayOne entry per field on the layer. This is the list of keys a create or update body may use.
properties[]object
properties[].propertyNamestring
properties[].displayNamestring
properties[].dataTypeinteger
properties[].requiredboolean
properties[].isSystemboolean
properties[].isAdditionalboolean
layerSettingsobjectLayer-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 attributeMeaning
propertyNameThe key to send in a request body
displayNameHuman label shown in the platform UI - never sent to the API
dataTypeNumeric type code. See Field data types for the codes and the JSON value each expects
requiredtrue means the field must be present on create
isSystemSet by the platform. Do not send these, except Title and Description
isAdditionalA 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

ParameterInTypeRequiredDescriptionExample
customer_full_namebodystringNo
customer_phone_numberbodystringNo
customer_emailbodystringNo
customer_categorybodystringNo
customer_postal_codebodystringNo
customer_addressbodystringNo
customer_locationbodystringNo
customer_is_activebodystringNo

Request body

{
"customer_full_name": "Sample Record",
"customer_phone_number": "919000000001",
"customer_email": "[email protected]",
"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_email": "[email protected]",
"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>"
}
FieldTypeDescription
customer_guidstringBusiness identifier of the customer, used by other APIs such as a visit target.
customer_full_namestringThe value stored.
customer_phone_numberstringThe value stored.
customer_emailstringThe value stored.
customer_categorystringCustomer category.
customer_postal_codestringPostal code (PIN).
customer_addressstringAddress text.
customer_locationstringCustomer position as GeoJSON serialized to a string ([longitude, latitude]).
customer_is_activestring"true" when the customer is active - returned as a string.
customer_created_fromintegerChannel that created the record, set by the platform: 1 Mobile, 2 Web, 3 Others.
customer_last_modified_fromintegerChannel of the last change, set by the platform: 1 Mobile, 2 Web, 3 Others.
TitlestringDisplay label of the record, kept in step with the full name.
customer_administrative_1integerNumeric ID of the state.
customer_administrative_2integerNumeric ID of the district.
customer_administrative_3integerNumeric ID of the tehsil.
customer_assigned_teamstringTeam the customer belongs to.
customer_assigneestringGUID of the employee who owns this customer.
IdstringRecord identifier - the value to use for detail, update and delete.
PathstringInternal 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

ParameterInTypeRequiredDescriptionExample
skipbodyintegerNo
takebodyintegerNo

Request body

{
"skip": 0,
"take": 20
}

skip and take are paging properties:

  • skip - number of records to skip before the page starts. 0 is the first page.
  • take - maximum number of records returned in this page. -1 returns 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
}
FieldTypeDescription
dataarrayThe page of matching records. Each entry carries the layer's own fields plus the system fields every record has.
data[]object
data[].Idstring
data[].Layerstring
data[].CreatedDatestring
data[].Titlestring
data[].customer_full_namestring
data[].customer_phone_numberstring
totalintegerTotal 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

ParameterInTypeRequiredDescriptionExample
idpathstringYesId of the customer record to updatea7045037-7f06-478a-8eb4-127e7fcf9526
customer_full_namebodystringNo

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>"
}
FieldTypeDescription
IdstringRecord identifier - the value you sent in the path, and the one to use for detail and delete.
idstringLower case id is not a copy of Id here: it carries customer_guid. Do not use it where a record ID is expected.
customer_guidstringBusiness identifier of the customer, used by other APIs such as a visit target.
customer_full_namestringThe value this call wrote.
customer_assigneestringGUID of the employee who owns this customer, unchanged by this call.
customer_assigned_teamstringTeam the customer belongs to, unchanged by this call.
customer_created_fromintegerChannel the record was created from: 1 Mobile, 2 Web, 3 Others.
customer_last_modified_fromintegerChannel of this change, set by the platform.
TitlestringReturned as the internal layer name rather than a per-record label. Do not rely on it to identify the customer.
PathstringInternal 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

ParameterInTypeRequiredDescriptionExample
idpathstringYesCustomer 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>"
}
FieldTypeDescription
IdstringRecord identifier, the value to pass to update and delete.
LayerstringLayer the record belongs to.
CreatedDatestringWhen the record was created, UTC.
TitlestringDisplay label of the record.
customer_full_namestring
customer_phone_numberstring

Delete a customer​

DELETE /api/app-base/data-layer/CUSTOMER/{id}

Request Parameters

ParameterInTypeRequiredDescriptionExample
idpathstringYesCustomer record ID

Response Schema

200 OK

{
"count": 1
}
FieldTypeDescription
countintegerNumber 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.