Quickstart
First call, in about ten minutes.
Four steps. The first call against a free listing costs nothing, so you can get the shape working before anything is billable.
01 · Get a key
One key covers every listing you have access to. There is no per-listing credential to manage.
Keys are created in your account settings. Create a separate one per environment — the usage dashboard breaks spend down by key, which is the only way to tell staging traffic from production traffic once both are live.
export VIBESTREET_KEY="vs_live_…" # from /settings/api-keysNeeds attention
The key is shown once
02 · Find a listing
You need its slug, which is the last part of its URL.
Browse to the listing you want and take the slug from the URL. You can also search the catalogue from the API if you are building discovery into your own product.
curl "https://api.vibestreet.io/api/search?q=triage" \
-H "Authorization: Bearer $VIBESTREET_KEY"Each result carries the listing's tier, its creator's trust level and its data-flow declaration, so an agent choosing between listings can apply your policy itself rather than asking a person.
03 · Make the call
Through the relay, with your key. The creator's endpoint is never addressed directly.
import { Vibestreet } from "@vibestreet/sdk";
const vs = new Vibestreet({ apiKey: process.env.VIBESTREET_KEY });
const result = await vs.call("hepatic-referral-triage", {
referral_text: letter,
patient_age: 54,
lfts: { alt: 180, ast: 96, alp: 210, bilirubin: 32 },
});curl -X POST https://relay.vibestreet.io/hepatic-referral-triage \
-H "Authorization: Bearer $VIBESTREET_KEY" \
-H "Content-Type: application/json" \
-d '{ "referral_text": "…", "patient_age": 54 }'04 · Handle the answer
The branch most integrations forget.
A response is not always a verdict. Listings built by professionals decline when the inputs cannot support a call, and treating that as an error is how an integration ends up retrying its way into a wrong answer.
if (result.confidence < 0.4) {
// The listing has declined. `would_change_if` lists the inputs
// that would make it answerable — surface those, do not retry.
return { escalate: true, missing: result.would_change_if };
}
return { priority: result.priority, because: result.rationale };Errors follow the same shape everywhere: a status code, a stable code, and a sentence you can show a person. They are listed in full in the reference.