> ## Documentation Index
> Fetch the complete documentation index at: https://docs.noresponse.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Screen a group of people

> Create a group, import its list of people and screen it in one flow, then work the roster in the console or with the API.

Screening reads the public posts of each person in a group. It looks for threats to the place or occasion that the group is for, and to the people that the group protects. A group is one list of people that you screen together. Examples are the guests of an event, the contractors of a site and the visitors of a building. You give NoResponse the group and its list of people. You can use the console or the API. Both use the same routes.

> [!NOTE]
>
> The test environment screens with stand-ins that find no accounts. A live screening answers 409 [`screening_unavailable`](https://docs.noresponse.org/problems/screening-unavailable) until live screening opens.

## Create a group

In the console, open **People** and click **Create group**. One dialog takes you through four steps: **Details**, **List**, **Columns** and **Screen**. The console sends nothing until you click the button of the last step. The first step asks for these fields:

| Field | What to enter |
| - | - |
| Name | The name of the group. This field is necessary. |
| Starts | The date and time when the occasion starts, in your own time zone. This field is necessary. |
| Venue | The place that the group comes to. |
| Host organisation | The organisation that receives the group. |
| People to protect | One row for each person. Enter a name and the other names that the person uses, with a comma between them. |
| Sensitive topics | Subjects that can cause trouble for this group. Press Enter after each topic. |

To create a group with the API, send `POST /v1/workspaces/{workspace_id}/groups/{environment}` with a key that has the `groups` scope. The `principals` field holds the people to protect.

```bash title="Create a group" theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
curl https://api.noresponse.org/v1/workspaces/$NORESPONSE_WORKSPACE/groups/test \
  -H "Authorization: Bearer $NORESPONSE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Annual general meeting","starts_at":"2026-12-03T09:30:00Z","venue":"Manchester Central","principals":[{"name":"Dana Whitfield","aliases":["D. Whitfield"]}],"topics":["factory closure"]}'
```

## Import the list of people and screen it in the console

Click **Continue** on the first step to go to the list. You can also add people to a group that you created before. Open the menu of its row, or the menu on its page, and click **Import people**. The dialog then starts at the **List** step.

**1. List: choose the file**

Drop a CSV file on the dialog, or click to choose one. The file has one heading row and one person in each row. Commas, semicolons and tabs can separate the fields. The console reads the file in your browser. If you do not have the list yet, click **Create without a list**. You can import the list later.

**2. Columns: say what each column holds**

The console guesses each column from its heading. Look at each guess and change it if necessary. The console shows the first five rows as it will send them. Columns that you do not need, such as dietary requirements, stay as **Skip this column**.

**3. Screen: check the match quality and start**

**Match quality** counts the rows by what they give the screening to find each person. It counts rows with a handle, rows with an email or a phone and no handle, and rows with only a name. A row with no handle gets the match **No profile to check** on a platform that a screening reads from handles only. Its email and phone are still looked up, but nobody looks for its profile. Choose the platforms to read. The depth is **Standard**. Then click **Screen**. If you want to import the list and not screen it, clear **Screen them as soon as they are imported** and click **Import**.

When you click **Screen**, the console creates the group, sends the rows in batches of up to 500 and starts the screening. A progress bar counts the people that NoResponse added, updated or found already there. If a batch fails, click **Try again**. The console sends the same batch again with the same `Idempotency-Key`, so NoResponse adds no person two times. The console then opens the page of the group, where a progress bar shows the screening.

The console cannot tell you the cost before the screening starts. NoResponse gives its estimate when the screening starts, and the console shows the estimate on the page of the group at that moment. If the estimate is more than the remainder of the daily screening spending limit, NoResponse answers 409 `screening_cap_exceeded`. The screening does not start and you spend nothing.

If a screening does not start, your list stays imported. The console opens the page of the group and a notice there tells you the cause. Click **Screen people** on that page to try again.

The console recognises these headings. It ignores case, spaces and punctuation in a heading.

| Column | Headings |
| - | - |
| Name | name, full name, attendee, attendee name, guest, guest name, person, contact name |
| Email | email, email address, mail, work email, attendee email |
| Phone | phone, phone number, mobile, mobile number, cell, telephone, tel |
| Instagram handle | instagram, instagram handle, ig, insta |
| X handle | x, x handle, twitter, twitter handle |
| Company | company, organisation, organization, employer, org, company name |
| City | city, town, location, hometown |
| Role | role, type, category, ticket type, attendee type, attendee role, attendee category, guest type, registration type, pass type, badge type |
| Your ID for the person | external id, id, attendee id, ticket id, ticket number, order id, registration id, guest id |

A role tells your team who has more access to the people you protect: **Guest** (a ticket holder), **Crew**, **Vendor** or **Press**. The console reads the common words for each, ignoring case:

| Role | Values it reads |
| - | - |
| Guest | guest, attendee, delegate, ticket holder, visitor, participant, general admission, GA, VIP, member, invitee |
| Crew | crew, staff, staff member, employee, volunteer, security, production, organiser, team, event staff, host |
| Vendor | vendor, supplier, exhibitor, contractor, caterer, catering, trader, concession |
| Press | press, media, journalist, reporter, photographer, broadcaster, broadcast, camera, news |

The console refuses no row for its role. A row with a role that it does not recognise, such as `Speaker`, imports without a role, and a sentence under the preview counts these rows. A row without a role has no role. The console does not assume that it is a guest.

Each row must have a name. The console deletes the `@` and the profile address from a handle. It writes a phone in international form. A phone without its country code, such as `020 7946 0000`, is not sent. Write it as `+44 20 7946 0000`. Before the import, the console lists each row that it cannot send, with its line number and the reason.

NoResponse matches a person by your ID for the person first, then by email, then by phone. If you import the same file again, NoResponse updates the people. It does not add them two times. If only the role of a person changed, the person keeps the results of earlier screenings.

## Add one person from Lookup or an account

You can add one person to a group without a file. Open a Lookup result or the page of an account and click **Add to group**. You must have permission to change groups. If you do not have this permission, the button does not show.

1. Select the group. You can search by name, venue or host. The list shows the groups of the environment that you are in. Upcoming groups are first.
2. Make sure that the details are correct. The console fills in the email, the phone and the name from the page. If the page found an account on a platform that NoResponse screens, the console also fills in the handle. If the page has no name, type the name. Each person must have a name.
3. Click **Add to group**.

The result is one of these:

| Result | What it means |
| - | - |
| Added | The person is new in the group. |
| Updated | The person was already in the group. The console added the new details from the page to the person. |
| Already there | The person was already in the group with the same details. Nothing changed. |

If the person is already in the group, the person keeps all the details that the group has. The console adds only the new details. Click **Open person** to see the person. The console does not start a screening. The next screening of the group screens the person.

## Send people with the API

Send up to 500 people in each `POST /v1/workspaces/{workspace_id}/groups/{environment}/{group_id}/people`. A body can have at most 512 KiB. Each batch needs its own `Idempotency-Key`. If you send a batch again after a failure, use the same key. The answer tells you how many people each batch `created` and `updated`.

```bash title="Add a batch of people" theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
curl https://api.noresponse.org/v1/workspaces/$NORESPONSE_WORKSPACE/groups/test/$GROUP_ID/people \
  -H "Authorization: Bearer $NORESPONSE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 3f6d2c1e-6b4a-4d7e-9a51-0c2b8e7f4a10" \
  -d '{"people":[{"external_id":"TKT-1001","name":"Ada Okafor","email":"ada.okafor@example.com","phone":"+442079460100","handles":[{"platform":"instagram","handle":"ada.okafor"}],"company":"Northwind Traders","city":"London","role":"guest"}]}'
```

A group holds at most 20,000 people. If you send the same key with a different body, NoResponse answers 409 [`idempotency_key_reused`](https://docs.noresponse.org/problems/idempotency-key-reused).

## Screen the people

The flow above starts the first screening. To screen a group at a later time, open the group in the console and click **Screen people**. After the first screening, the button is **Screen again**. The dialog tells you how many people the screening reaches. It reaches each person that no screening reached before. It also reaches each person that a reviewer marked **Watch** or **Escalated**. Choose the platforms to read. The depth is **Standard**: the bio and the last 100 posts of each account that the screening finds.

Click **Start screening**. The console tells you the estimate of the cost when the screening starts. The console sends `POST /v1/workspaces/{workspace_id}/groups/{environment}/{group_id}/screenings` with one `Idempotency-Key` for each time that you open the dialog. If the answer gets lost and you click again, NoResponse starts one screening, not two.

A screening can run for minutes or for hours. While it runs, the console reads the group again every 5 seconds. The progress bar under the summary counts the people screened, and the button says **Screening now**. You can close the page. The screening continues.

## When the screening finishes

A screening takes minutes to hours. You do not have to watch the console:

* The member who started the screening from the console gets one email. It gives the counts by band and links to the group. It also counts the people with no accounts found and those not fully covered. It names no person.
* Your verified webhook endpoints get [`screening.completed`](https://docs.noresponse.org/guides/webhooks#screening-completed) with the same counts.
* They also get [`person.flagged`](https://docs.noresponse.org/guides/webhooks#person-flagged) for each person that the screening flags, and [`person.decided`](https://docs.noresponse.org/guides/webhooks#person-decided) for each decision that a reviewer records.

## Work the roster

The page of a group has four tabs:

| Tab | What it shows |
| - | - |
| People | The full roster in the order of import. Each row shows the name, the role, the match, the highest finding and the decision. It also shows the time of the last screening. |
| Flagged | The people with a finding of **Moderate** or higher, the most serious first. Choose **Band** to see **Low** and **Info** findings. |
| Screenings | Each screening with its status, its start and finish, its progress and the people that it flagged. It also shows what the screening read on each platform and what it cost. A screening that did not cover some people is **Partial** and tells you how many. You can cancel a screening that runs from the menu of its row. |
| Settings | The fields of the group. Click **Save changes** to change them, or **Delete group** to delete the group with its people, decisions and screenings. |

Above the tabs, the summary counts the people and the people screened. It also counts the people flagged in each band and the flagged people that wait for a decision.

The match tells you how sure the screening is that it found the accounts of the person:

| Match | Meaning |
| - | - |
| Confirmed | Two or more hard identifiers agree, such as an email, a phone or a handle that you gave. |
| Probable | The name and one more detail agree, such as the company or the city. |
| Possible | Only the name agrees. |
| None found | The screening looked and found no account. |
| Inaccessible | The account exists, but it is private or locked. |
| No profile to check | The row gave nothing to look up on the platforms screened, such as a handle, so nobody looked. The lookups still ran. Add a handle to the row to screen the person. |
| Not screened | No screening reached the person yet. |

Use the search box and the **Band**, **Decision** and **Role** filters to find people. **Role** also has **Not stated**, for people without a role. The address of the page keeps the filters, so you can share a filtered view. Click a row to open the page of the person.

## Review a person

The page of a person shows the name, the match, the highest finding and the decision at the top. **Previous record** and **Next record** go through the roster in the order of the list that you opened it from. The page has four tabs:

| Tab | What it shows |
| - | - |
| Summary | The decision with its note, its author and its time. The latest screening with the accounts found, the accounts that it could read and the posts read. How many posts it analysed, and the period that they cover. What a Lookup of the person found. The other groups of the person, if there are some. The details that your list gave. |
| Profiles | One card for each account that the screening matched. Each card shows the picture from the platform, the name on the profile and the handle with a link to the profile. It also shows the bio, the counts, the match and each detail that matched, such as the email or the company. |
| Findings | Each finding, the most serious first. Each finding shows its band, its category, the quote, the text of the post and the time of the post. The quote is the exact words that the finding comes from. The post shows these words marked. It also shows a link to the post, the pictures of the post, the screenshot record and the reason for the finding. A finding on a picture tells what the picture shows and the words that the screening read in it. These words are not a quote: compare them with the picture. Choose **Band** to see one band. |
| Activity | Each decision with its author, its time and its note, and the screening that last read the person. |

A clean result is only as good as what the screening could read. Before you clear a person with no findings, look at the accounts found and the posts read on **Summary**.

The screening reads the text and the pictures of posts. It does not read videos. **Analysed** on **Summary** tells you how many items it analysed, for example 168 of 180. It also tells you why it did not analyse the others, for example 12 videos. The roster and **Findings** also tell you how many items it did not analyse. A finding can be in those items. If the screening analysed all the items, **Analysed** shows **All**.

To record a decision, click **Cleared**, **Watch** or **Escalated** at the top of the page. Write a note for your team and click the button that marks the decision, such as **Mark Watch**. The console sends `POST /v1/workspaces/{workspace_id}/groups/{environment}/{group_id}/people/{person_id}/review`. The decision shows on the roster, in **Activity**, in the export and in the audit log. Your webhook endpoints get [`person.decided`](https://docs.noresponse.org/guides/webhooks#person-decided). To record a decision, your role needs `groups.review`. Without it, the page shows no decision buttons.

If an account on **Profiles** belongs to a different person, click **Not this person** on its card. NoResponse cannot set aside one account yet. Thus the console records a decision with a note that names the account. The decision is **Cleared** when no other account has a finding. It is **Escalated** when a different account still has a finding, so that a reviewer looks at it. The dialog tells you which decision it records before you click.

## See what a Lookup found

Before a screening looks for the profiles of a person, it looks up their email, their phone and the accounts on your list. A Lookup does the same work. **Summary** shows the result in the **Lookup** section, with the same cards as the Lookup page:

| Card | What it shows |
| - | - |
| What was looked up | The result for each detail: the online accounts, the websites, the email domain and the phone. |
| Email | The domain, if the domain exists, and if the address is a throwaway address. |
| Phone | The line, the carrier, the country, the spam reports and the caller ID names. |
| Online accounts | Each platform that NoResponse searched and what it said, such as how the account signs in. |
| Websites | The websites and the password lists that hold the email or the accounts on your list, with the dates. |

Each result is one of these:

| Result | Meaning |
| - | - |
| Found | One or more sources found the detail. |
| Nothing found | All the sources answered, and none found the detail. |
| Partly covered | Some sources answered and found nothing. The other sources did not answer. |
| Not covered | No source answered, or NoResponse could not ask a source. NoResponse looked at nothing. |

**Partly covered** and **Not covered** also show the reason, for example that the source did not answer in time. Not covered is not a clean result.

A Lookup is context for your decision. It never sets a band, a match or a decision, and it is not on **Findings**. Only the posts of the person make a finding.

If your role cannot read evidence, the cards show the facts and the counts, but not the platforms and the websites. The person's report gives the same data in `lookup`. `details` is only for a member with `evidence.read` or a key with the `detailed` or `evidence` scope. If the latest screening ran before NoResponse looked up people, the report has no `lookup`. The section then says that the person was not looked up yet.

## See the other groups of a person

If the same email or phone is on the list of a different group, **Summary** shows **Other groups**. The list includes groups before and after this group, in the same workspace and the same environment. The newest group is first. Each row shows the name and the date of the group and the details that are the same. It also shows the decision that a reviewer recorded in that group, with the author and the date. Click the name of the group to open the person in that group. If the person is on no other list, the page does not show **Other groups**.

The person's report gives the same data in `other_groups`: the 20 most recent rows in `items`, and the number of rows in `total`. `matched_on` tells you which details are the same: `email`, `phone` or `external_id`. The same `external_id` without the same email or phone is not a match. You can use a ticket number again in a different group.

**Other groups** is a record of the past. It does not change the screening, the match, the highest finding or the decision of the person in this group. Each group keeps its own decision. NoResponse reads the other groups each time you open the report. If you delete a group, it goes from the other groups of each person immediately. Test groups and live groups never show each other.

## Export the roster

Click **Export** to download the roster as a CSV file for your team. The console reads the full roster and makes the file in your browser. The file has these columns: Name, Email, Your ID for the person, Role, Match, Highest finding, Decision, Note and Screened. Screened is an ISO 8601 time in UTC. If a value starts with `=`, `+`, `-` or `@`, the file starts it with `'`, so that a spreadsheet does not run it as a formula.

## Change a group

Settings saves the group with `PATCH /v1/workspaces/{workspace_id}/groups/{environment}/{group_id}` and the `expected_version` of the group that you opened. If a different person changed the group after you opened it, NoResponse answers 409 `group_conflict`. The console keeps your changes and asks if you want to discard them or keep them. If you change the start, the end moves with it, so the group keeps its length.

[Groups and screenings](https://docs.noresponse.org/reference/groups.md) describes each route, its fields and its answers.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.