How search ordering works

Placement here is never sold. The ranking is a published, deterministic calculation — anyone can reproduce a day's ordering from the inputs and the daily rotation seed. Spec version 1.0.0 · machine-readable: /api/ranking-version.

First, the gates (not scores)

Before any scoring: you only see providers who are legally allowed to see you (license, PSYPACT, Counseling Compact, or state registration — the chip on each card) and whose availability was confirmed within 14 days. Full, paused, or stale profiles aren't ranked lower — they're not shown at all, unless you flip the “include unavailable” toggle.

Then, three weighted scores

45% — match completenessHow many of the filters you asked for this provider satisfies. Ask for nothing, everyone scores full marks.
35% — integrityFreshness of their availability confirmation (within 3 days scores 1; within 14 days scores 0.7) averaged with how fast they answer messages (within 4 hours scores 1; new providers score 0.5 — never punished below the midpoint). Waitlisted providers score 80% of their open-equivalent.
20% — distanceIn-person: full score within 2 miles, fading to zero at 60. Telehealth results all score 0.75 — distance doesn't matter on video.

Ties rotate fairly

Scores are rounded so near-equal providers tie, and ties are ordered by a deterministic daily rotation (a hash of the date, market, and provider id — the seed is public). Everyone equally good gets equal time at the top. There is no input through which payment could influence any of this.

The implementation lives in the open-source @pt/ranking package; releases are tagged so you can verify the deployed version matches the public code.