Skip to content

Locations

Your account/location record holds your SMBcrm account’s name, address, contact details, and timezone. These endpoints read that record and list the timezone identifiers available for it. They also list your SMS and email providers and your saved templates, search tasks across your account, and manage recurring tasks.

Base URL: https://services.smbcrm.com · Version header: v3 · Scopes: locations.readonly (location details, search, timezones, conversation channels), locations/templates.readonly (saved templates), locations/tasks.readonly (task search), recurring-tasks.readonly and recurring-tasks.write (recurring tasks). See Scopes.

GET/locations/{locationId}

Get details about your SMBcrm account/location, including name, address, timezone, and contact info.

scope locations.readonlyauth Location token or PIT
Terminal window
curl https://services.smbcrm.com/locations/<location_id> \
-H "Authorization: Bearer <token>" \
-H "Version: v3"
200 OK
{
"location": {
"id": "<location_id>",
"name": "Riverside Plumbing Co.",
"firstName": "Jordan",
"lastName": "Lee",
"email": "hello@example.com",
"phone": "+15125550100",
"address": "412 Main St",
"city": "Austin",
"state": "TX",
"country": "US",
"postalCode": "78701",
"website": "https://example.com",
"timezone": "America/Chicago",
"logoUrl": "https://example.com/logo.png",
"business": {
"name": "Riverside Plumbing Co.",
"address": "412 Main St",
"city": "Austin",
"state": "TX",
"country": "US",
"postalCode": "78701",
"website": "https://example.com",
"timezone": "America/Chicago",
"logoUrl": "https://example.com/logo.png"
},
"social": {
"facebookUrl": "https://www.facebook.com/example",
"googlePlus": "https://plus.google.com/example",
"linkedIn": "https://www.linkedin.com/company/example",
"foursquare": "https://foursquare.com/v/example",
"twitter": "https://twitter.com/example",
"yelp": "https://www.yelp.com/biz/example",
"instagram": "https://www.instagram.com/example",
"youtube": "https://www.youtube.com/@example",
"pinterest": "https://www.pinterest.com/example",
"blogRss": "https://example.com/blog/rss",
"googlePlacesId": "<google_places_id>"
},
"settings": {
"allowDuplicateContact": false,
"allowDuplicateOpportunity": false,
"allowFacebookNameMerge": false,
"disableContactTimezone": false
}
}
}

Every field in location is optional, so any of them can be missing. business holds the business’s own name, address, city, state, country, postal code, website, timezone, and logo URL. social holds profile URLs, plus googlePlacesId for the Google Business Places ID. settings holds four boolean flags: allowDuplicateContact, allowDuplicateOpportunity, allowFacebookNameMerge, and disableContactTimezone.

GET/locations/search

Search the locations your token can access, with pagination.

scope locations.readonlyauth Location token or PIT
Query parameter Type Required Description
companyId string No ID of the company to search within.
email string No Email address to search for.
skip string No Number of results to skip. Default 0.
limit string No Maximum number of results to return. Default 10.
order string No asc or desc. Default asc.
Terminal window
curl "https://services.smbcrm.com/locations/search?limit=10&skip=0&order=asc" \
-H "Authorization: Bearer <token>" \
-H "Version: v3"
200 OK
{
"locations": [
{
"id": "<location_id>",
"name": "Riverside Plumbing Co.",
"phone": "+15125550100",
"email": "hello@example.com",
"address": "412 Main St",
"city": "Austin",
"state": "TX",
"country": "US",
"postalCode": "78701",
"website": "https://example.com",
"timezone": "America/Chicago"
}
]
}

Each location also carries settings and social objects in the same shape as Get your location.

GET/locations/{locationId}/timezones

List the timezones available for your account/location.

scope locations.readonlyauth Location token or PIT

Returns valid timezone identifiers, which you can use for the timezone field when you create or update a contact. Your account/location’s own timezone is read-only with a Location token or PIT.

Terminal window
curl https://services.smbcrm.com/locations/<location_id>/timezones \
-H "Authorization: Bearer <token>" \
-H "Version: v3"

The example below is shortened.

200 OK
{
"timezones": [
"America/Chicago",
"America/Denver",
"America/Los_Angeles",
"America/New_York",
"UTC"
]
}
GET/locations/{locationId}/conversationChannels/{type}

List the SMS or email providers configured for your account/location, and which one is the default.

scope locations.readonlyauth Location token or PIT

type is SMS or Email. Each provider has an _id, a name, a type (SMS or Email), and a default flag that is true for the default provider. To read or send messages, see Conversations & Messages.

Terminal window
curl https://services.smbcrm.com/locations/<location_id>/conversationChannels/SMS \
-H "Authorization: Bearer <token>" \
-H "Version: v3"
200 OK
{
"conversationChannel": {
"SMS": [
{
"conversationProvider": {
"_id": "<provider_id>",
"name": "<provider_name>",
"type": "SMS",
"default": true
}
}
]
}
}

Saved templates are the SMS, email, and WhatsApp templates stored on your account/location. The email builder has its own template endpoints, documented on Email & Templates.

GET/locations/{locationId}/templates

List saved SMS, email, and WhatsApp templates.

scope locations/templates.readonlyauth Location token or PIT
Query parameter Type Required Description
originId string Yes Origin ID.
type string No Filter by template type: sms, email, or whatsapp.
deleted boolean No Set to true to list deleted templates. Default false.
skip string No Number of templates to skip. Default 0.
limit string No Maximum number of templates to return. Default 25.
Terminal window
curl "https://services.smbcrm.com/locations/<location_id>/templates?originId=<origin_id>&type=sms&limit=25" \
-H "Authorization: Bearer <token>" \
-H "Version: v3"

An SMS template has template.body and urlAttachments. An email template has template.subject and template.html. totalCount is the number of templates available.

200 OK
{
"templates": [
{
"id": "<template_id>",
"name": "Appointment reminder",
"type": "sms",
"template": {
"body": "Reminder: your appointment is tomorrow at 10 AM.",
"attachments": []
},
"dateAdded": "2026-10-01T14:30:00.000Z",
"locationId": "<location_id>",
"urlAttachments": []
},
{
"id": "<template_id>",
"name": "Welcome email",
"type": "email",
"template": {
"subject": "Welcome aboard",
"html": "<p>Thanks for signing up.</p>",
"attachments": []
},
"dateAdded": "2026-10-02T09:15:00.000Z",
"locationId": "<location_id>"
}
],
"totalCount": 2
}
POST/locations/{locationId}/tasks/search

Search tasks across your whole account/location.

scope locations/tasks.readonlyauth Location token or PIT

All body fields are optional. For the tasks on a single contact, see Contacts.

Body field Type Description
contactId array of strings Limit results to tasks on these contacts.
completed boolean true for completed tasks, false for pending tasks.
assignedTo array of strings Limit results to tasks assigned to these user IDs.
query string Search value, for example a task name.
limit number Maximum number of tasks to return. Default 25.
skip number Number of tasks to skip. Default 0.
businessId string Limit results to one business.
Terminal window
curl -X POST https://services.smbcrm.com/locations/<location_id>/tasks/search \
-H "Authorization: Bearer <token>" \
-H "Version: v3" \
-H "Content-Type: application/json" \
-d '{
"completed": false,
"assignedTo": ["<user_id>"],
"limit": 25,
"skip": 0
}'

The response wraps the matching tasks in a tasks array. An empty array means nothing matched.

200 OK
{
"tasks": []
}

A recurring task creates tasks on a schedule. The schedule goes in rruleOptions, which uses these fields:

rruleOptions field Type Required Description
intervalType string Yes yearly, monthly, weekly, daily, or hourly.
interval number Yes Number of intervalType units between occurrences. 2 with monthly repeats every two months.
startDate string Yes Start date and time, as an ISO 8601 string.
dueAfterSeconds number Yes Seconds from each task’s creation until it is due.
endDate string No End date and time, as an ISO 8601 string.
dayOfMonth number No Day of the month to repeat on.
dayOfWeek string No MO, TU, WE, TH, FR, SA, or SU.
monthOfYear number No Month of the year, 1 to 12.
count number No Maximum number of task runs.
createTaskIfOverDue boolean No Whether to create a task that is already overdue.
POST/locations/{locationId}/recurring-tasks

Create a recurring task.

scope recurring-tasks.writeauth Location token or PIT
Body field Type Required Description
title string Yes Name of the task.
rruleOptions object Yes The schedule, as described above.
description string No Description of the task.
contactIds array of strings No IDs of the contacts the task is for.
owners array of strings No IDs of the users the task is assigned to.
ignoreTaskCreation boolean No Set to true to skip creating the first task when you create the recurring task.
Terminal window
curl -X POST https://services.smbcrm.com/locations/<location_id>/recurring-tasks \
-H "Authorization: Bearer <token>" \
-H "Version: v3" \
-H "Content-Type: application/json" \
-d '{
"title": "Weekly check-in",
"description": "Call the customer and confirm next steps.",
"contactIds": ["<contact_id>"],
"owners": ["<user_id>"],
"rruleOptions": {
"intervalType": "weekly",
"interval": 1,
"dayOfWeek": "MO",
"startDate": "2026-10-12T09:00:00.000Z",
"dueAfterSeconds": 86400
}
}'

The response reports assignedTo and contactId as single ID strings.

201 Created
{
"recurringTask": {
"id": "<recurring_task_id>",
"title": "Weekly check-in",
"description": "Call the customer and confirm next steps.",
"locationId": "<location_id>",
"createdAt": "2026-10-08T15:04:00.000Z",
"updatedAt": "2026-10-08T15:04:00.000Z",
"rruleOptions": {
"intervalType": "weekly",
"interval": 1,
"dayOfWeek": "MO",
"startDate": "2026-10-12T09:00:00.000Z",
"dueAfterSeconds": 86400
},
"totalOccurrence": 1,
"deleted": false,
"assignedTo": "<user_id>",
"contactId": "<contact_id>"
}
}
GET/locations/{locationId}/recurring-tasks/{id}

Get one recurring task by ID.

scope recurring-tasks.readonlyauth Location token or PIT
Terminal window
curl https://services.smbcrm.com/locations/<location_id>/recurring-tasks/<recurring_task_id> \
-H "Authorization: Bearer <token>" \
-H "Version: v3"

Returns the same recurringTask object as create.

PUT/locations/{locationId}/recurring-tasks/{id}

Update a recurring task.

scope recurring-tasks.writeauth Location token or PIT

The body takes the same fields as create, and none is required. If you send rruleOptions, include intervalType, interval, startDate, and dueAfterSeconds in it.

Terminal window
curl -X PUT https://services.smbcrm.com/locations/<location_id>/recurring-tasks/<recurring_task_id> \
-H "Authorization: Bearer <token>" \
-H "Version: v3" \
-H "Content-Type: application/json" \
-d '{
"title": "Monthly check-in",
"rruleOptions": {
"intervalType": "monthly",
"interval": 1,
"dayOfMonth": 1,
"startDate": "2026-11-01T09:00:00.000Z",
"dueAfterSeconds": 86400
}
}'

Returns the updated recurringTask object with 200 OK.

DELETE/locations/{locationId}/recurring-tasks/{id}

Delete a recurring task.

scope recurring-tasks.writeauth Location token or PIT
Terminal window
curl -X DELETE https://services.smbcrm.com/locations/<location_id>/recurring-tasks/<recurring_task_id> \
-H "Authorization: Bearer <token>" \
-H "Version: v3"
200 OK
{
"id": "<recurring_task_id>",
"success": true
}
  • Custom Fields, Values & Tags: define custom fields and manage custom values and tags. Custom values and tags are scoped under /locations/{locationId}.
  • Contacts: the people that belong to your location, and the tasks on each contact.
  • Conversations & Messages: read conversations and send SMS and email messages.
  • Email & Templates: templates built in the email builder.
  • Scopes: the permissions your token needs for each endpoint.