Trust
Only what the code makes true: what leaves hvisker, how long a sign-in lasts, and what it stores.
- hvisker never sends outreach. It writes to nobody in a posting: a match leaves only when you copy it, or to the webhook endpoints you add in Settings.
- What leaves: sign-in mail to your own address, and signed webhook posts to your endpoints over HTTPS, to public addresses only.
- A webhook body carries the match whole: the offering, the positioning, the posting's address and text, the lines that answer it, when it reached you, its location stance, the channel it was built for, the pitch written for it and the person to send it to — their name, title and the one contact your channel reaches, withheld until you pay. An endpoint whose own address carries a contact it would receive is never sent that event.
- A sign-in link and its code work once, for 15 minutes, and are kept hashed. A sign-in lasts 30 days.
What hvisker stores
Read off the database's own tables as this page is drawn.
| Table | What it holds | Columns |
|---|---|---|
| accounts | your account: its email; hvisker's own demo account is marked system | id, email, system, last_active_at |
| sessions | sign-ins: which email holds each, until it expires | token, email, expires_on |
| login_links | sign-in links and codes, hashed, until they are used or expire | id, email, token, wait, code, expires_on, attempts, link_used_on, code_used_on, superseded |
| offerings | your offerings: each name and kind | id, account_id, position, name, kind |
| briefs | a service's brief: what is sold and for whom | offering_id, sold, for_whom |
| materials | a person's CV as uploaded text, and the jobs wanted | offering_id, cv_file_name, cv_text, wanted |
| whereabouts | where a person is based, whether they work in an office, remotely or either, and whether they would relocate | offering_id, country, mode, relocates |
| put_forward_as | whether each offering is put forward through an agency or as a contractor, and since when | offering_id, supplier, at |
| attestations | consent attestations: the sentence and the day | offering_id, sentence, attested_on, subject, actor |
| positionings | positioning statements, and whether each is live or paused | id, offering_id, position, statement, state, looked_on |
| written | the brief, variant and pitch written for each positioning | positioning_id, brief, variant, pitch |
| arrivals | matches: each posting's address, text and the lines that answer | id, positioning_id, statement, source, language, country, text, appeared_on, found_on, answers, lines, reached_on, delivered_on, free_company |
| people | the person to send each match to: name, title, and work email or LinkedIn URL | arrival_id, name, title, work_email, linkedin |
| phones | a phone number for the person to send a match to, and the provider it came from; shown only while phone numbers are on | arrival_id, phone, provider |
| companies | the company the signal names the person to send each match to as working at, when it names one, who lookups of its people found for each function and seniority its positioning's team rows name, and what the team block said of who it employs, quoted | arrival_id, name, canonical_key |
| phone_optins | whether you turned phone numbers on, and when | account_id, at |
| payments | whether you paid, and when; until then the account is on trial | account_id, at |
| charges | what your use cost, in cents, and when; it comes off your $5.00 of trial credit first, and only what exceeds it is billed | id, account_id, cents, at |
| works_as | whether you work as an agency and as a contractor, and since when | account_id, agency, contractor, at |
| channels | how you reach out: email, LinkedIn or phone, and since when | account_id, channel, at |
| built_for | the channel each match was built for: the one set when it was kept | arrival_id, channel |
| triage | what you did with each match: exported or rejected, and why | arrival_id, state, reason, at, prior_state, prior_reason, prior_at, undoable |
| chat | what you said on each match and hvisker's answer, with where a new positioning it made is listed | id, arrival_id, at, speaker, words, href |
| turned_down | what you turned a role down in chat for requiring, per person, so they are not matched to a role requiring it again | id, offering_id, what, arrival_id, at |
| rules | what you skip for each offering, one per kind of thing, taught by rejecting a role on Today, so later roles stating it are turned away; and the one it replaced, until undone | id, offering_id, dimension, value, arrival_id, at, prior_value, prior_arrival_id, prior_at, dealbreaker |
| refusals | matches turned away after they reached you, by what their offering skips, by where its person is based, by who their company employs, by what their company is, or as seen already, with the sentence that says so | arrival_id, offering_id, kind, key, sentence, rule, value, at |
| unlearned | the last thing you unlearned for each offering, when, and the matches it brought back, so the Undo of its toast can learn it again within a day | offering_id, kind, key, value, arrival_id, at, returned, unlearned_on |
| seen | the titles of roles you rejected as seen already, per offering, so a role titled the same is not shown again | id, offering_id, key, arrival_id, at |
| removals | postings refused for turning away what you work as, with the sentence that says so | id, account_id, source, found_on, sentence, recorded_on |
| sweeps | each search's log: postings offered, kept and refused | positioning_id, at, offered, kept, refused |
| failures | when a search's last sweep failed, and the error, until a later sweep of it goes through | positioning_id, at, reason |
| events | edits, pauses and resumes of positionings | id, positioning_id, at, kind, detail, subject, actor |
| endpoints | your webhook endpoints and their signing secrets | id, account_id, url, secret, enabled, created, disabled_on, disabled_by, failing_since |
| deliveries | every webhook attempt and export: body, headers, answer and timing | id, account_id, endpoint_id, event_id, event_type, payload, attempt, status, headers, code, response, took_ms, sent_on, next_on |
| asked_people | which companies' people were asked of datagate recently, and who it answered, so the same company is not asked again within the remembered window | company_id, asked_on, people, known |
| cooldowns | how many days an export to the same contact holds off a second one, and since when | account_id, days, at |
| asked_email | which LinkedIn URLs were asked of datagate for a verified work email recently, and what it answered, so the same one is not asked again within the remembered window | linkedin, asked_on, email |
| voices | whose voice your pitches speak in: your own or an agency's, and since when | account_id, voice, at |
| outcomes | what came of each match you sent: replied, a call booked, won or no answer | arrival_id, state, at |
| location_policies | how a role that does not suit where you work is scored: not a fit, or ranked low, and since when | account_id, policy, at |
| work_kinds | the kinds of work each positioning is ticked for: fractional, contract or permanent | positioning_id, kind |
| spend_shares | the share of your monthly price spend finding contacts may use before search pauses, and since when | account_id, pct, at |
| topups | a top-up of one month's price added to your spend cap, in cents, and when | id, account_id, cents, at |
| closures | a match you were waiting on whose posting closed, when, and the line saying why | arrival_id, at, reason |
| uncapped | whether the monthly allowance and spend cap are lifted off your account for a daily limit, for hvisker's own people, and since when | account_id, at |
| api_keys | your API keys for the REST API and the MCP server: a label and when each was made or revoked | id, account_id, token, label, created, revoked_on |
| asked_ai | which companies Claude was asked about recently for a positioning's company facts, from their postings, and what it answered with the posting's words that show it, so the same company and question are not asked again within the remembered window | company_id, question, asked_on, says, quote, source, why |
| team_rows | who a company must or mustn't already employ for each positioning, row by row: a function, its leaders or staff, absent, present or how many, whether it filters or only scores, and why, in your words | positioning_id, position, function, seniority, op, n, strength, why |
| team_words | who a company must or mustn't already employ, in the words you saved before rows, until you compile them into rows | positioning_id, sentence |
| fact_rows | what each positioning asks of a company: its headcount, industry, stack, what it builds or your own question, whether it must, is preferred or only sorts, and what happens when unknown | positioning_id, position, subject, value, strength, on_missing |
| fact_verdicts | how each match's company came out against its positioning's company facts when it was kept, with the fact and where it came from | arrival_id, verdicts |
| screening_reports | every screening report a simulation ran and kept for a match's role: the job ad, CV or service description and pitch it read, the report, and when it ran | id, account_id, arrival_id, job_ad, resume, pitch, checks, recruiter_notes, fixes, created_on |
| simulations | when you ran an application simulation on a match, counted against your month's cap | id, account_id, at |
| resolved_companies | which companies were looked up with bossroster recently and the key it resolved them to, so the same company is not resolved again within the remembered window | company_id, resolved_on, canonical_key, size_band |
| asked_bossroster | which companies were asked of bossroster recently for one of your team rows' presets, and what it answered, so the same company and preset are not asked again within the remembered window | company_id, preset, asked_on, met, rule_id, reason |
| company_team | a company resolved to its bossroster identity (hvisker-172): the identity itself, and the signed team-facts digest kept against it, shared by every match at that company instead of looked up again for each one | canonical_key, aliases, team_digest, as_of, verdicts |