Skip to content

Lemin Cropped CAPTCHA

Return both pieces of the cropped-puzzle answer. Find the cropped-puzzle CAPTCHA ID in the widget initialization. The completed answer remains tied to its returned challenge_id.

POST /createTask · example
{
  "clientKey": "capzy_YOUR_API_KEY",
  "task": {
    "type": "LeminTaskProxyLess",
    "websiteURL": "https://example.com/login",
    "captchaId": "CROPPED_313061f_ea6d320788434680aa852441fbe30963"
  }
}

Illustrative values. Replace the inputs with values from your current integration.

Page URL + captchaIdProxyless or your own proxyanswer + challenge_id

Find the Lemin CAPTCHA ID.

Find the cropped-puzzle CAPTCHA ID in the widget initialization. The completed answer remains tied to its returned challenge_id.

Your API key authenticates Capzy.
Provider keys, challenge IDs, images, and session values belong inside task.

Read the configured captchaId.

  1. In Network/Sources, locate the Lemin widget script and its initialization for the current form.
  2. Copy the complete configured cropped-puzzle ID into captchaId, including its prefix and suffix.
  3. Copy the form's full URL into websiteURL. If you own the widget, compare its ID with your configured CAPTCHA.
Input collection example - replace illustrative values
{
  "websiteURL": "https://example.com/login",
  "captchaId": "YOUR_COMPLETE_CROPPED_PUZZLE_ID"
}

captchaId identifies the puzzle integration. challenge_id is produced by the solve and belongs to its returned answer.

How Lemin Cropped CAPTCHA works

Lemin Cropped Captcha (leminnow.com) presents a jigsaw-style slider puzzle. A piece is cropped from an image and placed on a slider rail — the user must drag it to the correct position to complete the picture. Used on e-commerce, gaming, and financial sites. The captcha produces a lemin_answer + lemin_challenge_id pair that the site validates server-side.

Capzy's proprietary solver returns the Lemin solution payload (answer + challenge_id) ready for direct submission. Designed for authorized testing and automation.

  • Solves the slider puzzle reliably
  • High-quality solves
  • Works on all Lemin cropped puzzle variants
  • Average solve time ~8-12 seconds

Know what goes in.

Choose a field to see its purpose, where to get it, and its place in the request. Optional values omitted from the example can be added when your flow uses them.

The request below follows your selected task configuration.

Request authentication

Required task inputs

websiteURL

stringRequired

The page URL where the Lemin captcha is loaded

Where it comes from

Copy the full page URL from the address bar or the document request in Network, including the path where this flow runs.

Open the input guide
Example valuehttps://example.com/login
POST /createTask · selected configuration
{
  "clientKey": "capzy_YOUR_API_KEY",
  "task": {
    "type": "LeminTaskProxyLess",
    "websiteURL": "https://example.com/login",
    "captchaId": "CROPPED_313061f_ea6d320788434680aa852441fbe30963"
  }
}

The selected field is highlighted when present. Preserve the declared value type and current challenge context.

Make your first request.

Create the task, keep its taskId, and poll until status is ready. Then read the selected variant's solution.

More examples
  1. Create the task

    Send clientKey and the selected task to /createTask from your server. Keep the returned taskId.

  2. Wait for the solution

    Send that same key and ID to /getTaskResult. While processing, wait two seconds before checking again. Stop on Ready or an error.

  3. Apply the result

    Forward solution.answer and solution.challenge_id together to the puzzle's existing verification flow. Preserve the underscore in challenge_id and the session associated with that answer.

solve_lemin.py
import json, os, time
import requests

API = "https://api.capzy.ai"
KEY = os.environ["CAPZY_API_KEY"]
task = json.loads("{\"type\":\"LeminTaskProxyLess\",\"websiteURL\":\"https://example.com/login\",\"captchaId\":\"CROPPED_313061f_ea6d320788434680aa852441fbe30963\"}")

def call(path, payload):
    response = requests.post(f"{API}/{path}", json={"clientKey": KEY, **payload}, timeout=30)
    response.raise_for_status()
    data = response.json()
    if data.get("errorId", 0) or data.get("status") == "failed":
        raise RuntimeError(data.get("errorDescription") or data.get("errorCode") or "Task failed")
    return data

created = call("createTask", {"task": task})
for attempt in range(60):
    result = call("getTaskResult", {"taskId": created["taskId"]})
    if result.get("status") == "ready":
        solution = result["solution"]
        print(solution)
        break
    time.sleep(2)
else:
    raise TimeoutError("Task is still processing; keep the taskId to check it later.")

Before runningReplace all illustrative inputs with your captured values. Set CAPZY_API_KEY in your environment. Install requests with pip install requests.

Polling and failuresThe example checks HTTP/API failures, uses 30-second request timeouts, and stops after 60 result checks. Retain taskId if your task is still processing.

Understand what comes back.

Follow this task from creation to completion. Response fields and usage follow your selected request variant.

answer + challenge_id

Forward solution.answer and solution.challenge_id together to the puzzle's existing verification flow. Preserve the underscore in challenge_id and the session associated with that answer.

string
The lemin_answer value to submit in the form
string
The lemin_challenge_id value to submit in the form
POST /getTaskResult · example response
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "answer": "<lemin_answer hex value>",
    "challenge_id": "<lemin_challenge_id GUID>"
  }
}

Illustrative values. Additional metadata may be returned; only Ready contains a completed solution.

Submit the answer

Forward solution.answer and solution.challenge_id together to the puzzle's existing verification flow. Preserve the underscore in challenge_id and the session associated with that answer.

Execution context result is the parsed Ready response from the polling example. session, when referenced, is your existing requests.Session (or browser-compatible session) with the original cookie jar, headers, and solving proxy configured in session.proxies for both http and https. Keep this client for the complete flow. task is the task object you submitted. For Shape, action_body is the original protected request body as bytes or a string, with its original Content-Type in session.headers. Install curl_cffi when the fragment imports it; match the target's required browser/TLS identity.

Use the result · Python

# Step 3 — Lemin: submit answer + challenge_id to the site's form
sol = result["solution"]
requests.post("https://target.example.com/submit", data={
    "lemin_answer":       sol["answer"],
    "lemin_challenge_id": sol["challenge_id"],
})

When something doesn't work.

Check your captured values, the selected variant, and the response before starting another task.

Where do I find the captchaId?

Look for the data-captcha-id attribute on the #lemin-cropped-captcha div, or extract it from the script URL: https://api.leminnow.com/captcha/v1/cropped/{CAPTCHA_ID}/js

Does this support non-cropped Lemin types?

Currently we support the cropped (slider) variant only, which is by far the most common deployment.

Connect Lemin Cropped CAPTCHA to your workflow.

Get your Capzy API key and use this guide's integration.

$1.00Per 1,000 solves
7.0sAverage solve time

LeminTaskProxyLess · Live configuration