Skip to content
SupportLogin
Generate a dataset from scratch

Generate a dataset from scratch

POST/api/v1/datasets/invent

Creates a dataset and starts generating it. Describe the data either by taxonomy — domains and/or subdomains — or in your own words with dataset_prompt: when neither taxonomy field is given, the domains and subdomains are inferred from the prompt. Explicit taxonomy is authoritative and disables that inference. If the prompt cannot be mapped onto the catalog (or inference is unavailable), the request is rejected with 400 asking for explicit domains/subdomains — it is never widened to every domain. Returns immediately — poll GET /datasets/{id} for the status and GET /datasets/{id}/download once it reports succeeded. Set estimate: true to price a request without generating anything.

Body ParametersJSONExpand Collapse
name: optional string

Display name for the invented dataset.

training_type: optional "instruction_dataset" or "preference_pairs"

Shape of the generated data — the same field and values as datasets.adapt. instruction_dataset produces prompt/completion rows; preference_pairs produces ranked completion pairs. Note this is the shape of the DATA, not the training method (elsewhere training_type means LoRA vs full fine-tuning). Defaults to instruction_dataset. The download carries the generated text in enhanced_prompt / enhanced_completion; original_* are null, since invented data has no source rows it was derived from.

One of the following:
"instruction_dataset"
"preference_pairs"
domains: optional array of string

Domain codes to generate from, e.g. medical. Optional: omit it and the domains come from the parents of your subdomains, or — when subdomains is omitted too — are inferred from dataset_prompt. When you do supply it, it is authoritative: inference is skipped, and a subdomain naming a domain that is not listed here is rejected rather than silently added. Retrieve the valid codes from GET /datasets/invent/domains.

subdomains: optional array of string

Narrow generation to specific subdomains, as domain.subdomain codes e.g. medical.symptoms_diagnosis. Qualified by their domain because a bare code can belong to more than one (wildlife sits under both agriculture and animal nature). Requested domains with no subdomain listed here are generated across all of theirs. Optional: with neither this nor domains, the taxonomy is inferred from dataset_prompt. Supplying it disables that inference. Retrieve the valid codes from GET /datasets/invent/domains.

rows: number

Number of rows to generate, subject to your plan’s per-launch row cap. Treat it as a target: the delivered count can land slightly either side of it, so read row_count on the finished dataset for what was actually produced.

minimum1
language_expansion: optional object { type, languages, pairs, sample_rate }

Optionally translate or localize the generated rows into further languages. Credits are billed on the POST-expansion row count, so setting this quotes and charges above rows. sample_rate (0-1) is the share of rows expanded.

type: "translate" or "localize"

Expansion mode. translate produces one new row variant per target language; localize produces one new row variant per country/language pair.

One of the following:
"translate"
"localize"
languages: optional array of string

Target language codes (required when type=translate, forbidden when type=localize). Mostly ISO 639-1 two-letter codes such as es, with three-letter codes where no two-letter code exists (fil, yue) and script-tagged codes for Chinese (zh-Hans, zh-Hant). Matching is case-insensitive, and bare zh resolves to zh-Hans. Validated against the supported language list at request time; unknown values return 400 with a sample of supported codes.

pairs: optional array of object { country, language }

Country/language pairs (required when type=localize, forbidden when type=translate). Each pair is validated against the supported country/language pair list at request time.

country: string

ISO 3166-1 alpha-2 country code.

language: string

Language code, as ISO 639-1 — optionally with a script subtag. Supported pairs include codes that are not two letters (zh-Hant for Taiwan, yue for Hong Kong), so the length is not pinned at two here. Membership is decided against the supported-pair list, which names an unsupported entry in its own 400.

sample_rate: number

Fraction (0.01–1) of input rows that are expanded per target. Output rows ≈ input × (1 + sample_rate × target_count). Required. Credits are billed on the expanded output row count.

minimum0.01
maximum1
dataset_prompt: optional string

Free-text description of the data you want, in your own words — the wizard shows this as “Dataset Details”. Drives the semantic search that selects rows, so a specific prompt yields more relevant data, and it is woven into the generation instructions. Written for you from your domain selections when omitted. When domains and subdomains are both omitted this is required, and the domains and subdomains are inferred from it; if none can be inferred the request is rejected with 400 asking for explicit domains/subdomains rather than generating across every domain.

maxLength10000
Deprecatedprompt: optional string

Deprecated alias for dataset_prompt, kept for existing clients. Use dataset_prompt in new code. prompt will be removed in a future release.

maxLength10000
estimate: optional boolean

Price the request without creating or charging anything. Mirrors datasets.adapt — the response carries the same fields either way, with the dataset fields null when this is set.

idempotency_key: optional string

Client-supplied key making retries safe. Repeating a request with the same key returns the original dataset instead of generating again.

maxLength255
ReturnsExpand Collapse
estimate: boolean

True when this response priced the request without running it.

id: string

Dataset id, or null on an estimate. Pass it straight to finetune_jobs.create or autoscientist.create once the status is succeeded.

name: string

Display name, echoed from the request or the default applied for you.

training_type: "instruction_dataset" or "preference_pairs"

Shape of the generated data, echoed from the request.

One of the following:
"instruction_dataset"
"preference_pairs"
domains: array of string

Domain codes the generation covers, echoed from the request — including any inferred from subdomains.

subdomains: array of string

Subdomain codes the generation is narrowed to, if any.

rows: number

Number of rows requested.

status: "pending" or "running" or "awaiting_input" or 2 more

Lifecycle status, or null on an estimate. A fresh generation is always running; poll GET /datasets/{dataset_id} until it reports succeeded or failed.

One of the following:
"pending"
"running"
"awaiting_input"
"succeeded"
"failed"
created_at: string

When the dataset was created, or null on an estimate.

formatdate-time
estimated_credits: number

Credits this generation consumes. Billed on the post-expansion row count, so a translated request quotes above its rows. Invent pricing is still provisional, so treat the figure as indicative.

available_credits: number

Credits currently available to your team.

Generate a dataset from scratch

curl https://api.prod.adaptionlabs.ai/api/v1/datasets/invent \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $ADAPTION_API_KEY" \
    -d '{
          "name": "Medical Q&A dataset",
          "domains": [
            "medical",
            "personal_finance"
          ],
          "subdomains": [
            "medical.symptoms_diagnosis",
            "medical.preventive_care"
          ],
          "rows": 1000,
          "dataset_prompt": "Patient-facing answers to cardiology questions, plain language, no jargon"
        }'
{
  "estimate": false,
  "id": "3f1b9c62-6f3e-4a1e-9a5c-0b7d2f8e4a10",
  "name": "Clinical Q&A",
  "training_type": "instruction_dataset",
  "domains": [
    "medical"
  ],
  "subdomains": [
    "medical.symptoms_diagnosis"
  ],
  "rows": 1000,
  "status": "running",
  "created_at": "2026-08-03T16:12:04.000Z",
  "estimated_credits": 800,
  "available_credits": 5000
}
Returns Examples
{
  "estimate": false,
  "id": "3f1b9c62-6f3e-4a1e-9a5c-0b7d2f8e4a10",
  "name": "Clinical Q&A",
  "training_type": "instruction_dataset",
  "domains": [
    "medical"
  ],
  "subdomains": [
    "medical.symptoms_diagnosis"
  ],
  "rows": 1000,
  "status": "running",
  "created_at": "2026-08-03T16:12:04.000Z",
  "estimated_credits": 800,
  "available_credits": 5000
}