{
  "schemaVersion": "1.0",
  "item": {
    "slug": "didit-face-match",
    "name": "Didit Face Match",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/rosasalberto/didit-face-match",
    "canonicalUrl": "https://clawhub.ai/rosasalberto/didit-face-match",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/didit-face-match",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=didit-face-match",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "scripts/match_faces.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/didit-face-match"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/didit-face-match",
    "agentPageUrl": "https://openagent3.xyz/skills/didit-face-match/agent",
    "manifestUrl": "https://openagent3.xyz/skills/didit-face-match/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/didit-face-match/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Overview",
        "body": "Compares two facial images to determine if they belong to the same person. Returns a similarity score (0-100).\n\nKey constraints:\n\nSupported formats: JPEG, PNG, WebP, TIFF\nMaximum file size: 5MB per image\nIf multiple faces in an image, the largest face is used for comparison\nBoth user_image and ref_image are required\n\nCapabilities: Similarity scoring, age estimation, gender detection, face bounding boxes, configurable decline threshold, optional image rotation for non-upright faces.\n\nAPI Reference: https://docs.didit.me/standalone-apis/face-match\nFeature Guide: https://docs.didit.me/core-technology/face-match/overview"
      },
      {
        "title": "Authentication",
        "body": "All requests require x-api-key header. Get your key from Didit Business Console → API & Webhooks, or via programmatic registration (see below)."
      },
      {
        "title": "Getting Started (No Account Yet?)",
        "body": "If you don't have a Didit API key, create one in 2 API calls:\n\nRegister: POST https://apx.didit.me/auth/v2/programmatic/register/ with {\"email\": \"you@gmail.com\", \"password\": \"MyStr0ng!Pass\"}\nCheck email for a 6-character OTP code\nVerify: POST https://apx.didit.me/auth/v2/programmatic/verify-email/ with {\"email\": \"you@gmail.com\", \"code\": \"A3K9F2\"} → response includes api_key\n\nTo add credits: GET /v3/billing/balance/ to check, POST /v3/billing/top-up/ with {\"amount_in_dollars\": 50} for a Stripe checkout link.\n\nSee the didit-verification-management skill for full platform management (workflows, sessions, users, billing)."
      },
      {
        "title": "Endpoint",
        "body": "POST https://verification.didit.me/v3/face-match/"
      },
      {
        "title": "Headers",
        "body": "HeaderValueRequiredx-api-keyYour API keyYesContent-Typemultipart/form-dataYes"
      },
      {
        "title": "Request Parameters (multipart/form-data)",
        "body": "ParameterTypeRequiredDefaultConstraintsDescriptionuser_imagefileYes—JPEG/PNG/WebP/TIFF, max 5MBUser's face image to verifyref_imagefileYes—Same as aboveReference image to compare againstface_match_score_decline_thresholdintegerNo300-100Scores below this = Declinedrotate_imagebooleanNofalse—Try 0/90/180/270 degree rotations to find upright facesave_api_requestbooleanNotrue—Save in Business Console Manual Checksvendor_datastringNo——Your identifier for session tracking"
      },
      {
        "title": "Example",
        "body": "import requests\n\nresponse = requests.post(\n    \"https://verification.didit.me/v3/face-match/\",\n    headers={\"x-api-key\": \"YOUR_API_KEY\"},\n    files={\n        \"user_image\": (\"selfie.jpg\", open(\"selfie.jpg\", \"rb\"), \"image/jpeg\"),\n        \"ref_image\": (\"id_photo.jpg\", open(\"id_photo.jpg\", \"rb\"), \"image/jpeg\"),\n    },\n    data={\"face_match_score_decline_threshold\": \"50\"},\n)\n\nconst formData = new FormData();\nformData.append(\"user_image\", selfieFile);\nformData.append(\"ref_image\", referenceFile);\nformData.append(\"face_match_score_decline_threshold\", \"50\");\n\nconst response = await fetch(\"https://verification.didit.me/v3/face-match/\", {\n  method: \"POST\",\n  headers: { \"x-api-key\": \"YOUR_API_KEY\" },\n  body: formData,\n});"
      },
      {
        "title": "Response (200 OK)",
        "body": "{\n  \"request_id\": \"a1b2c3d4-...\",\n  \"face_match\": {\n    \"status\": \"Approved\",\n    \"score\": 80,\n    \"user_image\": {\n      \"entities\": [\n        {\"age\": 27.63, \"bbox\": [40, 40, 100, 100], \"confidence\": 0.717, \"gender\": \"male\"}\n      ],\n      \"best_angle\": 0\n    },\n    \"ref_image\": {\n      \"entities\": [\n        {\"age\": 22.16, \"bbox\": [156, 234, 679, 898], \"confidence\": 0.717, \"gender\": \"male\"}\n      ],\n      \"best_angle\": 0\n    },\n    \"warnings\": []\n  },\n  \"created_at\": \"2025-05-01T13:11:07.977806Z\"\n}"
      },
      {
        "title": "Status Values & Handling",
        "body": "StatusMeaningAction\"Approved\"Score >= thresholdFaces match — proceed\"Declined\"Score < threshold or no faceCheck warnings for details. May need better image\"In Review\"Needs manual reviewWait for review or retrieve via session API"
      },
      {
        "title": "Error Responses",
        "body": "CodeMeaningAction400Invalid requestCheck file format, size, parameters401Invalid API keyVerify x-api-key header403Insufficient creditsTop up at business.didit.me"
      },
      {
        "title": "Response Field Reference",
        "body": "FieldTypeDescriptionstatusstring\"Approved\", \"Declined\", \"In Review\"scoreinteger0-100 similarity score (higher = more similar). null if no face foundentities[].agefloatEstimated ageentities[].bboxarrayFace bounding box [x1, y1, x2, y2]entities[].confidencefloatFace detection confidence (0-1)entities[].genderstring\"male\" or \"female\"best_angleintegerBest rotation angle for the facewarningsarray{risk, log_type, short_description, long_description}"
      },
      {
        "title": "Warning Tags",
        "body": "TagDescriptionAuto-DeclineNO_REFERENCE_IMAGEReference or face image missingYesNO_FACE_DETECTEDNo face detected in one or both imagesYesLOW_FACE_MATCH_SIMILARITYScore below threshold — potential identity mismatchConfigurable\n\nSecurity best practice: Only store the status and score. Minimize biometric image data on your servers. Image URLs (in workflow mode) expire after 60 minutes."
      },
      {
        "title": "Score Interpretation",
        "body": "Score RangeInterpretationAction90-100Very high confidence — same personAuto-approve70-89High confidence — likely same personApprove (default threshold 30)50-69Moderate — possible matchConsider manual review30-49Low — likely different peopleDeclined at default threshold0-29Very low — different peopleDeclined"
      },
      {
        "title": "Utility Scripts",
        "body": "export DIDIT_API_KEY=\"your_api_key\"\n\npython scripts/match_faces.py selfie.jpg id_photo.jpg\npython scripts/match_faces.py selfie.jpg id_photo.jpg --threshold 50 --rotate"
      }
    ],
    "body": "Didit Face Match API\nOverview\n\nCompares two facial images to determine if they belong to the same person. Returns a similarity score (0-100).\n\nKey constraints:\n\nSupported formats: JPEG, PNG, WebP, TIFF\nMaximum file size: 5MB per image\nIf multiple faces in an image, the largest face is used for comparison\nBoth user_image and ref_image are required\n\nCapabilities: Similarity scoring, age estimation, gender detection, face bounding boxes, configurable decline threshold, optional image rotation for non-upright faces.\n\nAPI Reference: https://docs.didit.me/standalone-apis/face-match Feature Guide: https://docs.didit.me/core-technology/face-match/overview\n\nAuthentication\n\nAll requests require x-api-key header. Get your key from Didit Business Console → API & Webhooks, or via programmatic registration (see below).\n\nGetting Started (No Account Yet?)\n\nIf you don't have a Didit API key, create one in 2 API calls:\n\nRegister: POST https://apx.didit.me/auth/v2/programmatic/register/ with {\"email\": \"you@gmail.com\", \"password\": \"MyStr0ng!Pass\"}\nCheck email for a 6-character OTP code\nVerify: POST https://apx.didit.me/auth/v2/programmatic/verify-email/ with {\"email\": \"you@gmail.com\", \"code\": \"A3K9F2\"} → response includes api_key\n\nTo add credits: GET /v3/billing/balance/ to check, POST /v3/billing/top-up/ with {\"amount_in_dollars\": 50} for a Stripe checkout link.\n\nSee the didit-verification-management skill for full platform management (workflows, sessions, users, billing).\n\nEndpoint\nPOST https://verification.didit.me/v3/face-match/\n\nHeaders\nHeader\tValue\tRequired\nx-api-key\tYour API key\tYes\nContent-Type\tmultipart/form-data\tYes\nRequest Parameters (multipart/form-data)\nParameter\tType\tRequired\tDefault\tConstraints\tDescription\nuser_image\tfile\tYes\t—\tJPEG/PNG/WebP/TIFF, max 5MB\tUser's face image to verify\nref_image\tfile\tYes\t—\tSame as above\tReference image to compare against\nface_match_score_decline_threshold\tinteger\tNo\t30\t0-100\tScores below this = Declined\nrotate_image\tboolean\tNo\tfalse\t—\tTry 0/90/180/270 degree rotations to find upright face\nsave_api_request\tboolean\tNo\ttrue\t—\tSave in Business Console Manual Checks\nvendor_data\tstring\tNo\t—\t—\tYour identifier for session tracking\nExample\nimport requests\n\nresponse = requests.post(\n    \"https://verification.didit.me/v3/face-match/\",\n    headers={\"x-api-key\": \"YOUR_API_KEY\"},\n    files={\n        \"user_image\": (\"selfie.jpg\", open(\"selfie.jpg\", \"rb\"), \"image/jpeg\"),\n        \"ref_image\": (\"id_photo.jpg\", open(\"id_photo.jpg\", \"rb\"), \"image/jpeg\"),\n    },\n    data={\"face_match_score_decline_threshold\": \"50\"},\n)\n\nconst formData = new FormData();\nformData.append(\"user_image\", selfieFile);\nformData.append(\"ref_image\", referenceFile);\nformData.append(\"face_match_score_decline_threshold\", \"50\");\n\nconst response = await fetch(\"https://verification.didit.me/v3/face-match/\", {\n  method: \"POST\",\n  headers: { \"x-api-key\": \"YOUR_API_KEY\" },\n  body: formData,\n});\n\nResponse (200 OK)\n{\n  \"request_id\": \"a1b2c3d4-...\",\n  \"face_match\": {\n    \"status\": \"Approved\",\n    \"score\": 80,\n    \"user_image\": {\n      \"entities\": [\n        {\"age\": 27.63, \"bbox\": [40, 40, 100, 100], \"confidence\": 0.717, \"gender\": \"male\"}\n      ],\n      \"best_angle\": 0\n    },\n    \"ref_image\": {\n      \"entities\": [\n        {\"age\": 22.16, \"bbox\": [156, 234, 679, 898], \"confidence\": 0.717, \"gender\": \"male\"}\n      ],\n      \"best_angle\": 0\n    },\n    \"warnings\": []\n  },\n  \"created_at\": \"2025-05-01T13:11:07.977806Z\"\n}\n\nStatus Values & Handling\nStatus\tMeaning\tAction\n\"Approved\"\tScore >= threshold\tFaces match — proceed\n\"Declined\"\tScore < threshold or no face\tCheck warnings for details. May need better image\n\"In Review\"\tNeeds manual review\tWait for review or retrieve via session API\nError Responses\nCode\tMeaning\tAction\n400\tInvalid request\tCheck file format, size, parameters\n401\tInvalid API key\tVerify x-api-key header\n403\tInsufficient credits\tTop up at business.didit.me\nResponse Field Reference\nField\tType\tDescription\nstatus\tstring\t\"Approved\", \"Declined\", \"In Review\"\nscore\tinteger\t0-100 similarity score (higher = more similar). null if no face found\nentities[].age\tfloat\tEstimated age\nentities[].bbox\tarray\tFace bounding box [x1, y1, x2, y2]\nentities[].confidence\tfloat\tFace detection confidence (0-1)\nentities[].gender\tstring\t\"male\" or \"female\"\nbest_angle\tinteger\tBest rotation angle for the face\nwarnings\tarray\t{risk, log_type, short_description, long_description}\nWarning Tags\nTag\tDescription\tAuto-Decline\nNO_REFERENCE_IMAGE\tReference or face image missing\tYes\nNO_FACE_DETECTED\tNo face detected in one or both images\tYes\nLOW_FACE_MATCH_SIMILARITY\tScore below threshold — potential identity mismatch\tConfigurable\n\nSecurity best practice: Only store the status and score. Minimize biometric image data on your servers. Image URLs (in workflow mode) expire after 60 minutes.\n\nScore Interpretation\nScore Range\tInterpretation\tAction\n90-100\tVery high confidence — same person\tAuto-approve\n70-89\tHigh confidence — likely same person\tApprove (default threshold 30)\n50-69\tModerate — possible match\tConsider manual review\n30-49\tLow — likely different people\tDeclined at default threshold\n0-29\tVery low — different people\tDeclined\nUtility Scripts\nexport DIDIT_API_KEY=\"your_api_key\"\n\npython scripts/match_faces.py selfie.jpg id_photo.jpg\npython scripts/match_faces.py selfie.jpg id_photo.jpg --threshold 50 --rotate"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/rosasalberto/didit-face-match",
    "publisherUrl": "https://clawhub.ai/rosasalberto/didit-face-match",
    "owner": "rosasalberto",
    "version": "1.3.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/didit-face-match",
    "downloadUrl": "https://openagent3.xyz/downloads/didit-face-match",
    "agentUrl": "https://openagent3.xyz/skills/didit-face-match/agent",
    "manifestUrl": "https://openagent3.xyz/skills/didit-face-match/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/didit-face-match/agent.md"
  }
}