Skip to content

Find the records a field holds a value in

POST
/orgs/{org}/connectors/{id}/records/{module}/match
curl --request POST \
--url https://api.sloose.com/orgs/org_9f3c/connectors/cnn_9f2a/records/Accounts/match \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "field": "example", "method": "equals", "values": [ "example" ], "whole": true, "limit": 1, "offset": 1, "run": "example" }'

The typed match (#2184): the records whose field holds any of values, by equals (case and the ASCII space at either end ignored, a precomposed accent and its bare letter the same, an accent written as two characters another value) or starts_with (a plain prefix), asked of the CRM’s query API and answered with each record whole. A POST because a body carries 100 values of 255 characters, which an address cannot; it is a READ — a read-only staff view may use it — and writes nothing.

A value the query will not take is refused with words, the caller’s row failing with them: never “no record”, and never a create. more says the query has further records than this page holds; read on with offset. A connection the CRM has not granted the query permission to is refused with the Reconnect words (code: OAUTH_SCOPE_MISMATCH). A refusal on a module is decided from the connection: where the connection is known to hold the permission (or the probe of Leads, Contacts and Accounts finds it does) the module is simply not queryable and its rows fail with 422 MODULE_NOT_QUERYABLE; otherwise it is the permission missing. A field this connection’s discovery never read is refused in refused, not asked.

org
required

The organisation id the session was issued for. A token for one organisation can never read another.

string
Example
org_9f3c

The organisation id the session was issued for. A token for one organisation can never read another.

id
required

The connector id, from GET /orgs/{org}/connectors.

string
Example
cnn_9f2a

The connector id, from GET /orgs/{org}/connectors.

module
required

The module’s API name in the destination.

string
Example
Accounts

The module’s API name in the destination.

Media typeapplication/json
object
field
required

The field’s API name.

string
>= 1 characters <= 200 characters
method
required
string
Allowed values: equals starts_with contains
values
required

1 to 100 values, each as the file holds it. A value the query will not take (a control character, over 255 characters, not the field’s shape) comes back in refused with words, never as “no record”.

Array<string>
>= 1 items <= 100 items
whole

False: answer each record with its id and the field matched (a record picker), without reading it back whole. Default true.

boolean
limit

At most this many records (a record picker’s page); the query’s own page is 200.

integer
>= 1 <= 200
offset

Records to skip, for a caller reading on past a page that said more.

integer
run

The run this read is made under, which marks it if the day’s allowance is spent.

string
<= 64 characters

The matching records, and what was not asked.

Media typeapplication/json
object
records
required
Array<object>
object
$display_name

Added by Sloose, not the CRM: the record’s name as the CRM shows it, read from the field its module names records by (Zoho’s display_field — Account_Name, Full_Name, Vendor_Name). Absent when that field is empty, and from a search or a single record when the field could not be learned just then.

string
key
additional properties
more
required

The query says there are more records than this page holds.

boolean
asked
required

The values the query asked, each once.

Array<string>
refused
required

The values it would not ask, each with why. The caller fails the row with the words.

Array<object>
object
value
required
string
reason
required
string
rest
required

Values that did not fit this query’s 100 values or 25 criteria: ask them again.

Array<string>
Examplegenerated
{
"records": [
{
"$display_name": "example"
}
],
"more": true,
"asked": [
"example"
],
"refused": [
{
"value": "example",
"reason": "example"
}
],
"rest": [
"example"
]
}

No bearer, or one that no longer resolves: a session that is unknown or expired (code: AUTH_REQUIRED), or an API token that was revoked or expired (TOKEN_REVOKED, TOKEN_EXPIRED), whose organisation is gone (ORG_NOT_FOUND) or whose member or user row is (MEMBERSHIP_GONE).

Media typeapplication/json

The error envelope every non-2xx answer uses.

object
error
required

Human-readable explanation.

string
code

Machine-readable reason. Absent on a few legacy 400s.

string
key
additional properties
Examplegenerated
{
"error": "example",
"code": "example"
}

The bearer’s role is too low (code: ROLE_REQUIRED), or it was issued for a different organisation; the organisation has been closed (code: ORG_CLOSED, either kind of bearer); the person is banned (code: BANNED, a session); or it is a session that is signed in but in no organisation (code: NO_ORG): one that never joined one, or whose person was taken out of the one it was in, or left it. Signing in again changes nothing for NO_ORG; choosing or making an organisation does.

Media typeapplication/json

The error envelope every non-2xx answer uses.

object
error
required

Human-readable explanation.

string
code

Machine-readable reason. Absent on a few legacy 400s.

string
key
additional properties
Examplegenerated
{
"error": "example",
"code": "example"
}

No such connector, or it is not visible to this session (NOT_FOUND); or the connection has no module of that name — only its modules, as its discovery read them, are asked of the CRM (MODULE_NOT_FOUND).

Media typeapplication/json

The error envelope every non-2xx answer uses.

object
error
required

Human-readable explanation.

string
code

Machine-readable reason. Absent on a few legacy 400s.

string
key
additional properties
Examplegenerated
{
"error": "example",
"code": "example"
}

The CRM rejected the query.

Media typeapplication/json
object
error
required
string
zoho
required
object
code
required
string | null
status
required
number | null
details
retryable
required
boolean
response
unanswered
required

True when Zoho gave no answer that says what was done — the connection dropped or timed out, Zoho failed on its side (a 5xx, or the same for the one record inside a 2xx), the answer was lost after its status or was not JSON, or Zoho said it made the record without saying which — so what was asked may have been done all the same: a create sent again after one may make a second record. A write that went unanswered stays counted, and its row may be written again for nothing. False when Zoho answered by declining (a 4xx, or a per-record refusal inside a 2xx), which made nothing.

boolean
rateLimited

True when Zoho asked for fewer calls and declined this one (TOO_MANY_REQUESTS): nothing was done, and the same call a little later may land — a write included, since a declined one made nothing. Absent from an older API.

boolean
retryAfterMs

How long Zoho asked to be left alone before the next call, in milliseconds, from its Retry-After; also sent as this response’s own Retry-After, in seconds. Null when it said nothing.

number | null
quotaSpent

True when the rate limit is the CRM’s daily allowance of API calls used up — a 429 whose X-API-CREDITS-REMAINING says none are left — which waiting seconds does not bring back. Without that header the two limits cannot be told apart, and this is false.

boolean
Examplegenerated
{
"error": "example",
"zoho": {
"code": "example",
"status": 1,
"details": "example",
"retryable": true,
"response": "example",
"unanswered": true,
"rateLimited": true,
"retryAfterMs": 1,
"quotaSpent": true
}
}

Zoho is throttling how often this connection’s access is renewed — ten tokens from one grant in ten minutes — so nothing was sent (code: CONNECTION_THROTTLED; written: false on a write). Retry-After says when to ask again. The connection is kept: only a grant Zoho refuses ends it. A renewal throttled after the call reached Zoho is Zoho’s rate limit, relayed as a 502 with zoho.rateLimited.

Or the CRM’s API allowance for the last 24 hours is spent (zoho.quotaSpent: true, zoho.rateLimited: true, zoho.retryable: false), said one of two ways. Zoho itself refused the call (zoho.code: TOO_MANY_REQUESTS, credits left 0): relayed as this 429, never a 502, since asking again soon is refused again. Or the tenant’s gate refused it before it was sent, because Zoho had already said so: this API’s own refusal, with no zoho (code: DAILY_ALLOWANCE_SPENT; written: false on a write). Neither carries Retry-After: Zoho’s day is a rolling 24 hours and it names no time at which credits return, so Sloose lets one call a minute through to ask, and the first one answered is the allowance’s return. GET …/credits says whether the day is held spent (spent, spentAt). A system that does name its renewal is answered with Retry-After until then.

Media typeapplication/json
object
error
required
string
code
required

Why: CONNECTION_UNAVAILABLE (502) when a Zoho token for the connection will not refresh, CONNECTION_THROTTLED (429) when Zoho is throttling its renewal — ten tokens from one grant in ten minutes — and the connection is kept, and DAILY_ALLOWANCE_SPENT (429) when the connected system said a daily allowance the call draws on is spent, which waiting seconds does not bring back.

string
written

On a write: refused before the record was sent to the CRM, so nothing was written and a retry makes no second record. Absent from a read.

boolean
key
additional properties
Example
{
"written": false
}

Zoho is rate-limiting (zoho.unanswered false: nothing was done), or did not answer — it could not be reached, failed on its side, or answered without saying what it did (zoho.unanswered true: what was asked may have been done). Or this API could not use the connection before anything was sent — a Zoho token that will not refresh (code: CONNECTION_UNAVAILABLE) — and says so on a write with written: false: nothing was written.

Media typeapplication/json
Any of:
object
error
required
string
zoho
required
object
code
required
string | null
status
required
number | null
details
retryable
required
boolean
response
unanswered
required

True when Zoho gave no answer that says what was done — the connection dropped or timed out, Zoho failed on its side (a 5xx, or the same for the one record inside a 2xx), the answer was lost after its status or was not JSON, or Zoho said it made the record without saying which — so what was asked may have been done all the same: a create sent again after one may make a second record. A write that went unanswered stays counted, and its row may be written again for nothing. False when Zoho answered by declining (a 4xx, or a per-record refusal inside a 2xx), which made nothing.

boolean
rateLimited

True when Zoho asked for fewer calls and declined this one (TOO_MANY_REQUESTS): nothing was done, and the same call a little later may land — a write included, since a declined one made nothing. Absent from an older API.

boolean
retryAfterMs

How long Zoho asked to be left alone before the next call, in milliseconds, from its Retry-After; also sent as this response’s own Retry-After, in seconds. Null when it said nothing.

number | null
quotaSpent

True when the rate limit is the CRM’s daily allowance of API calls used up — a 429 whose X-API-CREDITS-REMAINING says none are left — which waiting seconds does not bring back. Without that header the two limits cannot be told apart, and this is false.

boolean
Example
{
"written": false
}

The restore switch is on (code: MAINTENANCE): every route but /health and /robots.txt is refused before anything is read, except the operator’s own POST /staff/people/{id}/delete with the ADMIN_TOKEN. Sloose is down for maintenance. Please try again in a few minutes.

Media typeapplication/json
object
error
required
string
code
required
string
Allowed value: MAINTENANCE
Example
{
"code": "MAINTENANCE"
}
Retry-After
integer

Seconds until asking again is worth it (300 while the switch is on).

Report a problem with this page

sloose.com