feat(catalog): add Scrubby email verification - #533
Merged
Merged
Conversation
shehjad-dev
force-pushed
the
codex/provider-scrubby
branch
from
September 16, 2026 20:13
59eaa0a to
9aac53b
Compare
shehjad-dev
force-pushed
the
codex/provider-scrubby
branch
from
September 16, 2026 20:53
9aac53b to
418be58
Compare
shehjad-dev
marked this pull request as ready for review
September 16, 2026 21:12
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds Scrubby (
scrubby) as a pasted-key email-verification provider: all five documented endpoints, with single-email verification on BYOK and treg's platform key and the four asynchronous bulk/deep tools on BYOK only.Why now: Scrubby adds both immediate verification and a 72-hour deep-verification workflow. Its responses report exact
credits_used, including zero for cached retries, so treg can settle the shared single-email tool from provider evidence instead of assuming every successful response costs one credit.Listing owner / contact: treg team (platform key held in private deployment configuration); vendor behavior was clarified directly with Scrubby support. No credential is included in this PR.
What's in the diff
catalog/scrubby.yaml— the complete five-POST OpenAPI surface with captured, sanitized examples: single verification; quick-bulk submit/fetch; deep submit/fetch.oauth_providers.py/config.py— pastedx-api-keyconnection, exact free miss probe, andTREG_PLATFORM_KEY_SCRUBBYplatform-key slot. A fixed descriptive User-Agent intentionally overwrites the caller value on probes and BYOK/platform calls because Scrubby's edge rejected Python's default urllib profile before it reached the API.application/call/settle.py— provider-specific settlement from top-levelcredits_used, following the established Sumble/QuickEnrich pattern. Only non-negative integers are accepted; zero remains a free cached response.catalog/adapters.yaml— mapsscrubby.people.email.verifyinto the existingpeople.email.verifyroute. That one tool participates in automated routing and Enrich Arena; all Scrubby verdicts are answers rather than routing misses.domain/capacity/policy.py/domain/capacity/collectors.py/catalog/fx.yaml— documented 25 requests/second pacing, manual credit capacity, explicitNO_BALANCE_APIclassification, and the supplied $50 / 6,250-credit acquisition rate ($0.008/credit).logos/scrubby.svg— the exact supplied Scrubby artwork (SHA-2568e7874baf3cd70ad485528f1df7ce04d7c30274d729a61d9e2efb201dfa1e9e2).tests/test_scrubby.pyplus shared registry/capacity assertions; Scrubby context fragment and generated context/plugin mirrors.Verification evidence ledger (2026-09-16)
Meter for charged rows: top-level
credits_usedin Scrubby's response, multiplied by the frozen $0.008/credit acquisition rate. Fetch tools are priced free because Scrubby charges at submission and their responses expose no charge field.scrubby.people.email.verify·/validate_emailpeople.email.verify; Enrich Arenascrubby.people.email.verify.bulk·/validate_bulk_emailsscrubby.people.email.verify.bulk.results·/fetch_bulk_resultsscrubby.people.email.verify.deep·/validate_bulk_emails/deep/scrubby.people.email.verify.deep.results·/fetch_bulk_results/deepQuick bulk returned an identifier and a 30-second retry interval. Deep polling returned a live 259,200-second retry interval. No pagination is documented.
Bogus-key probe (live, local treg on this branch): no credential and a bogus credential returned structured upstream 401 responses.
POST /connections/tokenwith the bogus key returned treg HTTP 422. A real key returned HTTP 200. Both upstream-supported auth forms (x-api-keyandAuthorization: Api-Key …) worked; treg uses the documentedx-api-keyform.The free connection probe posts a fixed nonexistent identifier to
/fetch_bulk_results. A valid key returns HTTP 404 with exact detailNo results found for this identifier.; 401/403 remain rejection statuses. The probe consumed no credit.Platform settlement and BYOK precedence: the call-path test reserves one credit and settles
credits_used: 1tox-treg-cost-micro: 8000; malformed, negative, Boolean, fractional, and missing evidence retain the reserved estimate for reconciliation. A live cached platform call returned 200 withcredits_used: 0and settled at zero. A live BYOK call returned 200 with no treg cost header or balance change, confirming that a team's own key wins and is unmetered.Timeout and retry evidence
credits_used: 1, indicating that particular timed-out attempt had not consumed a Scrubby credit; a later retry was cached withcredits_used: 0.Capacity and routing decisions
NO_BALANCE_APIreports that deliberate limitation instead ofno fetcher written yet.remaining_creditsappears only on verification responses, and treg does not spend a verification merely to collect capacity. There is no collector or overflow route.scrubby.people.email.verifyis platform-enabled, routed, and included in Enrich Arena.Validation after rebasing current main
uv run --with pytest-xdist pytest -n auto -q→ 4,268 passed, 8 skipped.catalog_validate.py→ 107 provider files, 3,399 endpoints, 0 errors, 0 warnings.build_plugin.py --check→ all five generated mirrors match.git diff --check origin/main...HEADpasses.mainat90edbf9e.Ops
TREG_PLATFORM_KEY_SCRUBBYin the private deployment and addscrubbytoTREG_PLATFORM_PROVIDERS, then run a production smoke check before treating platform capacity as available.Sources