<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Murat Can Kuru</title>
    <description>The latest articles on DEV Community by Murat Can Kuru (@murat_cankuru_6ecfa7c5ff).</description>
    <link>https://dev.to/murat_cankuru_6ecfa7c5ff</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4138059%2F6f898012-8a70-4b31-91a8-98f1d7dee711.png</url>
      <title>DEV Community: Murat Can Kuru</title>
      <link>https://dev.to/murat_cankuru_6ecfa7c5ff</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/murat_cankuru_6ecfa7c5ff"/>
    <language>en</language>
    <item>
      <title>Reverse Face Search APIs Compared (2026): Trace vs FaceCheck.ID vs Lenso vs PimEyes</title>
      <dc:creator>Murat Can Kuru</dc:creator>
      <pubDate>Tue, 22 Sep 2026 17:26:06 +0000</pubDate>
      <link>https://dev.to/murat_cankuru_6ecfa7c5ff/reverse-face-search-apis-compared-2026-trace-vs-facecheckid-vs-lenso-vs-pimeyes-1d7</link>
      <guid>https://dev.to/murat_cankuru_6ecfa7c5ff/reverse-face-search-apis-compared-2026-trace-vs-facecheckid-vs-lenso-vs-pimeyes-1d7</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I build &lt;a href="https://traceaifacescan.app/ai-face-scan-api/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=content&amp;amp;utm_content=reverse-face-search-apis-compared" rel="noopener noreferrer"&gt;Trace&lt;/a&gt;, which is first on this list. I've included where the others win — at high volume, some of them clearly do. Pricing was checked in September 2026 on each provider's own pages or recent reviews; confirm before you commit.&lt;/em&gt;\n\nIf you need &lt;strong&gt;reverse face search in your own code&lt;/strong&gt; — one photo in, public pages with the same face out — the list of options is shorter than it looks. Most \"face APIs\" are verification APIs that compare two faces you already have. Only a few actually search the web. Here's how they compare on the things that matter when you integrate one.\n\n## At a glance\n\n| | Trace | FaceCheck.ID | Lenso.ai | PimEyes |\n|---|---|---|---|---|\n| Self-serve API | ✅ | ✅ | ✅ (Developer plan) | ❌ (institutional product only) |\n| Pricing model | Credits, pay as you go | Credits | Monthly subscription | — |\n| Entry price | $4 / 5 searches | $19 / 150 credits (50 searches) | Developer plan, 5,000 calls/mo | — |\n| Credits expire | Never | Yes (14 days on the $19 pack) | Monthly allowance | — |\n| Payment | Card, Telegram Stars, crypto | Crypto only | Card | — |\n| Monthly minimum | None | None | Subscription | — |\n| Result score | 50–100 + tier | Score | Similarity | — |\n| Returns social handles as fields | ✅ | ❌ | ❌ | — |\n\n## 1. Trace — pay-per-search, no minimum\n\n- &lt;strong&gt;Auth:&lt;/strong&gt; one header, &lt;code&gt;Authorization: Bearer trk_live_…&lt;/code&gt;. No OAuth, no SDK.\n- &lt;strong&gt;Model:&lt;/strong&gt; async. &lt;code&gt;POST /v1/scans&lt;/code&gt; → 202 → poll &lt;code&gt;GET /v1/scans/{id}&lt;/code&gt; (about a minute).\n- &lt;strong&gt;Idempotency:&lt;/strong&gt; &lt;code&gt;Idempotency-Key&lt;/code&gt; header, 24-hour window, so retries never double-charge.\n- &lt;strong&gt;Explicit spend:&lt;/strong&gt; a scan with no credits comes back &lt;code&gt;locked&lt;/code&gt;; unlocking is a separate &lt;code&gt;POST /reveal&lt;/code&gt;, so a buggy loop can't drain the balance.\n- &lt;strong&gt;Output:&lt;/strong&gt; each match has &lt;code&gt;score&lt;/code&gt;, &lt;code&gt;tier&lt;/code&gt;, &lt;code&gt;platform&lt;/code&gt;, &lt;code&gt;handle&lt;/code&gt; and &lt;code&gt;url&lt;/code&gt; — the handle is a field, so you don't parse URLs.\n- &lt;strong&gt;Accounts, not only pages:&lt;/strong&gt; after the face search, a second round checks platforms directly for names/usernames found in the first, which surfaces social profiles that were never in an image index.\n- &lt;strong&gt;Errors:&lt;/strong&gt; &lt;code&gt;application/problem+json&lt;/code&gt; with stable &lt;code&gt;code&lt;/code&gt;s.\n- &lt;strong&gt;Limits:&lt;/strong&gt; no per-minute rate limit by default; credits are the brake.\n- &lt;strong&gt;Spec:&lt;/strong&gt; &lt;a href="https://traceaifacescan.app/openapi.json" rel="noopener noreferrer"&gt;OpenAPI&lt;/a&gt;, also &lt;a href="https://rapidapi.com/muratcankuruoffical/api/trace-reverse-face-search-api" rel="noopener noreferrer"&gt;on RapidAPI&lt;/a&gt;.\n- &lt;strong&gt;Price:&lt;/strong&gt; one credit per search. $4 for 5, $22 for 40, $50 for 100 ($0.50/search). Plus VAT where applicable. Credits never expire.\n\n*&lt;em&gt;Weak spots:&lt;/em&gt;* it's the newest index of the four, and at thousands of searches a month FaceCheck.ID's big packs are cheaper per search.\n\n## 2. FaceCheck.ID — cheapest at volume, crypto only\n\nFaceCheck.ID has a REST API with credit-based pricing: each search costs &lt;strong&gt;3 credits&lt;/strong&gt; at about &lt;strong&gt;$0.10 per credit&lt;/strong&gt;, so roughly &lt;strong&gt;$0.30 a search&lt;/strong&gt;, and less on its largest packs (up to 10,000 credits for $597). Its index is strong on scam-report sites, mugshots and news archives.\n\nTwo things to plan around: payment is &lt;strong&gt;cryptocurrency-only&lt;/strong&gt; (since late 2024), which some finance teams can't do, and &lt;strong&gt;credits expire&lt;/strong&gt; — 14 days on the $19 entry pack. Great if your volume is steady and high; painful if it's bursty.\n\n## 3. Lenso.ai — subscription with image search included\n\nLenso's &lt;strong&gt;Developer plan&lt;/strong&gt; includes 5,000 API calls a month across its Image Search and Face Search APIs, plus result unlocks and alerts. It's a monthly subscription, so it suits steady volume; for occasional calls you pay for capacity you don't use. Face search is only available in selected regions — check yours before you build on it.\n\n## 4. PimEyes — no self-serve API\n\nPimEyes is the best-known consumer face search engine, but its public pricing is for its web plans (Open Plus from $29.99/month for up to 75 searches a day). There's no self-serve API on the pricing page; its OSINT product is sold to institutions. If you need to call face search from code today, it's not an option.\n\n## What about Rekognition, Azure Face, Face++?\n\nThose are &lt;strong&gt;face verification / recognition&lt;/strong&gt; APIs: they compare faces in images &lt;em&gt;you&lt;/em&gt; provide (\"is this the same person as that?\") or search a collection &lt;em&gt;you&lt;/em&gt; indexed. They don't search the public web. Useful for liveness and 1:1 checks, not for \"where else does this face appear?\"\n\n## Which one?\n\n- &lt;strong&gt;Bursty or low volume, want a card and no expiry&lt;/strong&gt; → Trace\n- &lt;strong&gt;High, steady volume and crypto is fine&lt;/strong&gt; → FaceCheck.ID\n- &lt;strong&gt;Want image search + face search on one subscription&lt;/strong&gt; → Lenso.ai\n- &lt;strong&gt;Comparing two faces you already have&lt;/strong&gt; → Rekognition / Azure Face\n\nIf you want to try Trace, there's a &lt;a href="https://traceaifacescan.app/ai-face-scan-api/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=content&amp;amp;utm_content=reverse-face-search-apis-compared" rel="noopener noreferrer"&gt;Python walkthrough&lt;/a&gt; — about 50 lines from photo to flagged profile.\n\n## A note on responsible use\n\nWhatever provider you pick, reverse face search on real people carries legal and ethical weight. Use it for trust &amp;amp; safety on your own platform, for verifying who a user is talking to, or for finding where someone's &lt;em&gt;own&lt;/em&gt; photos are reused — not to identify or track strangers. Delete query images when you're done; Trace does this after 30 days, or immediately via &lt;code&gt;DELETE /v1/scans/{id}&lt;/code&gt;.\n\n*FaceCheck.ID, Lenso.ai, PimEyes and the other names above are trademarks of their respective owners, named only for comparison. Trace isn't affiliated with any of them.*\n&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>privacy</category>
      <category>comparison</category>
    </item>
    <item>
      <title>Build a Fake-Profile Checker with a Reverse Face Search API (Python, ~50 lines)</title>
      <dc:creator>Murat Can Kuru</dc:creator>
      <pubDate>Tue, 22 Sep 2026 17:24:16 +0000</pubDate>
      <link>https://dev.to/murat_cankuru_6ecfa7c5ff/build-a-fake-profile-checker-with-a-reverse-face-search-api-python-50-lines-372d</link>
      <guid>https://dev.to/murat_cankuru_6ecfa7c5ff/build-a-fake-profile-checker-with-a-reverse-face-search-api-python-50-lines-372d</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I'm the developer of &lt;a href="https://traceaifacescan.app/ai-face-scan-api/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=content&amp;amp;utm_content=reverse-face-search-api-python" rel="noopener noreferrer"&gt;Trace&lt;/a&gt;, the API used in this tutorial.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dating apps, marketplaces, and community platforms all have the same problem: accounts built from someone else's photos.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;reverse face search API&lt;/strong&gt; is one way to catch them. You send a profile photo, and it tells you where else that face appears on the public web.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll build a small fake-profile checker in Python:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload a profile photo.&lt;/li&gt;
&lt;li&gt;Wait for the face search to complete.&lt;/li&gt;
&lt;li&gt;Review the matches.&lt;/li&gt;
&lt;li&gt;Flag the profile if the same face appears under a different identity.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Face Recognition API vs. Reverse Image Search API vs. Reverse Face Search API
&lt;/h2&gt;

&lt;p&gt;These three are often confused, but they solve different problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Face recognition and verification APIs
&lt;/h3&gt;

&lt;p&gt;Services such as AWS Rekognition and Azure Face compare faces you already have.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Is the person in photo A the same person as the person in photo B?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They don't search the public web for other appearances of that face.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reverse image search APIs
&lt;/h3&gt;

&lt;p&gt;These look for copies or visually related versions of the &lt;strong&gt;same image&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If someone crops, mirrors, heavily edits, or replaces the image with another photo of the same person, traditional reverse image search may not find the connection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reverse face search APIs
&lt;/h3&gt;

&lt;p&gt;These search for the &lt;strong&gt;face itself&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You provide one photo and the service searches the public web for other photos containing a similar face.&lt;/p&gt;

&lt;p&gt;That's useful for detecting a common stolen-photo pattern:&lt;/p&gt;

&lt;p&gt;The scammer uses photos A, B, and C.&lt;/p&gt;

&lt;p&gt;The real person's Instagram contains photo D.&lt;/p&gt;

&lt;p&gt;A traditional reverse image search may not connect those images.&lt;/p&gt;

&lt;p&gt;A face search potentially can.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get an API Key
&lt;/h2&gt;

&lt;p&gt;Open the &lt;a href="https://traceaifacescan.app/panel/api?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=content&amp;amp;utm_content=reverse-face-search-api-python" rel="noopener noreferrer"&gt;Trace API panel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There's no traditional sign-up form. The panel generates an account for you, and you can create an API key under &lt;strong&gt;API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your key will look something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;trk_live_xxxxxxxxxxxxxxxx




Store it as an environment variable:

`export TRACE_KEY=trk_live_xxxxxxxxxxxxxxxx`

Trace uses credit-based pricing rather than a monthly subscription.

One search uses one credit, packs start at $4 for five searches, and credits don't expire.

If you prefer managing API subscriptions through a marketplace, the same API is also available on RapidAPI.

How the API Works

Face search isn't instantaneous, so the API uses an asynchronous workflow.

The basic process looks like this:

`POST /v1/scans
       |
       v
202 Accepted
       |
       v
   scan ID
       |
       v
GET /v1/scans/{id}
       |
       v
 status = done
       |
       v
   matches[]`


More specifically:

POST /v1/scans with the image.
Receive a 202 Accepted response and a scan id.
Poll GET /v1/scans/{id} until the status becomes done or failed.
Read the results from matches[].

Each match can contain:

score
tier
platform
handle
url

There's also an important protection around credits.

If your account doesn't have enough credits, the scan is returned as locked: true.

Nothing is searched until you explicitly unlock it with:


`POST /v1/scans/{id}/reveal`

That means a script can't accidentally spend your credits simply by creating scans.

Build the Python Checker

We'll use Python and the requests library.

Install it if you don't already have it:

`pip install requests`

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;import os&lt;br&gt;
import sys&lt;br&gt;
import time&lt;br&gt;
import hashlib&lt;br&gt;
import requests&lt;/p&gt;

&lt;p&gt;BASE = "&lt;a href="https://traceaifacescan.app/api/v1" rel="noopener noreferrer"&gt;https://traceaifacescan.app/api/v1&lt;/a&gt;"&lt;/p&gt;

&lt;p&gt;HEADERS = {&lt;br&gt;
    "Authorization": f"Bearer {os.environ['TRACE_KEY']}"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;def start_scan(path: str) -&amp;gt; dict:&lt;br&gt;
    data = open(path, "rb").read()&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Same photo -&amp;gt; same key.
# A retry after a timeout won't accidentally create another charge.
idem = hashlib.sha256(data).hexdigest()

response = requests.post(
    f"{BASE}/scans",
    headers={
        **HEADERS,
        "Idempotency-Key": idem,
    },
    files={
        "image": (os.path.basename(path), data)
    },
    timeout=60,
)

response.raise_for_status()
return response.json()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;def wait_for_scan(scan_id: str) -&amp;gt; dict:&lt;br&gt;
    while True:&lt;br&gt;
        response = requests.get(&lt;br&gt;
            f"{BASE}/scans/{scan_id}",&lt;br&gt;
            headers=HEADERS,&lt;br&gt;
            timeout=30,&lt;br&gt;
        )&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    response.raise_for_status()
    scan = response.json()

    if scan["status"] in ("done", "failed"):
        return scan

    time.sleep(2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;def check(path: str, claimed_handle: str | None = None) -&amp;gt; None:&lt;br&gt;
    scan = start_scan(path)&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if scan["locked"]:
    sys.exit(
        "No credits: the scan is locked. "
        "Top up, then POST /scans/{id}/reveal."
    )

scan = wait_for_scan(scan["id"])

if scan["status"] == "failed":
    sys.exit(
        f"Scan failed: {scan['error_code']}"
    )

strong = [
    match
    for match in scan["matches"]
    if match["tier"] in ("strong", "near_certain")
]

for match in strong:
    print(
        f"{match['score']:&amp;gt;3}  "
        f"{match['platform']:&amp;lt;10} "
        f"{match['handle'] or '-':&amp;lt;24} "
        f"{match['url']}"
    )

if claimed_handle:
    others = [
        match
        for match in strong
        if (
            match["handle"]
            and match["handle"].lstrip("@").lower()
            != claimed_handle.lower()
        )
    ]

    if others:
        print(
            f"\n⚠ Same face appears under "
            f"{len(others)} other account(s). "
            "Review manually."
        )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;if &lt;strong&gt;name&lt;/strong&gt; == "&lt;strong&gt;main&lt;/strong&gt;":&lt;br&gt;
    check(&lt;br&gt;
        sys.argv[1],&lt;br&gt;
        sys.argv[2] if len(sys.argv) &amp;gt; 2 else None&lt;br&gt;
    )&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Run the Checker

Give it a profile photo and, optionally, the username the person claims to use:

&lt;span class="sb"&gt;`&lt;/span&gt;python check.py profile.jpg sarah.mitchell&lt;span class="sb"&gt;`&lt;/span&gt;

A result might look like:

&lt;span class="sb"&gt;`&lt;/span&gt;88  instagram  @sarahm_photo             https://instagram.com/sarahm_photo
81  x           @smitchell                https://x.com/smitchell

⚠ Same face appears under 2 other account&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Review manually.&lt;span class="sb"&gt;`&lt;/span&gt;

The important part isn&lt;span class="s1"&gt;'t simply that a face was found.

The important part is the context of the match.

If the same face appears under a completely different username, that may be worth investigating.

Understanding the Scores

Every match includes a score between 50 and 100 and a corresponding tier.

Tier    Score   Meaning
weak    &amp;lt; 70    Probably noise
possible    70+ Worth investigating
strong  80+ Very likely the same face
near_certain    90+ Extremely strong match

These scores should be treated as signals for investigation, not automatic decisions.

A strong match under a different name is a classic stolen-photo pattern.

But there are legitimate reasons why the same person may appear under multiple usernames.

Someone might:

Have multiple social accounts
Have changed usernames
Use a nickname
Appear in a friend'&lt;/span&gt;s photos
Have an old account under a different name

So the correct workflow is:

Search → review the result → verify the context → make the decision.

Not:

Search → automatic ban.

Handling Errors

The API returns errors using application/problem+json with a stable error code.

Some common responses include:

HTTP status Code    Meaning
401 unauthenticated Missing or incorrect API key
402 insufficient_credits    Not enough credits to reveal the scan
422 invalid_image   Unsupported image, file too large, or dimensions too small
404 not_found   Invalid scan ID or deleted scan

Supported images include JPEG, PNG, and WebP.

Images must be no larger than 8 MB and at least 200 × 200 pixels.

Why the API Accepts File Uploads Instead of Image URLs

You might notice that the API doesn&lt;span class="s1"&gt;'t accept an arbitrary image URL.

That'&lt;/span&gt;s intentional.

An endpoint that fetches any URL supplied by a user can potentially become an SSRF &lt;span class="o"&gt;(&lt;/span&gt;Server-Side Request Forgery&lt;span class="o"&gt;)&lt;/span&gt; proxy.

For example, an attacker could attempt to make the server request internal infrastructure instead of a public image.

Requiring the application to upload the actual image avoids that particular class of problem.

So instead of:

&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"image_url"&lt;/span&gt;: &lt;span class="s2"&gt;"https://example.com/profile.jpg"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;

you upload the file directly.

Node.js Version

If you&lt;span class="s1"&gt;'re building with JavaScript or Node.js, the same workflow is straightforward:

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;import fs from "node:fs";&lt;/p&gt;

&lt;p&gt;const BASE = "&lt;a href="https://traceaifacescan.app/api/v1" rel="noopener noreferrer"&gt;https://traceaifacescan.app/api/v1&lt;/a&gt;";&lt;/p&gt;

&lt;p&gt;const auth = {&lt;br&gt;
  Authorization: &lt;code&gt;Bearer ${process.env.TRACE_KEY}&lt;/code&gt;&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;const form = new FormData();&lt;/p&gt;

&lt;p&gt;form.append(&lt;br&gt;
  "image",&lt;br&gt;
  new Blob([&lt;br&gt;
    fs.readFileSync("profile.jpg")&lt;br&gt;
  ]),&lt;br&gt;
  "profile.jpg"&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;let scan = await (&lt;br&gt;
  await fetch(&lt;code&gt;${BASE}/scans&lt;/code&gt;, {&lt;br&gt;
    method: "POST",&lt;br&gt;
    headers: auth,&lt;br&gt;
    body: form&lt;br&gt;
  })&lt;br&gt;
).json();&lt;/p&gt;

&lt;p&gt;while (&lt;br&gt;
  scan.status === "queued" ||&lt;br&gt;
  scan.status === "running"&lt;br&gt;
) {&lt;br&gt;
  await new Promise((resolve) =&amp;gt;&lt;br&gt;
    setTimeout(resolve, 2000)&lt;br&gt;
  );&lt;/p&gt;

&lt;p&gt;scan = await (&lt;br&gt;
    await fetch(&lt;br&gt;
      &lt;code&gt;${BASE}/scans/${scan.id}&lt;/code&gt;,&lt;br&gt;
      {&lt;br&gt;
        headers: auth&lt;br&gt;
      }&lt;br&gt;
    )&lt;br&gt;
  ).json();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;console.table(&lt;br&gt;
  (scan.matches ?? []).map(&lt;br&gt;
    ({ score, tier, platform, url }) =&amp;gt; ({&lt;br&gt;
      score,&lt;br&gt;
      tier,&lt;br&gt;
      platform,&lt;br&gt;
      url&lt;br&gt;
    })&lt;br&gt;
  )&lt;br&gt;
);&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;



The workflow is the same:

Upload → poll → retrieve matches.

Privacy and Acceptable Use

Face search involves real people, so how you use the API matters.

Trace is designed to return public URLs and matching information rather than private identity records.

According to the service's policies:

Results contain public URLs and scores, not private addresses or personal records.
Query photos are deleted after 30 days, or can be deleted immediately with DELETE /v1/scans/{id}.
Using the API to identify, locate, monitor, or harass people is prohibited.
API keys used for prohibited activity can be revoked.
People can request removal from the search index without creating an account.

Good use cases include:

Trust and safety checks on your own platform
Detecting stolen profile photos
Checking whether your own photos have been reposted
Verifying a potential match before meeting someone

A request like:

"Find out who this random stranger is."

is a fundamentally different use case and isn't what this API is designed for.

What You Could Build With This

Once you have the basic API integration working, you can take the same workflow in several directions.

For a dating platform, you could run a search when a profile is reported and send strong matches to a moderation queue.

For a marketplace, you could check whether seller profile photos appear on unrelated accounts.

For a community platform, you could let users verify that their own profile images haven't been copied elsewhere.

The architectural pattern stays simple:

`Profile photo
      |
      v
Reverse face search
      |
      v
Potential matches
      |
      v
Similarity score
      |
      v
Human review
      |
      v
Action`


The API provides the signal.

Your application should make the final decision.

Useful Links
Trace Face Search API
API Panel
API Documentation
OpenAPI Specification
Trace on RapidAPI

If you're integrating the API into a dating app, marketplace, moderation system, or another platform and run into an edge case, leave it in the comments.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>tutorial</category>
      <category>security</category>
    </item>
  </channel>
</rss>
