Schedules & meeting invites

Tables: user_availability, followups with Meeting type + meeting_token. Bookable slots apply the same rules as the sales UI (exceptions, buffers, bookings, min notice).

Meeting types: discovery_call, demo, follow_up_call, in_person. MCP tools: get_availability_slots, schedule_meeting.

Quickstart

Base URL (canonical)

https://api.strackerapp.com/v1/

Same gateway also answers under /api/v1 on strackerapp.com. Prefer the api. subdomain. Do not use api.stracker.io (not wired; returns 403).

Environments (keep separate)

EnvBaseKeys
Productionhttps://api.strackerapp.com/v1sk_prod_… only
Local smokehttp://127.0.0.1:8888/api/v1sk_dev_… only

Never mix prod keys with local, or local keys with prod.

Auth (all endpoints)

Org-scoped Bearer API key. Agent keys act as the agent with reports_to ACL inheritance.

Authorization: Bearer sk_REPLACE
Content-Type: application/json

# Optional alternate header:
# X-Stracker-Api-Key: sk_REPLACE

Response envelope

{
  "success": true,
  "data":   { /* endpoint-specific payload */ }
}

Errors

Failed responses always have success: false and an error object with a stable code and a human-readable message:

{
  "success": false,
  "error": {
    "code":    "VALIDATION_ERROR",
    "message": "company_name is required"
  }
}
HTTP statusWhenWhat to do
400Validation failed (missing required fields, bad enum, migration not applied for company/contact notes, assignee not in org, slot unavailable).Read error.message; fix the payload.
401Missing or invalid Authorization / X-Stracker-Api-Key.Check the API key; confirm the header is present.
403Key is valid but lacks permission (e.g. non-admin calling agent admin endpoints), or org scope mismatch.Use an org-admin key, or confirm the resource belongs to the key's org.
404Resource not found or not visible to this org.Verify the id and org scoping.
500Unexpected server error.Retry with backoff; report if persistent.

Schedules & meeting invites

Endpoints at a glance

ActionMethod + PathSummary
List weekly availabilityGET /schedulesWeekly availability windows for a sales rep. Required: user_id.
List bookable slotsGET /schedules/slotsBookable meeting slots for a sales rep (same rules as sales UI).
List meeting invitesGET /meeting-invitesList scheduled meeting invites (followups of type Meeting).
Schedule a meetingPOST /meeting-invitesSchedule a meeting on a free slot. Requires lead_id, sales rep (user_id/user_email/rep_email), and followup_date on a free slot.

GET /schedules

Weekly availability windows for a sales rep. Required: user_id.

Query parameters

FieldTypeRequiredDescription
user_id integer yes Sales rep users.id

Request example

curl -sS "https://api.strackerapp.com/v1/schedules?user_id=1" \
  -H "Authorization: Bearer sk_REPLACE"

Response 200 OK

{
  "success": true,
  "data": {
    "schedules": [
      { "day_of_week": 1, "start_time": "09:00:00", "end_time": "17:00:00" }
    ]
  }
}

GET /schedules/slots

Bookable meeting slots for a sales rep (same rules as sales UI).

Query parameters

FieldTypeRequiredDescription
user_id integer no Sales rep users.id (or user_email)
user_email string no Alternate to user_id
start_date string no YYYY-MM-DD
end_date string no YYYY-MM-DD
days integer no Horizon in days Default: 14.
exclude_followup_id integer no Exclude an existing meeting when rescheduling

Request example

curl -sS "https://api.strackerapp.com/v1/schedules/slots?user_id=1&days=14" \
  -H "Authorization: Bearer sk_REPLACE"

Response 200 OK

{
  "success": true,
  "data": {
    "slots": [
      { "start": "2026-09-22 15:00:00", "end": "2026-09-22 15:30:00" }
    ]
  }
}

GET /meeting-invites

List scheduled meeting invites (followups of type Meeting).

Query parameters

FieldTypeRequiredDescription
lead_id integer no Filter by lead
venue_id integer no Filter by venue
user_email string no Rep email
completed integer no 0 or 1
limit integer no Page size Default: 50.
offset integer no Offset

Request example

curl -sS "https://api.strackerapp.com/v1/meeting-invites?limit=5" \
  -H "Authorization: Bearer sk_REPLACE"

Response 200 OK

{
  "success": true,
  "data": {
    "meeting_invites": [
      { "id": 80, "lead_id": 1, "followup_date": "2026-09-22 15:00:00", "meeting_type": "demo", "completed": 0 }
    ]
  }
}

POST /meeting-invites

Schedule a meeting on a free slot. Requires lead_id, sales rep (user_id/user_email/rep_email), and followup_date on a free slot.

Body parameters

FieldTypeRequiredDescription
lead_id integer yes Lead id
user_id integer no Rep users.id
user_email string no Rep email
rep_email string no Alias for user_email
followup_date string yes YYYY-MM-DD HH:MM:SS on a free slot
meeting_type string no discovery_call|demo|follow_up_call|in_person
duration_minutes integer no Duration
notes string no Notes

Request example

curl -sS https://api.strackerapp.com/v1/meeting-invites \
  -H "Authorization: Bearer sk_REPLACE" \
  -H "Content-Type: application/json" \
  -d '{"lead_id":123,"user_id":9,"followup_date":"2026-09-22 15:00:00","meeting_type":"demo","duration_minutes":30,"notes":"Booked by agent"}'

Response 201 Created

{
  "success": true,
  "data": {
    "meeting_invite": {
      "id": 81,
      "lead_id": 123,
      "followup_date": "2026-09-22 15:00:00",
      "meeting_type": "demo",
      "duration_minutes": 30
    }
  }
}