Quickstart

Get your first evidence-backed Marrow result in under five minutes.

Setup

Marrow accounts are provisioned through one-time invites. Ask your Marrow operator for an invite token, then redeem it:

export MARROW_API_BASE_URL=https://marrow.example.com

curl -X POST "$MARROW_API_BASE_URL/v1/account/invites/redeem" \
  -H "Content-Type: application/json" \
  -d '{
    "inviteToken": "<invite token from your operator>",
    "apiKeyName": "Quickstart CLI"
  }'

The response returns your account id and a raw API key. The raw key is shown once, so save it immediately:

export MARROW_API_KEY=<raw API key from response>

Customer requests authenticate with the API key as a Bearer token. Every authenticated response carries x-ratelimit-limit, x-ratelimit-remaining, and x-ratelimit-reset headers.

Ingest your first source

Live ingest requires an explicit distill flag plus a datedAt value for when the source material was authored or published:

curl -X POST "$MARROW_API_BASE_URL/v1/ingest/url" \
  -H "Authorization: Bearer $MARROW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/my-bio",
    "dryRun": false,
    "distill": true,
    "datedAt": "2026-05-12"
  }'

This returns a queued ingest job:

{
  "schemaVersion": "marrow-ingest-job-v1",
  "mode": "queued",
  "created": true,
  "job": {
    "id": "5d2a…",
    "status": "queued",
    "kind": "url"
  }
}

Poll the job until it reaches a terminal status (succeeded, failed, or quarantined):

curl "$MARROW_API_BASE_URL/v1/ingest/jobs/<job id>" \
  -H "Authorization: Bearer $MARROW_API_KEY"

Ask a question

Once the job has succeeded, run an evidence-backed query. Marrow embeds the question with Voyage, ranks records by vector distance, and joins the source notes each record was extracted from:

import os, requests

base = os.environ["MARROW_API_BASE_URL"]
key = os.environ["MARROW_API_KEY"]

r = requests.post(
    f"{base}/v1/query",
    headers={"Authorization": f"Bearer {key}"},
    json={
        "query": "What evidence supports their cross-functional delivery work?",
        "limit": 5,
        "evidenceLimit": 3,
    },
)
print(r.json())

You get ranked typed records plus the evidence notes behind each one:

{
  "schemaVersion": "marrow-evidence-query-v1",
  "mode": "topical",
  "results": [
    {
      "rank": 1,
      "nodeType": "claim",
      "title": "Led cross-functional delivery of the Northstar onboarding rollout.",
      "snippet": "Avery drove the rollout of the onboarding flow …",
      "confidenceScore": 0.92,
      "sourceRunId": "f1a3…",
      "facets": ["cross-functional-delivery", "onboarding-rollout"],
      "evidenceNotes": [
        { "id": "9b2c…", "excerpt": "Working at Northstar, I integrated the …", "relationship": "extracted-from" }
      ]
    }
  ]
}

Read the voice

For style-aware writing tasks, ask for the style profile. It returns observations, preferences, vocabulary rules, and the evidence notes those rules were learned from:

const res = await fetch(`${process.env.MARROW_API_BASE_URL}/v1/style/profile`, {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.MARROW_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ scope: "technical-writing", limit: 8 }),
});
console.log(await res.json());
{
  "schemaVersion": "marrow-style-profile-v1",
  "observations": [ { "pattern": "Prefers concrete nouns over abstractions.", "evidenceNoteIds": ["…"] } ],
  "preferences":  [ { "preference": "Frame the Northstar work as cross-functional delivery, not just a product launch.", "evidenceNoteIds": ["…"] } ],
  "vocabularyRules": [ { "term": "Northstar", "rule": "Capitalize as a proper noun.", "evidenceNoteIds": ["…"] } ],
  "evidenceNotes": [ { "id": "9b2c…", "snippet": "…", "styleDescription": "Technical, declarative …" } ]
}

That is the loop: source in, evidence-backed records and voice out. No prompt stuffing. No black-box memory. Verified, cited, deterministic.

See the API Reference for full request and response schemas, scopes, and rate-limit semantics. See the Marrow CLI for the same loop driven from your terminal.