Verify HubSpot Contacts and Tag Bad Emails With an sv_status Property
To verify HubSpot contacts and tag bad emails, connect a HubSpot service key on SimpleVerifier's Integrations page (/connect), pick a list or segment and press Verify leads. Each checked contact gets an sv_status contact property set to valid, risky or invalid. You can then filter, report and suppress on that property inside HubSpot. Archiving invalid contacts is available but off by default.
Updated 3 Nov 2026: HubSpot stopped the creation of new legacy private apps on 26 Oct 2026 for existing accounts, and on 28 Sep 2026 for accounts created after that date. Private apps you already have "continue to work as-is", so an existing token still connects. For a new connection, HubSpot recommends a service key, and the steps below now use one.
Step 1: create a HubSpot service key
In HubSpot, open Development, then Keys > Service keys, and click Create service key. Name it, click Add new scope, pick the scopes below, click Update, then Create. HubSpot's service key guide says super admins and users with the Developer tools access permission can create one, and a key can only get scopes the person creating it already has. The key is sent as a Bearer token, the same way a private app token was. Give it only the scopes you need:
| You want to | Scopes |
|---|---|
| Read lists, segments and contacts | crm.lists.read, crm.objects.contacts.read |
Create and set the sv_status property |
crm.objects.contacts.write, crm.schemas.contacts.read, crm.schemas.contacts.write |
| Archive invalid contacts | crm.objects.contacts.write |
If you use automatic rotation, paste the new key on Integrations before the old one expires. HubSpot's rotate-later option keeps the old key working for 7 days. HubSpot's lists API guide explains lists and segments.
Step 2: connect and pick a list or segment
Paste the key on Integrations and pick a list or segment. The confirm screen shows how many checks the run uses before it starts: one per distinct address, from free checks or your plan. Every HubSpot endpoint used is listed on the HubSpot integration page.
Step 3: the sv_status property
The default write-back is Set the sv_status contact property. If the property does not exist yet, ticking it lets us create it as a single-line text property. Nothing is archived or removed.
| sv_status | Meaning | What to do in HubSpot |
|---|---|---|
| valid | The mail server confirmed the mailbox | Keep sending |
| risky | The domain takes mail but the mailbox could not be confirmed (catch-all, role address, a server that would not confirm) | Send in a small tested batch, or hold back from cold sequences |
| invalid | The address will bounce | Suppress from sequences and marketing emails |
Risky is never upgraded to valid. A catch-all domain accepts every address, so no check can confirm a single mailbox there. Our catch-all scoring page shows how those rows are ranked.
Step 4: use sv_status in HubSpot
Once the property exists, HubSpot's own tools do the rest:
- A saved view. Filter contacts where
sv_statusisinvalidto see what would bounce. - An active list. Build a list of
sv_statusisinvalidand use it as an exclusion list on marketing emails. - Before sequences. Filter out invalid and decide on risky before enrolling. Our guide on verifying new HubSpot contacts with a workflow covers the automation side.
Optional: archive invalid contacts
Archive invalid contacts is off until you tick it, and the confirm screen asks again. HubSpot moves archived contacts to its recycle bin, where they can be restored for 90 days. They leave every list, not only the one you picked. If you are unsure, tag first, look at the invalid list, then archive.
Speed
HubSpot's service key guide says keys get the same limits as privately distributed apps, which its usage guidelines set at 100 API calls per 10 seconds on Free and Starter and 190 on Professional and Enterprise. The integration paces at about 90 and writes in batches of 100 contacts, so pulling and tagging a 10,000-contact list takes a few minutes on top of the checks.
Run 100 free checks on a small HubSpot list first to see how sv_status lands on your contacts.
Related
For the manual route through exports, see cleaning bounced and invalid contacts in HubSpot. On paid plans, Auto-verify new leads daily checks only contacts it has not seen in the list, once a day; see pricing.
Common questions
How do I verify HubSpot contacts without exporting?
Create a HubSpot service key under Development > Keys > Service keys with the scopes below (or use a private app token you already have), paste it on SimpleVerifier's Integrations page, pick a list or segment and press Verify leads. The result is written to each contact's sv_status property.
Which HubSpot scopes does the key need?
Reading needs crm.lists.read and crm.objects.contacts.read. Tagging also needs crm.objects.contacts.write, crm.schemas.contacts.read and crm.schemas.contacts.write, so the sv_status property can be created. Archiving needs crm.objects.contacts.write.
What does sv_status contain?
One of three values: valid (the mail server confirmed the mailbox), risky (the domain takes mail but the mailbox could not be confirmed, for example a catch-all) or invalid (the address will bounce).
Will it delete my HubSpot contacts?
Not by default. Archiving invalid contacts is a separate option that is off until you tick it. Archived contacts go to HubSpot's recycle bin, where they can be restored for 90 days.
How long does a large HubSpot list take?
HubSpot gives service keys the same limits as private apps: 100 API calls per 10 seconds on Free and Starter and 190 on Professional and Enterprise. The integration paces at about 90 and writes in batches of 100 contacts, so a 10,000-contact list takes a few minutes to pull and to tag, plus the checking time.
Check your list before you send
Real mailbox checks over SMTP, and nothing is sent to the address. Sign in with Google and your first 100 email checks are free, no card. Plans for bigger lists are on the pricing page.