Skip to main content
Arcmira is an SF-based AI company and the search engine for the spoken web. The API indexes long-form video and podcasts on YouTube, extracts who and what is discussed (with sentiment and timestamps), and exposes it as three capabilities:

Search

One-shot answers from the index: pull entity mentions, appearances, and commercial evidence.

Monitors

Standing interests that fire again as new media lands. Alerts delivered to email, Slack, and webhooks.

Transcripts

Fully analyzed transcripts: read, generate on demand, and submit corrections.
Use Search for one-shot answers. Use Monitors when that interest should fire again as new media lands. Use Transcripts when you have a video and need the fully analyzed text. Use Community Review whenever any result looks wrong.
Using a coding agent? Each capability has a self-contained reference built for agents: Search, Monitors, Transcripts. Copy the one you need into your agent and it has everything: endpoints, schemas, errors, and known mistakes.
The API is HTTP/JSON at https://api.arcmira.com, versioned under /v1. API calls draw from the same monthly row pool as web usage on your plan; there is no separate API tier. There is no SDK yet: the examples below use plain fetch and httpx, and everything works from any HTTP client.

1. Create a key

Sign in at arcmira.com, open Dashboard → API Keys, and click Create key. You will see the key exactly once. It looks like:
arc_sk_a1b2c3d4e5f6...
Store it in your secrets manager and export it as ARCMIRA_API_KEY. Treat it like a password: never ship it in browser code.
Need write access for monitors or trackers? Tick Manage monitors or Manage trackers when creating the key. All keys include read. On Pro+ plans, recommendations:read unlocks Commercial intelligence. See Authentication & scopes.

2. Search for an entity

const res = await fetch(
  'https://api.arcmira.com/v1/search?q=lex%20fridman',
  { headers: { Authorization: `Bearer ${process.env.ARCMIRA_API_KEY}` } },
);
const json = await res.json();
console.log(res.headers.get('X-Request-Id'), json);
import os, httpx

r = httpx.get(
    'https://api.arcmira.com/v1/search',
    params={'q': 'lex fridman'},
    headers={'Authorization': f"Bearer {os.environ['ARCMIRA_API_KEY']}"},
)
r.raise_for_status()
print(r.headers['X-Request-Id'], r.json())
curl 'https://api.arcmira.com/v1/search?q=lex%20fridman' \
  -H "Authorization: Bearer $ARCMIRA_API_KEY"
The response resolves your text to the single best entity match ({ found: true, ... }), with type, route, and basic stats. For ranked lists use /v1/entities/search. Note the X-Request-Id header: include it whenever you contact support.

3. Resolve to a canonical ID

Search is a discovery tool. Production integrations pin a canonical ent_<id> and cache it:
const res = await fetch(
  'https://api.arcmira.com/v1/entities/lookup?name=OpenAI&type=organization',
  { headers: { Authorization: `Bearer ${process.env.ARCMIRA_API_KEY}` } },
);
const { entity } = await res.json();
// entity.id -> "ent_123881"; entity.merged_from_id set when you hit an alias
import os, httpx

r = httpx.get(
    'https://api.arcmira.com/v1/entities/lookup',
    params={'name': 'OpenAI', 'type': 'organization'},
    headers={'Authorization': f"Bearer {os.environ['ARCMIRA_API_KEY']}"},
)
entity = r.json()['entity']  # entity['id'] -> "ent_123881"
curl 'https://api.arcmira.com/v1/entities/lookup?name=OpenAI&type=organization' \
  -H "Authorization: Bearer $ARCMIRA_API_KEY"
Lookup follows merge chains: old IDs keep resolving, and merged_from_id tells you when they did.

4. Pull evidence

Mentions are the evidence layer. Each row links one entity to one piece of media with timestamps, sentiment, and a context quote:
const res = await fetch(
  'https://api.arcmira.com/v1/mentions?entity_id=ent_123881&sentiment=positive&limit=25',
  { headers: { Authorization: `Bearer ${process.env.ARCMIRA_API_KEY}` } },
);
const { data, has_more, next_cursor } = await res.json();
import os, httpx

r = httpx.get(
    'https://api.arcmira.com/v1/mentions',
    params={'entity_id': 'ent_123881', 'sentiment': 'positive', 'limit': 25},
    headers={'Authorization': f"Bearer {os.environ['ARCMIRA_API_KEY']}"},
)
body = r.json()  # body['data'], body['has_more'], body['next_cursor']
curl 'https://api.arcmira.com/v1/mentions?entity_id=ent_123881&sentiment=positive&limit=25' \
  -H "Authorization: Bearer $ARCMIRA_API_KEY"

5. Keep tracking it

When a one-time lookup should become an ongoing interest, create a tracker (requires trackers:write):
const res = await fetch('https://api.arcmira.com/v1/trackers', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.ARCMIRA_API_KEY}`,
    'Idempotency-Key': crypto.randomUUID(),
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ entityName: 'OpenAI', entityType: 'organization' }),
});
import os, uuid, httpx

r = httpx.post(
    'https://api.arcmira.com/v1/trackers',
    json={'entityName': 'OpenAI', 'entityType': 'organization'},
    headers={
        'Authorization': f"Bearer {os.environ['ARCMIRA_API_KEY']}",
        'Idempotency-Key': str(uuid.uuid4()),
    },
)
curl -X POST 'https://api.arcmira.com/v1/trackers' \
  -H "Authorization: Bearer $ARCMIRA_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{ "entityName": "OpenAI", "entityType": "organization" }'
From here, Monitors group trackers and deliver alerts to email, Slack, or an HMAC-signed webhook.

Next