TwinEthosRequest access

Control

Facial recognition database built by untargeted scraping

Creating or expanding facial-recognition databases through the untargeted scraping of facial images from the internet or CCTV footage is prohibited.

Informational data, not legal advice. Summaries are TwinEthos's own words and rules have not been reviewed by a lawyer: check the official text before relying on any of it. A guard addresses an item; adding it is not a statement that your code meets any law.

Control id cond.untargeted-facial-image-scraping

Reach

1items this one guard addresses
1jurisdictions where binding law on it is in force
0more where it is enacted, not yet applying
0standards and frameworks on the same control

Law in force in European Union (EU).

The guard to add

Admit images to a face-recognition gallery or embedding index only through consented enrolment or a targeted, recorded lawful basis, never from crawlers or bulk CCTV.

Put the gate on the single write path into the face gallery or face-embedding index: each insert must reference an enrolment record (consented enrolment of that person, or a targeted request naming the subject with its recorded lawful basis), and the ingestion code refuses items without one. Web crawlers, image scrapers, bulk dataset downloads and CCTV archives are not wired to face encoding plus indexing; if CCTV frames are processed for another purpose, no face templates from them are stored in a reusable recognition database. Store the source and enrolment id with every template so the gallery can be audited.

Where it goes: 1 application source code, 2 data models, 6 API calls and integrations.

What reviewers look for: no pipeline from a web crawler, image scraper or cctv_feed to face_encodings or a face-embedding call followed by an index or gallery insert; every gallery row carries an enrolment or lawful-basis reference checked at insert time; scraped image datasets are not used to build or expand a recognition database.

Example (Python face_recognition), before:

for url in crawler.image_urls(seed_sites):
    img = face_recognition.load_image_file(download(url))
    for enc in face_recognition.face_encodings(img):
        face_index.add(enc, meta={'source': url})

After:

def enroll(enrolment_id: str, image_path: str):
    rec = db.enrolments.get(enrolment_id)   # consented enrolment or targeted lawful basis
    if rec is None or rec.basis not in ('consented_enrolment', 'targeted_lawful_basis'):
        raise PermissionError('no enrolment record for this subject')
    encs = face_recognition.face_encodings(face_recognition.load_image_file(image_path))
    if len(encs) != 1:
        raise ValueError('expected exactly one face')
    face_index.add(encs[0], meta={'enrolment_id': rec.id, 'subject_id': rec.subject_id})
# the crawler no longer calls face_encodings or face_index.add

Engineering guidance, not legal advice. Each provision below may add its own details (a cadence, a deadline, a required notice element): open it for those.

Every rule this guard addresses

Binding law — in force (1)