Scoutello API
The Scoutello API is a server-to-server API for synchronizing an organization's contacts, tasks, protocols, opportunities, projects, and events in both directions. It also exposes read-only outbound mail history and entity-aware tag discovery. Incremental GET/list routes and idempotent batch upserts are the synchronization primitives in this version. It does not expose delete operations or webhooks.
The API base URL is:
https://admin.scoutello.com/api/v1
It is also shown in Organization settings → Developer/API. The OpenAPI document is available at:
https://admin.scoutello.com/api/v1/openapi.json
Create and protect a key
An organization administrator can create an integration and API key in Organization settings → Developer/API. The complete key is shown once. Copy it into a secret manager before closing the dialog; Scoutello cannot display the complete key again.
- Use a separate integration and key for each external system and environment.
- Grant only the scopes that system needs.
- Never put a key in browser code, a URL, source control, logs, support messages, or client-side storage.
- Rotate keys on a schedule. When an active integration is rotated, the replacement key works immediately and the previous key remains valid for no more than 15 minutes so the external system can switch without downtime. An existing earlier expiry still applies, so the previous key may stop working sooner.
- If a key may have been exposed, pause the integration before rotating it. Pausing temporarily rejects all of the integration's keys. A rotation while paused has no overlap: the previous key stays disabled, and the replacement key remains disabled until the integration is resumed.
- Permanently revoke the entire integration when disconnecting an external system. Revocation disables every one of its keys and cannot be undone.
Send the key on every authenticated request:
Authorization: Bearer YOUR_API_KEY
Bearer authentication is preferred. Clients that cannot set Authorization may use x-api-key instead. Do not send both headers; requests with different values in both headers are rejected.
The API is intended for backend clients and does not enable cross-origin browser access.
Use GET /whoami after configuring a key to verify the integration, organization, scopes, and key limits without retrieving user personal data.
Scopes
| Scope | Allows |
|---|---|
contacts.read | List and retrieve contacts. Organization-account and access-bearing member contacts are excluded. |
contacts.write | Validate and apply contact upserts. |
tasks.read | List and retrieve non-private tasks. |
tasks.write | Validate and apply task upserts. |
protocols.read | List and retrieve non-private protocols. |
protocols.write | Validate and apply protocol upserts. |
opportunities.read | List and retrieve opportunities. |
opportunities.write | Validate and apply opportunity upserts. |
projects.read | List and retrieve projects. |
projects.write | Validate and apply project upserts. |
events.read | List and retrieve events and core schedules. |
events.write | Validate and apply event upserts. |
mails.read | Read sent and failed organization-owned outbound mail history. |
tags.read | Discover selectable tags for supported entity types. |
Private tasks and protocols are never returned by this API. A missing scope returns an authorization error; it is not treated as an empty result.
New keys use the sctl_api_ prefix and start with contacts.write only. Every other scope is an explicit opt-in that an organization administrator must grant when creating or rotating a key. Existing credentials keep their current scopes and remain valid.
MCP access
The same Scoutello API key and scopes can be used with the streamable HTTP MCP endpoint:
https://admin.scoutello.com/api/v1/mcp
Configure the MCP client to send Authorization: Bearer YOUR_API_KEY. The legacy /api/mcp URL remains a path compatibility alias, but new clients should use the versioned endpoint. Former sctl_mcp_ credentials are not accepted; replace them with a Scoutello API integration key.
MCP tools map directly to the REST contract and use the same runtime schemas, tenant checks, integration lifecycle, rate limit, and service methods. For example, contacts_list, contacts_get, contacts_get_by_external_id, and contacts_batch_upsert mirror the four contact routes. The same pattern applies to tasks, protocols, opportunities, projects, and events; mail exposes mails_list and mails_get, while tags expose tags_list.
The server only advertises tools allowed by the current key's scopes. A key with contacts.read can discover the contact read tools but not contacts_batch_upsert; a key with contacts.write gets the batch-upsert tool but not the read tools. whoami is always available. Write tools have the same immediate effects as their REST equivalents, so use mode: "validate" when a caller should inspect a batch without applying it.
MCP is also server-to-server and does not enable cross-origin browser access. Its JSON-RPC transport needs a dedicated URL, so it cannot share an individual REST resource URL even though authentication and data behavior are shared.
For complete client configuration, verification, tool mapping, and troubleshooting instructions, see the MCP integration guide.
Read records
Contacts, tasks, protocols, opportunities, projects, and events use the same read routes:
GET /contacts?limit=50&updatedSince=2026-09-01T00:00:00.000Z
GET /contacts/{scoutelloId}
GET /contacts/external/{externalId}
Replace contacts with tasks, protocols, opportunities, projects, or events for the other synchronization resources. externalId appears in a read DTO when the record has been linked by this integration.
A list response has this envelope:
{
"data": [],
"page": {
"nextCursor": null,
"hasMore": false,
"snapshotAt": "2026-09-01T12:00:00.000Z"
},
"requestId": "request-id"
}
limit must be from 1 to 100. Results are ordered by the effective time when their public API representation changed and then by Scoutello ID. This effective time can be later than the returned entity updatedAt when integration-link metadata changed. Cursors are opaque: store and send them unchanged, and do not derive meaning from their contents.
The first response fixes snapshotAt for that traversal. Follow nextCursor until hasMore is false before starting another incremental read. This prevents records changing during pagination from making the current traversal unstable.
For incremental synchronization, consume every cursor page and then persist that traversal's snapshotAt as the high-water timestamp. Pass it as the ISO 8601 updatedSince value on the next traversal. The lower bound is inclusive, so retrying a completed snapshot can return boundary records but cannot skip them.
A single-record response has this envelope:
{
"data": {},
"requestId": "request-id"
}
Single-contact responses also include a relations array. Each relation keeps
its Scoutello relation ID, creation time, type, notes, and connectedFrom and
connectedTo contact references. Contact references contain the Scoutello ID
and this integration's external ID when one exists. Contacts excluded by the
API's organization-access privacy boundary are not exposed through relations.
The contact list response stays compact and does not include relations; use
either single-contact route when relationship detail is needed.