Create 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.
bearerAuthorizationBearer <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.
idempotency-key?stringA 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.
1 <= length <= 255application/json- body
model*stringThe Base model: an id from GET /v1/models whose harvest is on (the API docs list them).
^[^\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.
1 <= items <= 4096layers?|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?integerPrompts in each shard file.
1 <= value <= 4096batch_size?|Kept in the manifest, as Production; the engine sizes its own batches.
1 <= value <= 64add_special_tokens?booleanAdd 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.
HarvestJob
application/json- response
job_id*string^([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})$uuidrun_id*string^([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})$uuidstatus*stringpending while it waits for the Runner, then running, then done, failed or cancelled.
"pending""running""done""failed""cancelled"model*stringn_prompts*integerHow many prompts it has.
reserved_tokens*integerThe 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*stringAn 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?stringWith result: when its links stop working, 7 days after this answer.
error?stringWhy it failed. Only on a failed job.
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" ]}'{ "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"}Cancel Completion Job POST
Cancel a queued or running job, and answer the job. A running job stops its Inference request. A job that ended stays as it is, and the answer is the same job.
Get Harvest GET
Return the harvest job and its status. A `done` job has its `result`: a link for its manifest, its stats and each shard, which works 7 days and needs no API key; each answer makes new links. With `wait`, wait up to that many seconds for its status to change. An API key may have 4 such waits at once; past that, the answer comes at once with `X-Acs-Longpoll: declined` and `Retry-After: 3`.