Now Live

Your run, your API.

DotDot is the first GPS tracking platform built for LLM agents. Manage followers, react to run events, send cheers — all programmatic.

webhook — run.started
// your agent receives this
{
"event": "run.started",
"runner": "sarah",
"run_id": "a1b2c3d4",
"tracking_url": "dotdot.sivoov.app/sarah",
"started_at": "2025-07-12T06:30:00Z"
}
// agent posts to Discord, texts the crew
$ curl -X POST your-discord-webhook \
-d "Sarah just started running!"

What agents do with DotDot

Real use cases, real endpoints. Your agent handles the logistics — you handle the elevation.

🏁

Race-day crew coordinator

Before a 100-miler, your agent bulk-invites your crew, sets privacy to friends-only, and schedules notification days. During the race, it relays cheers to your Discord.

POST /api/me/followers/bulk-invite
Authorization: Bearer dotdot_pat_k8x...
{
"invites": [
{ "email": "[email protected]" },
{ "email": "[email protected]" },
{ "email": "[email protected]" }
]
}
🔀

Cross-platform bridge

Your agent watches for run events and posts updates to Slack, Discord, Strava clubs, or your blog. Real-time, zero manual effort.

// webhook: run.finished
{
"event": "run.finished",
"runner": "arthur",
"distance_meters": 80467,
"duration_seconds": 51840,
"spectator_count": 247
}
// "Arthur finished 50mi in 14:24"
🛡️

Smart follower manager

Auto-approve anyone from your running club's email domain. Deny the rest. Get a Telegram ping for edge cases.

// webhook: follower.requested
{
"event": "follower.requested",
"follower_id": "f9e8d7c6",
"email": "[email protected]",
"nickname": "Jamie"
}
// agent checks domain → approve
POST /api/me/followers/f9e8d7c6/approve

Autonomous hype bot

Your agent sends personalized cheers based on progress. It knows when you've been climbing for an hour and sends the right words.

// agent reads live position
GET /api/runners/sarah/current
// detects big climb, sends cheer
POST /api/runs/a1b2c3d4/cheers
{
"nickname": "Coach Bot",
"message": "8hrs in, summit done."
}

Getting started

Three steps. No SDK.

01

Create an API token

One click in your dashboard. Pick scopes, name it, copy it. Shown once, hashed forever.

read:runs · write:followers · write:events

02

Register a webhook

Tell us where to send events. We sign every payload with HMAC-SHA256 so you know it's us.

run.started · run.finished · follower.approved

03

Your agent reacts

Events arrive as POST requests. Your agent calls the DotDot API back. That's the whole loop.

HTTPS + JSON — no SDK required

Reference

API at a glance

Standard REST. Authorization: Bearer dotdot_pat_...

GET/api/runners/:username
Runner profilepublic
GET/api/runners/:username/current
Live run + trackpointspublic
GET/api/runners/:username/runs
Run historypublic
POST/api/runs/:runId/cheers
Send a cheerpublic
GET/api/me
Your profileread:profile
GET/api/me/followers
List followersread:followers
POST/api/me/followers/invite
Invite a followerwrite:followers
POST/api/me/followers/bulk-invite
Bulk invite (max 50)write:followers
POST/api/me/followers/:id/approve
Approve requestwrite:followers
POST/api/me/followers/:id/deny
Deny requestwrite:followers
DELETE/api/me/followers/:id
Remove followerwrite:followers
GET/api/me/privacy
Privacy settingsread:profile
PUT/api/me/privacy
Update privacywrite:privacy
POST/api/me/shared-days
Schedule notification daywrite:privacy
POST/api/me/cheers/send
Cheer own active runwrite:cheers
GET/api/me/tokens
List API tokensClerk JWT
POST/api/me/tokens
Create API tokenClerk JWT
DELETE/api/me/tokens/:id
Revoke tokenClerk JWT
GET/api/me/webhooks
List webhooksread:events
POST/api/me/webhooks
Create webhookwrite:events
PATCH/api/me/webhooks/:id
Update webhookwrite:events
DELETE/api/me/webhooks/:id
Delete webhookwrite:events
GET/api/me/activity
Activity feedread:profile
GET/api/me/garmin/status
Garmin connectionread:profile

Full OpenAPI 3.1 spec at /api/openapi.json

Real-time

Events, not polling

Register a webhook URL. We POST signed JSON payloads when things happen. HMAC-SHA256 on every request. Retry with exponential backoff. Your agent reacts in real time.

run.started

Runner begins a GPS-tracked run

run.finished

Run completed with summary stats

cheer.received

Someone cheered during a run

follower.requested

New follow request incoming

follower.approved

Follow request was approved

spectator.milestone

3, 5, 10, 25, 50, 100 watchers

trackpoints.batch

New GPS data (configurable)

incoming webhook
1POST https://your-agent.dev/webhook
2X-DotDot-Signature: sha256=a8f5f1...
3Content-Type: application/json
4
5{
6 "event": "spectator.milestone",
7 "timestamp": "2025-07-12T09:45:00Z",
8 "data": {
9 "run_id": "a1b2c3d4",
10 "runner": "sarah",
11 "threshold": 50,
12 "count": 53,
13 "top_followers": [
14 "Coach Mike",
15 "Alex",
16 "Sam"
17 ]
18 }
19}

Verify the signature. Parse the JSON. Do your thing.

.well-known/agent.json
1GET /.well-known/agent.json
2
3{
4 "name": "DotDot",
5 "description": "Live GPS run tracking for ultra runners — programmable API for agents",
6 "url": "https://dotdot.sivoov.app",
7 "openapi": "https://dotdot.sivoov.app/api/openapi.json",
8 "auth": {
9 "type": "bearer",
10 "instructions": "Create a Personal Access Token at /dashboard?tab=integrations"
11 },
12 "webhook_events": [
13 "run.started",
14 "run.finished",
15 "cheer.received",
16 "follower.requested",
17 "follower.approved",
18 "spectator.milestone",
19 "trackpoints.batch"
20 ]
21}

Standards-first

Auto-discovery built in

DotDot publishes a standard discovery file at /.well-known/agent.json. Any agent framework that speaks OpenAPI can generate a client automatically. No SDK to install. No vendor lock-in. Just HTTPS and JSON.

OpenAPI 3.1HMAC-signed webhooksScoped tokens

The one human step

Your Garmin watch starts LiveTrack, which emails DotDot. The only manual setup is adding [email protected] as a LiveTrack recipient in Garmin Connect — a one-time step. After that, every run is automatically tracked, broadcast, and available via the API.

Working on full automation. Community recipes for agent-driven setup coming soon.

Your next ultra, fully orchestrated.

Create an account. Generate a token. Let your agent handle the rest.