qualiaDocs

Concepts

Actors

What you send when you create an actor, how Qualia handles repeat emails, and what each status means.

An actor is one person you send to Qualia, identified by email. You create actors with POST /v1/actors and read them with GET /v1/actors/{actorId}. This page covers the fields you send, how repeat emails behave, and the statuses an actor moves through.

What you send

{
  "email": "anna@ridgeline.co",
  "name": "Anna Park",
  "source": "signup_form",
  "metadata": {
    "company": "Ridgeline",
    "plan": "free",
    "utmSource": "newsletter"
  }
}
FieldTypeRequiredRules
emailstringYesA valid email address, up to 320 characters. Qualia stores it in lowercase.
namestringNoThe person's name, up to 255 characters. An empty or blank string counts as no name.
sourcestringNoA label for where the signup came from, up to 50 characters. Defaults to api.
metadataobjectNoAny JSON object with extra context about the person.

source

Use source to tell your signup paths apart, for example signup_form, google_oauth, or team_invite. You can filter by source in the dashboard and in Slack delivery. Qualia keeps the source from the first request for an email and never changes it.

metadata

Send any context you already have: company, job title, plan, UTM parameters, or onboarding answers. Qualia stores it and uses it as extra context during research.

Some keys also tell Qualia who the person is. They matter most for signups from personal email addresses, such as Gmail or Proton addresses:

KindKeys Qualia recognizes
Companycompany, companyName, employer, employerName, organization, organizationName, org, orgName, workplace, firm
Job titletitle, jobTitle, role, position, jobRole
LinkedInlinkedin, linkedinUrl, linkedinProfile
Work emailworkEmail, businessEmail, companyEmail (only counts if the address is on a company domain)

Key matching ignores case and punctuation, so companyName, company_name, and Company-Name all work. Values must be non-empty strings.

A signup from a personal email address with no name and none of these keys is rejected with insufficient_context, because there is nothing to research. See Handle rejected signups.

One actor per email

Each email maps to one actor in your organization. POST /v1/actors is safe to retry:

RequestResponse
First request for an email201 Created with "status": "created" and a new actorId.
Any later request for the same email200 OK with "status": "already_exists" and the original actorId.

A repeat request does not research the person again and uses no credit. Qualia also ignores the name, source, and metadata it contains.

The one exception is a rejected actor. If the actor was rejected for any reason other than quota_exceeded, and the new request passes Qualia's signup checks, Qualia saves any new name and metadata and starts research again. This is how you fix a signup that was missing context. See Handle rejected signups.

Emails match without regard to case: Anna@Ridgeline.co and anna@ridgeline.co are the same actor.

Lifecycle

An actor's status tells you where it is:

StatusMeaningFinal?
pendingQualia accepted the signup. Research has not started yet.No
enrichingQualia is researching the person and company.No
enrichedThe briefing is ready. The research fields and score are set.Yes
rejectedQualia declined the signup and did no research. rejectionReason says why.Yes, unless you fix and resend it
failedThe research run hit an error. failureReason says why.Yes, after Qualia's automatic retries

The usual path is pending, then enriching, then enriched.

Some signups take a different path:

  • Rejected at creation. Qualia checks every signup when you send it. A signup that fails the check is rejected from the start. The create request still returns 201 Created, so read the actor to see the status.
  • Rejected during research. Some checks run after the signup is accepted. The status can move from enriching to rejected. This also happens when your credits run out before research starts.
  • Failed, then retried. After an error, Qualia retries the run up to two more times, about a minute apart. The status can move from failed back to enriching.
  • Rejected, then fixed. When a later request for the same email passes the signup checks, for example by adding a missing name, a rejected actor moves back to pending. This never happens for quota_exceeded.

For polling code that handles each case, see Get briefing results.

Coming later

Today an actor is created from a signup. Sending product events and CRM records for the same actor is planned and not yet available.

Next steps