Compara los tres endpoints
Cuál usar
- Hasta 500 tareas y tú gestionas los reintentos:
POST /v1/async/task/batch. Recibes todos los ids de tarea en la respuesta. - Más tareas que la concurrencia de tu plan, o un trabajo diario de miles:
POST /v1/batches. El servidor guarda los elementos y los va enviando según lo permitan el límite de tu plan y la cola de cada motor, así que no tienes que reintentar los429ni los503tú mismo. - Un mismo prompt preguntado desde muchos puntos alrededor de un lugar:
POST /v1/async/task/grid.
POST /v1/async/task/batch
Envía un array de hasta 500 solicitudes de tarea (referencia). Se pueden mezclar motores.
200. results[i].index coincide con la posición en tu array, y cada resultado tiene task o error:
Un
idempotencyKey repetido devuelve la tarea existente como éxito. Consulta Idempotencia.
POST /v1/batches
Envía hasta 10.000 elementos (referencia). Cada elemento acepta los campos de tarea taskType, payload, priority e idempotencyKey, más un customId opcional (hasta 128 caracteres) que se devuelve en los resultados. Indica webhook.url en el lote, no en los elementos.
202 con el lote. Los primeros elementos ya están enviados:
Reglas del sobre
Validación de todo o nada
Cada elemento pasa las mismas comprobaciones que una tarea individual antes de guardar nada: campos, alcance de la clave, motores privados, endpoints dedicados, región ypayload.location. Si algún elemento falla, la respuesta es 400 VALIDATION_ERROR, no se guarda nada y details enumera hasta 50 elementos con fallos:
Cómo se ejecutan los elementos
El lote libera elementos como tareas cuando el límite de tu plan y la cola del motor tienen hueco. Las cuentas se turnan, así que un lote grande no retrasa uno pequeño de otra cuenta. Cada elemento liberado pasa por la misma admisión que una tarea individual: crea una retención de créditos y cuenta para el límite diario de créditos de la clave. Cuando se rechaza un elemento, el código decide qué ocurre:
El lote pasa a
COMPLETED cuando no queda ningún elemento pendiente y todas las tareas han terminado. Con webhook.url, el servidor publica entonces el evento batch.completed.
Lee el progreso y los resultados
GET /v1/batches/{id} devuelve el lote con counts por estado de elemento: pending, queued, processing, completed, failed, rejected. Sondearlo también hace avanzar los elementos pendientes.
GET /v1/batches/{id}/items enumera los elementos en orden de envío:
REJECTED lleva error: { code, message }. Los cuerpos de resultado solo se incluyen dentro de la ventana de sondeo de 24 horas de Tareas asíncronas. Consulta también Obtener un lote y Listar los elementos de un lote.
POST /v1/async/task/grid
Haz un mismo prompt desde cada punto de una cuadrícula cuadrada alrededor de un centro (referencia). Cada punto se convierte en una tarea con ese punto como payload.location, así que el motor debe aceptar una ubicación: CHATGPT, GEMINI, GOOGLE, AIMODE o GOOGLE_SERP. No envíes payload.location tú mismo.
La fila 0 es el borde norte y la columna 0 el borde oeste. La respuesta devuelve
grid (con id y spacingMeters), un summary y points en orden de filas, cada uno con row, col, location y task o error.
El punto central se admite primero, solo. Si se rechaza (por ejemplo, 422 LOCATION_UNSUPPORTED, 403 KEY_SCOPE_DENIED, 402 INSUFFICIENT_CREDITS o un plan lleno), ese error es la respuesta para toda la cuadrícula y no se crea ninguna tarea. Los puntos posteriores al centro que se rechazan por capacidad fallan en su sitio con success: false.
Vuelve a leer una cuadrícula con GET /v1/async/task/grid/{id}. Añade ?include=response para obtener los resultados de las tareas terminadas. Los puntos que nunca se admitieron no aparecen, y el id de cuadrícula de otra cuenta devuelve 404. Reenviar la misma cuadrícula con el mismo id admite solo los puntos que faltan; consulta Idempotencia.
Siguientes pasos
Idempotencia
Cómo trata cada endpoint una clave repetida.
Créditos y límites
Concurrencia del plan y ritmo de envío.