Myosin

CRM Integration Reference

Myosin CRM API Docs

A secure, read-first CRM API for conversations, transcripts, customers, projects, and message/voice automations. This guide is everything your team needs to connect and start pulling data.

Quick start

1 — Your portal
Sign in to generate and manage API keys: Open the Key Portal

Live URL: /portal/

2 — Your access code

e3f2fdf6

Enter this code on the portal login screen. Keep it confidential — anyone with it can create API keys for your account.

3 — Create a key & call the API
In the portal, click Generate API Key, copy the key (shown once), then use it as a Bearer token in the examples below.

Contents

Authentication Base URL & conventions Errors & pagination Read-only API (/v1) Hub API — read Hub API — write Automation events Permission scopes

Authentication

Every API request must include an API key as a Bearer token in the Authorization header. Keys are created in the Key Portal and begin with obq_live_ (production) or obq_test_ (testing).

Authorization: Bearer obq_live_xxxxxxxxxxxxxxxxxxxxx

Requests with a missing, invalid, expired, or revoked key return 401 Unauthorized. Your key is automatically scoped to your account — you only ever see your own data.

Base URL & conventions

ItemValue
Base URLhttps://your-domain
Health checkGET /health{ "status": "ok" } (no auth)
FormatJSON request & response bodies; Content-Type: application/json
Read API/v1/* — strictly read-only (only GET/HEAD; other methods return 405)
Hub API/hub/v1/* — read & write CRM operations and automations

Errors & pagination

Error shape

{
  "error": "Not Found",
  "message": "Conversation not found"
}

Common statuses: 400 bad request, 401 auth, 403 missing scope, 404 not found, 405 read-only violation, 502 provider/dispatch failure.

Pagination

List endpoints accept limit (default 50, max 200) and offset (default 0).

{
  "data": [ ... ],
  "pagination": { "limit": 50, "offset": 0, "total": 128 }
}

Read-only API /v1

Conversation and transcript data. Requires a valid key. Read-only — write attempts return 405.

GET /v1/conversations

List conversations. Filters: channel, status, start_date, end_date, plus limit/offset.

GET /v1/conversations/{conversationId}

Fetch a single conversation.

GET /v1/conversations/{conversationId}/messages

List messages in a conversation (paginated).

GET /v1/conversations/{conversationId}/transcript

Full transcript. Add ?format=text for plain-text output (default is JSON).

Example

curl -H "Authorization: Bearer obq_live_xxx" \
  "https://your-domain/v1/conversations?limit=5"

Hub API — read /hub/v1 · scope: read:hub

GET /hub/v1/customers — list customers (paginated)
GET /hub/v1/projects — list projects · filters: pipeline_stage, project_status
GET /hub/v1/projects/{projectId} — single project
GET /hub/v1/projects/{projectId}/events — project event history
GET /hub/v1/communications — queued/sent messages · filter: status
GET /hub/v1/templates — message templates
GET /hub/v1/providers — supported providers (sendblue, vapi)
GET /hub/v1/integrations — configured integrations (secrets masked)

Hub API — write /hub/v1 · scope: write:hub

POST /hub/v1/customers — create/update a customer · requires id or external_id
POST /hub/v1/projects — create/update a project · requires customer_id
PATCH /hub/v1/projects/{projectId}/status — update status/stage; triggers matching automations
POST /hub/v1/events — record an event · requires project_id, event_type
POST /hub/v1/communications — queue a message · requires channel, content
POST /hub/v1/communications/{id}/dispatch — send a queued message via provider (sms/imessage = Sendblue, call = Vapi)
POST /hub/v1/communications/{id}/mark-sent — mark a message as sent
POST /hub/v1/campaigns/adjust — adjust a campaign · requires campaign_id, action
POST /hub/v1/integrations/{provider} — store provider config · requires config.api_key

Example — update a project status

curl -X PATCH \
  -H "Authorization: Bearer obq_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{ "project_status": "contract_signed" }' \
  "https://your-domain/hub/v1/projects/PROJECT_ID/status"

Automation events

Posting an event (or changing a project status) automatically queues the matching SMS/email messages from your template library. SMS & iMessage send through Sendblue; voice calls through Vapi. (Email templates are queued; an email provider is not currently connected.)

Event typeChannels queued
website_visitedSMS
process_abandonedSMS + a 14-day email drip
contract_readySMS + email
contract_generatedSMS reminders (1d / 7d / 23d)
contract_signedSMS + email
build_day_confirmedSMS + email
material_order_placedSMS + email
day_before_buildSMS + email
weather_warning / weather_delaySMS + email
install_complete_payment_pendingSMS + email (24h)
paid_in_fullSMS + email

Permission scopes

Each API key carries one or more scopes. New keys default to all four.

ScopeGrants
read:conversationsRead conversations & messages
read:transcriptsRead full transcripts
read:hubRead customers, projects, events, communications, templates
write:hubCreate/update CRM records, trigger events & dispatch messages