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.