Skip to content
ACS Infra
Harvest

Create Harvest

POST
/v1/harvest

Queue a harvest job: the residual stream of a Base model at the chosen layers, for each token of up to 4,096 prompts, written as files that you download by the links in its result. It holds the prompts' tokens while it runs and is charged the tokens the engine read. Only this route takes a body of up to 50 MiB. Answers the job, pending.

Authorization

bearer
headerAuthorizationBearer <token>

An API key: Authorization: Bearer sk-acs-..., or a key of the old platform, acs-bm-.... A User makes and revokes keys in the App.

Header Parameters

idempotency-key?string

A key of your choice, 1 to 255 characters, such as a UUID. A retry with the same key and the same request does the work once: it gets the first answer, and is never charged twice. Kept 24 hours, one set for each User across all their API keys.

Length1 <= length <= 255

Request Body

application/json
  1. body
model*string

The Base model: an id from GET /v1/models whose harvest is on (the API docs list them).

Match^[^\u0000]*$
prompts*array<>

From 1 to 4,096 texts, and at most 2,000,000 tokens counted as characters divided by 4. Token ids are not taken. A prompt longer than the model's context keeps its first context length - 1 tokens.

Items1 <= items <= 4096
layers?|array<>

The layers to read: a list of up to 256 (in any order; each is read once), or "all". Left out: the quartiles, capabilities.n_layers / 4, / 2 and × 3 / 4 (8, 16 and 24 on llama-8b). Layer k is the residual stream after decoder block k; the last layer is before the final norm.

shard_size?integer

Prompts in each shard file.

Range1 <= value <= 4096
batch_size?|

Kept in the manifest, as Production; the engine sizes its own batches.

Range1 <= value <= 64
add_special_tokens?boolean

Add the model's start token to each prompt. Set false for text that already starts with one.

project_onto?|

Write the residual stream projected onto these directions, as float32, instead of the stream itself. The engine scales each direction to length 1.

Response Body

HarvestJob

application/json
  1. response
job_id*string
Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$
Formatuuid
run_id*string
Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$
Formatuuid
status*string

pending while it waits for the Runner, then running, then done, failed or cancelled.

Value in"pending""running""done""failed""cancelled"
model*string
n_prompts*integer

How many prompts it has.

reserved_tokens*integer

The tokens it holds against your budget while it runs: each prompt's UTF-8 bytes, and 1 more for its start token.

layers*array<integer>

The layers it reads, in ascending order.

tokens*|

The tokens it was charged: what the engine read when it is done, the reserved tokens when it was cancelled after its GPU run started, else 0. null until it ends.

created_at*string

An ISO 8601 time in UTC, such as 2026-11-03T09:30:00.123+00:00.

started_at*|

When its GPU run started. null until it starts.

completed_at*|

When it ended. null until it ends.

result?

The files of a done harvest job. Each link works 7 days and needs no API key. Each answer makes new links; the files are kept.

urls_expire_at?string

With result: when its links stop working, 7 days after this answer.

error?string

Why it failed. Only on a failed job.

Example Request
curl -X POST 'https://api.v2.infra.acsresearch.org/v1/harvest' \  -H 'Authorization: Bearer <API_KEY>' \  -H 'Content-Type: application/json' \  -d '{  "model": "string",  "prompts": [    "string"  ]}'
Example Response
{  "job_id": "453bd7d7-5355-4d6d-a38e-d9e7eb218c3f",  "run_id": "dded282c-8ebd-44cf-8ba5-9a234973d1ec",  "status": "pending",  "model": "string",  "n_prompts": 0,  "reserved_tokens": 0,  "layers": [    0  ],  "tokens": 0,  "created_at": "string",  "started_at": "string",  "completed_at": "string",  "result": {    "n_shards": 0,    "layer_indices": [      0    ],    "manifest_url": "string",    "shard_urls": [      "string"    ],    "stats_url": "string",    "contents": "activations",    "tokens": 0,    "bytes_written": 0,    "timings": {      "load_s": 0,      "forward_s": 0,      "save_s": 0,      "upload_s": 0    }  },  "urls_expire_at": "string",  "error": "string"}