Back to API

Documentation

The machine-readable inbox. Any person, AI agent, or automation can discover your endpoints and send structured messages — no API key required.

Getting started

Create your programmable inbox

Sign up to get your own namespace, endpoints, and API token.

Sign up free

Already have an account?

Log in to access your dashboard, or use your API token with Authorization: Bearer <token>.

Base URL

https://hmuapi.com/api

Also accessible via https://hitmyapi.com

Multi-tenant URL structure

Every user on HMU API gets their own namespaced routes under /api/u/<username>.

GET /api/u/<username> Public profile — name, bio, avatar, links
GET /api/u/<username>/endpoints Available endpoints for this user
GET /api/u/<username>/status Availability, response time, open/closed status
POST /api/u/<username>/<endpoint> Submit to any of this user's endpoints (pitch, ask, meet, etc.)
POST /api/u/<username>/score Live pitch scoring — Counter-API, returns score + feedback
GET /api/status/<token> Track message delivery status by token

Identity endpoints

Public profile data is available without authentication.

GET /api/u/<username>

Returns the user's public profile as JSON.

{
  "username": "janedoe",
  "name": "Jane Doe",
  "bio": "Founder & investor",
  "endpoints": ["pitch", "ask", "meet"],
  "status": "open"
}

Counter-API — pitch scoring

The scoring endpoint evaluates a message payload in real time and returns a numeric score with structured feedback. No submission is created — this is a dry-run evaluation only.

POST /api/u/<username>/score

Send a JSON body with endpoint_slug, payload, and session_id. Returns score (0–100) and per-dimension feedback.

{
  "score": 82,
  "label": "Strong",
  "dimensions": {
    "clarity": 90,
    "relevance": 75,
    "urgency": 80
  },
  "feedback": "Strong one-liner. Add deal size to improve relevance."
}
GET /api/status/<token>

Track the delivery status of a previously submitted message using the message_id returned at submission time.

{
  "message_id": "uuid-here",
  "status": "delivered",
  "read": false,
  "submitted_at": "2026-03-12T10:00:00Z"
}

Auth model

PUBLIC

Inbound submission endpoints

No API key required. Anyone can submit to a user's endpoints — just send valid JSON.

SESSION

Web dashboard

Log in at /login to get a cookie session. HttpOnly, Secure, 7-day expiry.

BEARER

Programmatic access

Use your API token for scripts and integrations. Pass as Authorization: Bearer <token>. Token issued on email verification.

READ-ONLY

Public profile & scoring endpoints

Profile, status, endpoints list, and Counter-API scoring are unauthenticated GET endpoints.

VERIFIED

Sender email verification

First-time senders verify their email before messages are delivered. Verified and trusted senders skip this step.

Legacy aliases

The original short-form routes still work and are permanently routed to jamestannahill. Existing integrations do not need to update.

POST /api/pitch /api/u/jamestannahill/pitch
POST /api/ask /api/u/jamestannahill/ask
POST /api/meet /api/u/jamestannahill/meet
POST /api/hire /api/u/jamestannahill/hire
POST /api/intro /api/u/jamestannahill/intro
POST /api/collab /api/u/jamestannahill/collab
POST /api/advise /api/u/jamestannahill/advise
POST /api/press /api/u/jamestannahill/press
GET /api/status /api/u/jamestannahill/status

Quick start

cURL

curl -X POST https://hmuapi.com/api/u/jamestannahill/ask \
  -H "Content-Type: application/json" \
  -d '{"name":"Jane","email":"jane@example.com","question":"What are you building?"}'

JavaScript / Node.js

const res = await fetch("https://hmuapi.com/api/u/jamestannahill/ask", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    name: "Jane",
    email: "jane@example.com",
    question: "What are you building?"
  })
});

const data = await res.json();

Python

import requests

res = requests.post("https://hmuapi.com/api/u/jamestannahill/ask", json={
    "name": "Jane",
    "email": "jane@example.com",
    "question": "What are you building?"
})

print(res.json())

Response format

{
  "success": true,
  "message_id": "uuid-here",
  "auto_response": "Thanks for reaching out..."
}

Endpoints

All POST endpoints require Content-Type: application/json. Rate limit: 10 per sender per endpoint per 30 days.

GET endpoints (per user)

GET /api/u/:username Public profile — name, bio, active endpoints
GET /api/u/:username/endpoints Endpoint list with field schemas
GET /api/u/:username/status Availability and response time
GET /api/status/:token Message delivery status tracking

Error codes

202 Message accepted but pending sender email verification
400 Validation failed — includes field-level errors
403 Sender is blocked
401 Missing or invalid authentication (session or Bearer token)
404 Unknown username or endpoint
429 Rate limit exceeded — includes retry_after_seconds

Agent discovery flow

Any LLM, agent framework, or automation that makes HTTP requests can integrate. No API key, OAuth, or SDK needed.

  1. 1
    GET /api/u/:username

    Discover who this person is, what they care about

  2. 2
    GET /api/u/:username/endpoints

    Read available endpoints, schemas, required fields

  3. 3
    POST /api/u/:username/:endpoint

    Submit a structured message with the right fields

  4. 4
    GET /api/status/:token

    Track if the message was received, viewed, or replied to

Email is human-to-human. HMU API is anything-to-human.

Integration ideas

Contact form

Replace mailto with a POST to /api/ask

Slack bot

Slash command that POSTs to any endpoint

Zapier / Make

HTTP webhook module for automations

AI agents

LLMs discover via llms.txt and call with tool use

iOS Shortcuts

"Get Contents of URL" action with JSON body

CRM webhook

Auto-submit from HubSpot, Salesforce, Pipedrive

Webhooks

Get notified in real time when messages arrive. Webhooks fire on message.created events and can be filtered by endpoint.

Supported formats

JSON Full payload with HMAC-SHA256 signature in X-HMU-Signature header
Slack Formatted Block Kit message for Slack incoming webhooks
Discord Rich embed for Discord channel webhooks
POST /api/dashboard/webhooks

Create a webhook. Returns a signing secret (shown once).

{
  "url": "https://hooks.slack.com/services/...",
  "format": "slack",
  "events": ["message.created"],
  "endpoint_filter": "pitch"
}

Verifying signatures (JSON format)

const crypto = require("crypto");
const expected = crypto
  .createHmac("sha256", WEBHOOK_SECRET)
  .update(rawBody)
  .digest("hex");

if (expected !== req.headers["x-hmu-signature"])
  return res.status(401).send("Invalid");

Dashboard API

Authenticated endpoints for managing your inbox. Requires Authorization: Bearer <token> or an active session cookie.

GET
/api/dashboard/messages List messages (filter by endpoint, status, starred)
GET
/api/dashboard/analytics?range=30 Message volume, endpoint breakdown, top senders, response times
GET
/api/dashboard/stats Summary counts by endpoint and status
GET
/api/dashboard/profile Your profile settings
PATCH
/api/dashboard/profile Update profile, digest frequency, timezone
GET
/api/dashboard/endpoints Your endpoint configurations
PUT
/api/dashboard/endpoints/:slug Update endpoint (auto-reply, enabled, subject)
GET
/api/dashboard/webhooks List your webhooks
POST
/api/dashboard/webhooks Create webhook (returns signing secret)
DELETE
/api/dashboard/webhooks/:id Delete a webhook
POST
/api/dashboard/webhooks/:id/test Send a test event

Auto-replies

Every endpoint sends an automatic confirmation email to the sender. Customize per endpoint in Settings.

Template variables

{{sender_name}} Sender's name
{{endpoint}} Endpoint slug
{{display_name}} Your display name
{{score}} Priority score

Controls

Toggle auto-replies on/off per endpoint. Set a custom subject line and message body. Leave blank to use the default.

Email digest

Get a summary of new messages delivered to your email on a schedule. Configure in Settings.

Off

No digest emails

Daily

Once per day

Weekly

Once per week

Includes: message table sorted by priority, stats summary (total/unread/replied), and a link to your dashboard.

Machine-readable docs