Verify your HubSpot contacts without exporting
Connect HubSpot with your own key, pick one of your lists and segments, and SimpleVerifier checks every email address in it with the mail server. Each one comes back valid, risky or invalid, and by default the result is written into the sv_status contact property so you can filter on it in HubSpot. Archive invalid contacts are opt-in and need your confirmation.
Works on every account: free accounts use their free checks, paid plans their allowance.
How it works
- Sign in (free accounts work) and open Integrations in your dashboard.
- In HubSpot, go to Settings > Integrations > Private Apps and click Create a private app.
- Under Scopes, tick crm.lists.read and crm.objects.contacts.read. To write results, also tick crm.objects.contacts.write, crm.schemas.contacts.read and crm.schemas.contacts.write. Create the app and copy its access token.
- Paste it and click Connect. We check it with HubSpot before saving it.
- Pick one of your lists and segments. They are read live from your account.
- Keep the default, writing each result into the sv_status contact property, or untick it to only check. Archive invalid contacts stay off until you tick them and confirm.
- Read the confirmation, which shows what the run costs on your plan, and press Verify. Follow it in History and download the results there.
What we read and what we change
Only documented HubSpot API endpoints are used. To check a list or segment, SimpleVerifier reads:
GET /crm/v3/objects/contacts?limit=1checks the token when you connect. docsPOST /crm/v3/lists/searchlists your contact lists and segments with their size. docsGET /crm/v3/lists/{listId}/membershipspages through the record IDs in the list you picked, 250 at a time. docsPOST /crm/v3/objects/contacts/batch/readreads email, first name, last name and company, 100 contacts per call. docsGET /crm/v3/properties/contacts/sv_statuschecks whether the sv_status property exists before writing. docs
Only for the actions you choose, and only once verification has completed, it calls:
POST /crm/v3/properties/contactscreates sv_status (single-line text, Contact information group) the first time, only when you ticked the property option. docsPOST /crm/v3/objects/contacts/batch/updatewrites valid, risky or invalid into sv_status, 100 contacts per call. docsPOST /crm/v3/objects/contacts/batch/archivearchives invalid contacts, only when you ticked and confirmed it. HubSpot keeps them in the recycle bin for 90 days. docs
- Lists and segments are the same thing in HubSpot's API (the UI now calls lists segments). Active and static ones both work; company and deal lists are hidden because they hold no email addresses.
- Archiving removes the contact from HubSpot, not just from the list, so it leaves every list and workflow. That is why it is off by default and needs a confirmation.
- HubSpot allows private apps 100 calls per 10 seconds on Free and Starter and 190 on Professional and Enterprise. We pace at about 90, so other apps on your account keep room.
- Build a HubSpot active list on sv_status is any of invalid to keep those contacts out of your sends without archiving anything.
- Not yet tested against a live HubSpot account: the calls follow HubSpot's published API reference, and HubSpot's real API rejects a wrong token as expected. If something behaves differently in your account, write to support@simpleverifier.com.
Common questions
- How do I verify the contacts in a HubSpot list or segment?
- Connect your HubSpot private app access token in the SimpleVerifier dashboard, pick the list or segment and press Verify. SimpleVerifier reads the email addresses through the HubSpot API and checks each one with its mail server, as a normal list job: results show in History as valid, risky or invalid with a reason, with the same downloads as an uploaded CSV.
- What does SimpleVerifier change in HubSpot?
- Only what you pick for that run, and only after verification has completed. The default writes the result into the sv_status contact property and nothing else. Archive invalid contacts is opt-in: HubSpot moves those contacts to its recycle bin, where they can be restored for 90 days. They leave every list, not only this one. These act on invalid contacts only, never risky ones, and the dashboard asks you to confirm first. Only a confirmed mailbox is written as valid; anything unconfirmed is written as risky.
- What does it cost?
- The same as uploading the addresses as a CSV: one check per distinct address. Free accounts use their free checks (if the list or segment is bigger than what is left, the first addresses are checked and the rest stay unchecked and untouched). Paid plans use their monthly allowance or full-speed volume. Up to 100,000 contacts per run. Paid plans can also auto-verify new contacts once a day, up to 10,000 a day.
- How is my HubSpot key stored?
- It is checked with HubSpot, encrypted with AES-256-GCM using a server-side key and stored on our server. It is never shown again, never sent back to your browser and never written to logs. Removing it in the dashboard deletes it and skips any pending write-back.
- Why a pasted key and not a one-click Connect button?
- A one-click OAuth app needs a listed HubSpot app, which we have not published yet. Until then you paste a key from your own account, which you can revoke in HubSpot at any time. OAuth is a planned upgrade.
- Why was my HubSpot token rejected?
- A 401 means the token is wrong or the private app was deleted; copy it again from Settings > Integrations > Private Apps. A 403 means a scope is missing: reading needs crm.lists.read and crm.objects.contacts.read, writing sv_status needs crm.objects.contacts.write plus crm.schemas.contacts.read and crm.schemas.contacts.write.
Prefer a file?
Follow the HubSpot export guide and upload the CSV instead.