SightRadardocs

Migrate from AWS Rekognition

What is drop-in, what changes, the one step nobody can skip, and a six-step runbook for cutting over without a big-bang switch.

SightRadar uses the same request and response shapes as AWS Rekognition for the face operations, so an existing integration keeps working. Pricing is pegged below the Rekognition Group-1 reference rate; see pricing.

Operation mapping

RekognitionSightRadar
CreateCollectionPOST /v1/collections
ListCollectionsGET /v1/collections
DescribeCollectionGET /v1/collections/{id}
DeleteCollectionDELETE /v1/collections/{id}
IndexFacesPOST /v1/collections/{id}/index
IndexFaces with MaxFaces=1POST /v1/collections/{id}/selfies
SearchFacesByImagePOST /v1/collections/{id}/search
SearchFaces (by FaceId)POST /v1/collections/{id}/search-by-id
CompareFacesPOST /v1/compare
DetectFacesPOST /v1/detect
DeleteFacesDELETE /v1/collections/{id}/photos/{photoId} (per photo, not per face)

Label detection, text detection, celebrity recognition and video are out of scope. SightRadar does face recognition only.

What changes

  • Endpoint and auth. https://api.sightradar.com with Authorization: Bearer frs_… instead of a regional endpoint with SigV4. No IAM users, roles or policies.
  • Scores. Cosine similarity 0 to 1 instead of 0 to 100. The Python shim converts both ways; on raw REST you divide.
  • Bounding boxes. Absolute pixels instead of ratios.
  • Image input. URL, GCS key, multipart or raw bytes. S3Object becomes a URL you make fetchable.
  • Photos, not faces. Results group to photo_id; the finest delete is per photo.

Python: the two-line change

from sightradar_rekognition_shim import client   # 1. swap the import

rek = client(api_key="frs_...")                    # 2. swap the constructor

rek.create_collection(CollectionId="event-2026")
rek.index_faces(CollectionId="event-2026", Image={"URL": "https://cdn.example.com/guest.jpg"}, ExternalImageId="guest-1")
res = rek.search_faces_by_image(CollectionId="event-2026", Image={"Bytes": open("selfie.jpg", "rb").read()}, FaceMatchThreshold=90, MaxFaces=5)
for m in res["FaceMatches"]:
    print(m["Face"]["ExternalImageId"], m["Similarity"])

The shim maps method names, argument shapes and response dictionaries (FaceRecords, FaceMatches, Similarity). Details and honest differences are on the shim page. On JavaScript, Java, Go or .NET there is no shim: call the REST endpoints (or the Node SDK) and map requests and responses yourself using the table above.

The runbook

One call against a scratch collection

Prove credentials, network path and image handling before touching your application. Costs one photo.

Point a copy of your integration at SightRadar

In a branch, not production. On Python and boto3, swap in the shim. On raw REST, budget for mapping each call.

Re-index your existing faces

The one unavoidable step. Faceprints are model-specific vectors and are not portable between engines, so no provider can import another's. Re-run indexing over the source images with batch at the batch rate.

Dual-write, then compare on live traffic

Index into both systems and send each search to both. Compare ranked photo ids, not raw scores; the scales differ. Ranking agreement is the signal.

Re-calibrate your threshold on your own data

Do not carry the Rekognition number across. Follow choosing a threshold. This is the step teams skip and then blame on accuracy.

Cut over reads, keep the old collection

Rollback stays a config change until you delete the old data.

Questions teams ask

Side-by-side before and after code is on the migration page.

Last updated

On this page