# Imagen a texto

> Lee las letras y los dígitos de una imagen con YesCaptcha. ImageToTextTaskOcrBase e ImageToTextTaskMuggle devuelven el resultado de forma síncrona; ImageToTextTask e ImageToTextTaskM1 son asíncronos y admiten mayúsculas/minúsculas, solo dígitos, operaciones matemáticas y límites de longitud; hay modelos personalizados disponibles.

Source: https://docs.yescaptcha.com/es/tasks/image-to-text/ · Last verified: 2026-10-15

> This page was machine-translated from the Chinese version. If anything differs, the Chinese version prevails: https://docs.yescaptcha.com/zh/tasks/image-to-text/

Envía la imagen de un captcha de texto en Base64 y recibe las letras y los dígitos que contiene (`solution.text`). `ImageToTextTaskOcrBase` cuesta 2 puntos (≈ $0.30 / 1k) por imagen y es síncrono: una sola solicitud `createTask` devuelve el resultado. Si necesitas opciones como distinguir mayúsculas y minúsculas, solo dígitos u operaciones matemáticas, usa el `ImageToTextTask` asíncrono.

- POST `https://api.yescaptcha.com/createTask` (Endpoint global)
- POST `https://cn.yescaptcha.com/createTask` (Endpoint China)

El cuerpo de la solicitud es JSON y se autentica con tu `clientKey`.

## Tipos y precios

| Tipo de tarea | Precio | Modo | Notas |
| --- | --- | --- | --- |
| `ImageToTextTaskOcrBase` | $0.30 / 1k; 2 puntos/tarea · ¥2 / 1k | Síncrono |  |
| `ImageToTextTaskMuggle` | $0.30 / 1k; 2 puntos/tarea · ¥2 / 1k | Síncrono | No admite las opciones case/numeric; usa project\_name para elegir un modelo personalizado |
| `ImageToTextTask` | $0.60 / 1k; 4 puntos/tarea · ¥4 / 1k | Asíncrono |  |
| `ImageToTextTaskM1` | $2.25 / 1k; 15 puntos/tarea · ¥15 / 1k | Asíncrono |  |

Los precios en dólares son estimaciones con US$1 ≈ ¥6.67; las tareas se cobran en puntos.

| Necesitas | Usa |
| --- | --- |
| Captchas alfanuméricos normales, el más barato y rápido | `ImageToTextTaskOcrBase`, `ImageToTextTaskMuggle` (síncronos) |
| Un modelo entrenado para ti | `ImageToTextTaskMuggle` con `project_name` |
| Distinguir mayúsculas y minúsculas, solo dígitos, operaciones matemáticas, límites de longitud | `ImageToTextTask`, `ImageToTextTaskM1` (asíncronos) |

Cada tipo usa modelos y rutas distintos, así que el resultado con el mismo tipo de imagen puede variar; pruébalos y elige el mejor.

## Parámetros de la solicitud

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `type` | string | Sí | Tipo de tarea; consulta "Tipos de tarea y precios" en esta página |
| `body` | string | Sí | Imagen codificada en Base64, sin el prefijo `data:image/...;base64,` y sin saltos de línea |
| `project_name` | string | No | Nombre de un modelo personalizado, compatible solo con `ImageToTextTaskMuggle`. Omítelo para usar el modelo alfanumérico general. Contacta a Soporte para obtener un modelo personalizado (solo ImageToTextTaskMuggle) |
| `phrase` | boolean | No | true significa que la respuesta contiene al menos un espacio (solo ImageToTextTask, ImageToTextTaskM1) |
| `case` | boolean | No | true significa que la respuesta distingue entre mayúsculas y minúsculas (solo ImageToTextTask, ImageToTextTaskM1) |
| `numeric` | integer | No | 0 sin requisito; 1 solo dígitos; 2 sin dígitos (solo ImageToTextTask, ImageToTextTaskM1) |
| `math` | boolean | No | true significa que la imagen es una expresión matemática y la respuesta es su resultado (solo ImageToTextTask, ImageToTextTaskM1) |
| `minLength` | integer | No | Longitud mínima de la respuesta; 0 significa sin límite (solo ImageToTextTask, ImageToTextTaskM1) |
| `maxLength` | integer | No | Longitud máxima de la respuesta; 0 significa sin límite (solo ImageToTextTask, ImageToTextTaskM1) |

`body` es el Base64 del archivo de imagen. Las imágenes WebP se convierten automáticamente.

> **Precaución:** No incluyas el prefijo `data:image/...;base64,` ni saltos de línea en el Base64.

## Ejemplo de solicitud

POST https://api.yescaptcha.com/createTask

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "ImageToTextTaskOcrBase",
    "body": "BASE64_IMAGE"
  }
}
```

Código completo (lee `captcha.png` del directorio actual):

**curl**

```bash
# Replace BASE64_IMAGE with the Base64-encoded image
curl -s https://api.yescaptcha.com/createTask \
  -H 'Content-Type: application/json' \
  -d '{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "ImageToTextTaskOcrBase",
    "body": "BASE64_IMAGE"
  }
}'
```

**Python**

solve.py

```python
import os
import base64

import requests

API = "https://api.yescaptcha.com"
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]  # Read the clientKey from an environment variable

def call(method, payload):
    r = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30)
    data = r.json()
    if data.get("errorId"):
        raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
    return data

def solve(task):
    return call("createTask", {"task": task})["solution"]

# Base64-encode the image (no data: prefix)
with open("captcha.png", "rb") as f:
    image_b64 = base64.b64encode(f.read()).decode()

solution = solve({
    "type": "ImageToTextTaskOcrBase",
    "body": image_b64,
})
print(solution["text"])
```

**Node.js**

solve.mjs

```js
import { readFileSync } from 'node:fs';

const API = 'https://api.yescaptcha.com';
const CLIENT_KEY = process.env.YESCAPTCHA_CLIENT_KEY; // Read the clientKey from an environment variable

async function call(method, payload) {
  const res = await fetch(`${API}/${method}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ clientKey: CLIENT_KEY, ...payload }),
  });
  const data = await res.json();
  if (data.errorId) throw new Error(`${data.errorCode}: ${data.errorDescription}`);
  return data;
}

async function solve(task) {
  const { solution } = await call('createTask', { task });
  return solution;
}

// Base64-encode the image (no data: prefix)
const imageB64 = readFileSync('captcha.png').toString('base64');

const solution = await solve({
  type: "ImageToTextTaskOcrBase",
  body: imageB64,
});
console.log(solution.text);
```

Una tarea asíncrona con opciones:

POST https://api.yescaptcha.com/createTask

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "ImageToTextTask",
    "body": "BASE64_IMAGE",
    "case": true,
    "numeric": 0,
    "minLength": 4,
    "maxLength": 6
  }
}
```

## Resultado

Los tipos síncronos devuelven el resultado directamente en `createTask`:

```json
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "text": "LMResm"
  },
  "taskId": "2376919c-1863-11ec-a012-94e6f7355a0b"
}
```

Los tipos asíncronos (`ImageToTextTask`, `ImageToTextTaskM1`) devuelven primero un `taskId`; después consulta `getTaskResult` cada 5 segundos. Al terminar, `solution` tiene el mismo formato.

| Campo | Tipo | Descripción |
| --- | --- | --- |
| `text` | string | El texto reconocido |

## Modelos personalizados

El modelo general funciona con cualquier captcha alfanumérico, pero es algo menos preciso que un modelo entrenado para un estilo concreto. Si las imágenes que quieres reconocer siempre tienen el mismo estilo, [contacta con soporte](https://docs.yescaptcha.com/es/help/contact.md) para pedir un modelo personalizado y luego selecciónalo con `ImageToTextTaskMuggle` y `project_name`.

## Preguntas frecuentes

### ¿Se cobran puntos si el texto es incorrecto?

En los tipos síncronos se cobran puntos siempre que se devuelve un resultado, aunque sea incorrecto. Prueba otro tipo para comparar o pide un modelo personalizado.

### ¿Recibo `ERROR_ZERO_CAPTCHA_FILESIZE` o `ERROR_PARSE_IMAGE_FAIL`?

El Base64 de la imagen está incompleto o incluye el prefijo `data:` o saltos de línea. Revisa la codificación; consulta los [códigos de error](https://docs.yescaptcha.com/es/api/errors.md).

## Ejemplos relacionados

-   [Inicio rápido](https://docs.yescaptcha.com/es/getting-started/quickstart.md): tu primera solicitud con `ImageToTextTaskOcrBase`
-   [Ejemplos en Python](https://docs.yescaptcha.com/es/samples/python.md)
