LockstepsConnector Analytics

Quickstart

Quickstart

Create an account, confirm the email, and copy the API key in setup. The key is shown once. Only a hash is stored.

  1. Open account setup and confirm the email.
  2. Name the organization, add a connector slug such as my-mcp-server, and choose whether counted events may join the shared view.
  3. Copy the key. Paste the coding-tool prompt into Cursor, Claude Code, Codex, or Copilot, with YOUR_API_KEY and YOUR_CONNECTOR_ID filled in by you, not committed.
  4. Send a test from setup, or run the curl command. The test uses is_test true and does not count toward the shared view.
  5. Stay on the page. It checks every 3 seconds for up to 5 minutes, then says when the first event arrived.

Read phrases at locksteps.ai after you are signed in. The same screen is at /analytics/dashboard.

Prompt for a coding tool

Add Locksteps Connector Analytics to this connector.

After each user-facing tool call, POST one JSON event to https://www.locksteps.ai/v1/analytics/ingest.
Use a bearer API key. Do not print the key, commit it, or write it to logs.

Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

{
  "connector_id": "YOUR_CONNECTOR_ID",
  "phrase": "<the user phrase or tool query>",
  "tool_name": "<the tool or action name>",
  "platform": "chatgpt | muse | claude | grok | gemini | copilot | cursor | perplexity | mcp | api | other",
  "ts": "<ISO-8601 timestamp>",
  "event_id": "<unique id for this call>"
}

phrase is the field to send. user_intent and query are accepted aliases of phrase.
Optional fields, when you have them: outcome ("success", "no_result", or "error"), latency_ms (integer), result_count (integer), country (ISO-3166 alpha-2), session_id (conversation-scoped opaque string, max 128; reuse across tool calls; if omitted the server mints one and returns it; hashed at rest), connector_version (at most 32 characters).

FREE conversions: keep session_id, then POST https://www.locksteps.ai/v1/analytics/conversion with event_name such as lead_submitted or purchase_completed.
Set is_test to true only for a manual test. Test events are stored and do not count toward the shared view.
Optional sample_rate is the fraction of events you kept, greater than 0 and at most 1. Send it when you sample so the dashboard can scale counts. If the server averages more than about 1 event per second, sample instead of sending every event.
Each key can burst up to 600 events, then about 2 per second. An organization can store 100,000 counted events per day (10,000 during its first 7 days), resetting at 00:00 UTC. A 429 sets Retry-After. Wait that many seconds before the next send.
Do not put emails, phone numbers, names, account ids, or raw secrets in phrase.
A logging failure must not change the tool result. Use a short timeout and ignore errors.

TypeScript

const INGEST_URL = "https://www.locksteps.ai/v1/analytics/ingest";

// phrase is what the person asked. user_intent and query are accepted aliases.
export async function logConnectorEvent(input: {
  connectorId: string;
  apiKey: string;
  phrase: string;
  toolName: string;
  eventId: string;
  platform?: string;
}) {
  await fetch(INGEST_URL, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${input.apiKey}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      connector_id: input.connectorId,
      platform: input.platform,
      phrase: input.phrase,
      tool_name: input.toolName,
      ts: new Date().toISOString(),
      event_id: input.eventId,
    }),
  });
}

curl test

curl -sS https://www.locksteps.ai/v1/analytics/ingest \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "connector_id": "YOUR_CONNECTOR_ID",
    "platform": "api",
    "phrase": "where is the package status",
    "tool_name": "track_package",
    "ts": "2026-10-04T12:00:00.000Z",
    "event_id": "evt-test-1",
    "is_test": true
  }'

More

Questions: hi@locksteps.ai