Quickstart
POST your first actor and read the briefing.
This guide walks you through making your first request to the Qualia API: creating an actor and fetching the briefing once enrichment completes.
1. Get an API key
Create a key in Settings → API Keys. Copy the plaintext. It is shown once.
export QUALIA_API_KEY="qk_live_..."To persist across shells, append the line above to ~/.zshrc or ~/.bashrc.
2. Create an actor
// app/qualia.ts
import { Qualia } from "@qualiaso/sdk";
const qualia = new Qualia({
auth: () => process.env.QUALIA_API_KEY!,
});
const { data, error } = await qualia.createActor({
body: {
email: "anna@ridgeline.co",
name: "Anna Park",
source: "product_signup",
},
});
if (error) throw error;
const { actorId, status } = data;The response is { actorId, status }. status is "created" for a new actor (enrichment is enqueued) or "already_exists" if an actor with this email already exists in your organization.
3. Read the briefing
Enrichment runs asynchronously. Poll the actor until status is "enriched" (success) or "failed" (terminal failure).
// app/qualia.ts
const { data: actor, error } = await qualia.getActor({
path: { actorId },
});
if (error) throw error;
console.log(actor.status, actor.summary, actor.score);Once status is "enriched", the contact-card fields (summary, highlights, bio, companyDescription, title, linkedinUrl, companyName, ...) and the ICP fit score are populated.
4. When status is "failed"
If an actor lands as failed, the response carries a failureReason describing which gate stopped enrichment:
failureReason | Meaning | What to do |
|---|---|---|
quota_exceeded | Your org hit its monthly cap. | Raise the cap in Settings or wait it out. |
invalid_email | Address failed format validation. | Ask the user to retype. |
disposable_email | Disposable / throwaway / parked provider. Won't reach a real person. | Skip this signup. |
suspicious_email | Local-part or signup pattern looks bot-generated. | Skip, or flag for review. |
insufficient_context | Personal-email signup with no name and no recognized metadata key. | Re-call createActor with the same email plus name (or metadata.company, metadata.title, metadata.linkedinUrl, metadata.workEmail). The actor auto-rescues and re-enqueues. |
const { data: actor } = await qualia.getActor({ path: { actorId } });
if (actor.status === "failed" && actor.failureReason === "insufficient_context") {
// Re-call with the missing context - same email, plus a name or company hint.
// The actor transitions back to "pending" and enrichment is re-queued.
await qualia.createActor({
body: { email: actor.email, name: "Anna Park", metadata: { company: "Ridgeline" } },
});
}The auto-rescue applies to every eligibility-related failure reason. It does NOT apply to quota_exceeded: the cap is org-level and retrying won't help.
See SDK quickstart for the full table with a worked example.
Next
- Concepts. The shape of an
actorand abriefing. - API reference. Every operation page with request and response schemas.