curl --request POST \
--url https://flow.seekr.com/v1/flow/data-jobs \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"system_prompt": "<string>",
"instructions": "<string>",
"vector_database_id": "<string>"
}
'import requests
url = "https://flow.seekr.com/v1/flow/data-jobs"
payload = {
"name": "<string>",
"system_prompt": "<string>",
"instructions": "<string>",
"vector_database_id": "<string>"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
system_prompt: '<string>',
instructions: '<string>',
vector_database_id: '<string>'
})
};
fetch('https://flow.seekr.com/v1/flow/data-jobs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://flow.seekr.com/v1/flow/data-jobs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'system_prompt' => '<string>',
'instructions' => '<string>',
'vector_database_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://flow.seekr.com/v1/flow/data-jobs"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"instructions\": \"<string>\",\n \"vector_database_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://flow.seekr.com/v1/flow/data-jobs")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"instructions\": \"<string>\",\n \"vector_database_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://flow.seekr.com/v1/flow/data-jobs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"instructions\": \"<string>\",\n \"vector_database_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"user_id": "<string>",
"name": "<string>",
"job_type": "<string>",
"alignment_job_id": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"status": "file_processing",
"origin_data_job_id": "<string>",
"deleted": false,
"status_message": "<string>",
"system_prompt": "<string>",
"system_prompt_updated_at": "2023-11-07T05:31:56Z",
"instructions": "<string>",
"instructions_updated_at": "2023-11-07T05:31:56Z",
"resolved_instructions": "<string>",
"vector_database_id": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Submit data job
Create a new data job.
curl --request POST \
--url https://flow.seekr.com/v1/flow/data-jobs \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"system_prompt": "<string>",
"instructions": "<string>",
"vector_database_id": "<string>"
}
'import requests
url = "https://flow.seekr.com/v1/flow/data-jobs"
payload = {
"name": "<string>",
"system_prompt": "<string>",
"instructions": "<string>",
"vector_database_id": "<string>"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
system_prompt: '<string>',
instructions: '<string>',
vector_database_id: '<string>'
})
};
fetch('https://flow.seekr.com/v1/flow/data-jobs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://flow.seekr.com/v1/flow/data-jobs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'system_prompt' => '<string>',
'instructions' => '<string>',
'vector_database_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://flow.seekr.com/v1/flow/data-jobs"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"instructions\": \"<string>\",\n \"vector_database_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://flow.seekr.com/v1/flow/data-jobs")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"instructions\": \"<string>\",\n \"vector_database_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://flow.seekr.com/v1/flow/data-jobs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"system_prompt\": \"<string>\",\n \"instructions\": \"<string>\",\n \"vector_database_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"user_id": "<string>",
"name": "<string>",
"job_type": "<string>",
"alignment_job_id": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"status": "file_processing",
"origin_data_job_id": "<string>",
"deleted": false,
"status_message": "<string>",
"system_prompt": "<string>",
"system_prompt_updated_at": "2023-11-07T05:31:56Z",
"instructions": "<string>",
"instructions_updated_at": "2023-11-07T05:31:56Z",
"resolved_instructions": "<string>",
"vector_database_id": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}context_grounded_files and context_grounded_vector_db job types stop working on November 9, 2026. You can keep using them until then. For new projects, choose another fine-tuning method.job_type field determines the workflow:
principle_files— generates a QA pair dataset for instruction fine-tuningcontext_grounded_files— generates context-grounded training data from uploaded documentscontext_grounded_vector_db— generates context-grounded training data using an existing vector database
POST /v1/flow/data-jobs/{id}/add-files to attach uploaded file IDs after creation.
For the complete workflow, see Create instruction fine-tuning data or Create context-grounded fine-tuning data.Authorizations
Your Seekr API key, sent in the Authorization header with no 'Bearer' prefix.
Body
Name of the data job.
1 - 256Valid job types for data jobs.
principle_files, context_grounded_files, context_grounded_vector_db System prompt included with every conversation in the generated dataset. It becomes part of the training data the fine-tuned model learns from, unlike instructions, which only shapes how the dataset is generated. If omitted, one is generated for you from instructions and the source documents.
1 - 32768Natural-language description of the task the generated dataset should support. Alignment uses it to shape the examples it produces, such as the topics and the kinds of questions a fine-tuned model should be able to handle.
1 - 32768ID of the vector database the data job draws on.
Response
Resource created
Lightweight response for list view performance.
ID of the data job.
ID of the user who owns the data job.
Name of the data job.
Type of the data job, such as principle_files or context_grounded_files.
ID of the alignment job linked to the data job. null until one is linked.
Time the data job was created, in ISO 8601 format.
Time the data job was last updated, in ISO 8601 format.
Status values that exist BEFORE an alignment job is linked. Once linked, the real status comes from AlignmentJobStatus directly — see DataJobResponse.status's union type and derive_data_job_status.
file_processing, needs_review, ready_to_start ID of the data job this job was cloned from. null unless the job was created by cloning.
If true, the data job was deleted.
Human-readable description of the job's current state.
System prompt included with every conversation in the generated dataset.
Time system_prompt was last updated, in ISO 8601 format.
Natural-language description of the task the generated dataset should support.
Time instructions was last updated, in ISO 8601 format.
ID of the vector database the data job draws on.