Integration
Scrub GoHighLevel Contacts for TCPA Litigators
How do I check new GoHighLevel contacts for TCPA litigators before my team calls them?
Short answerAdd a Custom Webhook step to a GoHighLevel workflow that sends each new contact's phone number to NumberBroom's API, save the answer into four custom fields, and branch on it: tag known TCPA litigators, and landlines too if you text, so the workflow never hands them to your dialer. NumberBroom charges $0.20 a number from prepaid API credits; GoHighLevel bills Custom Webhook as a premium workflow action.
Checking a whole list? Preview 20 rows of it free →
On this page
A lead that lands in GoHighLevel can be checked before anyone calls it. One workflow sends the contact's phone number to NumberBroom, writes the answer onto the contact, and tags the ones your team should not dial: known TCPA litigators always, and landlines or disconnected numbers if you text or run an autodialer.
Before you start
- A NumberBroom API key and credits. Sign in, open Settings, create a key labelled for GoHighLevel and add credits ($10 minimum). Set a daily limit on the key if you want a hard cap on what a busy day of leads can spend.
- A GoHighLevel sub-account with workflows. Custom Webhook is a premium action, so check how your agency bills premium executions.
Step 1: Create four custom fields
In the sub-account's settings, add four single-line text custom fields on contacts: NB Outcome, NB Line Type, NB Carrier and NB Litigator.
Step 2: Start the workflow
Create a workflow with the trigger Contact Created. To scrub contacts you already have, add a second trigger, Contact Tag added, with a tag such as nb-scrub, and tag the contacts you want checked. Then add an If/Else step: continue only when NB Outcome is empty. That one condition is what stops a contact from being charged twice.
Step 3: Add the Custom Webhook
| Setting | Value |
|---|---|
| Event | CUSTOM |
| Method | POST |
| URL | https://numberbroom.com/api/v1/verify |
| Authorization | Bearer Token, with your NumberBroom API key (it starts with nb_live_) |
| Content-Type | application/json |
| Raw Body | {"phone": "{{contact.phone}}"} |
| Save response from this Webhook | On |
Save the action, then run Test Workflow with a real contact that has a phone number. GoHighLevel needs one real response before it can offer the answer's fields in later steps. The test is a real lookup and is charged like any other.
Step 4: Save the answer on the contact
Add an Update Contact Field step and map four values from the webhook's saved response:
| Contact field | Response field | What it holds |
|---|---|---|
| NB Outcome | outcome | clean, litigator, not_mobile, disconnected or invalid |
| NB Line Type | lineType | Mobile, landline, VoIP, toll-free or other |
| NB Carrier | carrier | The carrier that serves the number |
| NB Litigator | litigator | yes, no, or not_checked when the number was not looked up |
Use litigator, not isLitigator: the second is true, false or empty, and an empty value in a text field reads the same as a number that was never checked.
Step 5: Branch on the answer
- Everyone: if NB Litigator is
yes, add a tag such asnb-litigator, turn on Do Not Disturb for calls and texts, and end the workflow for that contact. - If you text or autodial: if NB Outcome is anything other than
clean, addnb-do-not-call. That removes landlines, VoIP, disconnected and invalid numbers as well as litigators, the same as NumberBroom's full scrub. - If you dial by hand and keep landlines: branch on NB Litigator alone, the same choice as the Litigators only scrub.
Point your dialer, SMS campaigns and pipelines at contacts without those tags, and the check runs on every lead before a person or a campaign reaches it.
What it costs
NumberBroom charges $0.20 a number from your API credits. A number that is not a US number is answered free, and a lookup that fails is never charged. GoHighLevel bills the Custom Webhook step separately as a premium action. If a day's leads would run past the daily limit you set on the key, the extra lookups are refused, not charged, and their NB fields stay empty; tag them with nb-scrub the next day to check them.
For a list of thousands of existing contacts, exporting a CSV and uploading it is usually cheaper: list scrubs are priced in volume bands that drop past 2,000 numbers. Keep a spreadsheet instead? The same lookup runs from Google Sheets, and every field is documented in the API reference.
Frequently asked questions
Will a contact be charged twice if it enters the workflow again?
Not if you keep the first If/Else step below, which skips any contact whose NB Outcome field is already filled. Every call to the API is a new lookup, so that check is what keeps a re-entered or re-tagged contact from being charged again. Turning off re-entry in the workflow's settings helps too.
What happens if the lookup fails?
NumberBroom charges nothing for a lookup that does not return an answer, and the webhook step fails, so the contact's NB fields stay empty. To check it again later, add the nb-scrub tag: the workflow only scrubs contacts whose NB Outcome is empty, so it runs once more for that contact.
Does this check the Do Not Call Registry?
No. This uses the NumberBroom API, and the API does not check the Do Not Call Registry: every answer says so (dncEvaluated: false). It checks line type, carrier and known TCPA litigators. A list you upload from the same NumberBroom account can include the federal Registry check under your own SAN, on lists of up to 1,000 numbers.
What does GoHighLevel charge for this?
GoHighLevel counts Custom Webhook as a premium workflow action. Each sub-account gets 100 free premium executions for its lifetime; after that each one is $0.01 unless the account has a Workflow Pro plan. That is GoHighLevel's pricing as of October 9, 2026, separate from NumberBroom's $0.20 a number.