API reference
Artifacts
Stored job results: list them by workflow port, inspect a manifest, upload inputs, download a whole zip or one record (?record=), and delete.
On this page
List your artifacts
GET/api/v1/artifacts
API key or token
One item per chainable manifest port.
Default never exposes job-row port=archive as a selectable bind port. Pass include_archive=true for /workflows/storage so users can download the job zip. Expired artifacts are omitted. Metadata-only. Search, source, sort and total apply across all pages.
Parameters
| Name | Type | Description |
|---|---|---|
limit | integer | Limits: |
offset | integer | Limits: |
data_kind | string | |
data_format | string | |
run_id | string | |
include_archive | boolean | When true, also list zip Default: |
q | string | Words to match, all of them, against the artifact id, upload name, job or run name, tool, and output ports. Limits: |
source | string |
One of: |
sort | string |
Default: |
Example request
curl "https://api.cognichem.com/api/v1/artifacts" \
-H "X-Api-Key: $COGNICHEM_API_KEY"from cognichem_client import CogniChem
client = CogniChem.from_env()
result = client.artifacts.list()
print(result)Python SDK pip install cognichem-client (1.1 or later). from_env() reads COGNICHEM_API_KEY.
Responses
Successful Response · application/json · ArtifactListResponse
| Field | Type | Description |
|---|---|---|
has_more | boolean | Default: |
items[]required | ArtifactListItem[] | |
items.artifact_idrequired | string | |
items.created_at | string | null | |
items.data_formatrequired | string | |
items.data_kindrequired | string | |
items.expires_at | string | null | |
items.is_virtual | boolean | Default: |
items.job_id | string | null | |
items.job_name | string | null | |
items.job_type | string | null | |
items.name | string | null | |
items.portrequired | string | |
items.record_count | integer | Default: |
items.run_id | string | null | |
items.run_name | string | null | |
items.size_bytes | integer | Default: |
items.step_id | string | null | |
next_offset | integer | null | |
total | integer | null |
Errors are RFC 7807 problem details (application/problem+json) with status, title, detail, request_id, and a retryability hint (validation, auth, quota, conflict, upstream, timeout, or terminal). Handling errors
| Status | When |
|---|---|
400 | Invalid input or business rule violation. |
401 | Missing or invalid credentials. |
402 | Wallet cannot cover the Assistant turn hold. |
403 | Authenticated but not allowed to access the resource. |
404 | Resource not found or not owned by the user. |
409 | Conflict (e.g. idempotency key reuse with a different body). |
413 | Request body or workflow spec exceeds size caps. |
422 | Request body or query failed validation. |
429 | Rate limit exceeded. |
500 | Unexpected server error. |
503 | Dependency temporarily unavailable. |
Upload a CogniChem-compatible library artifact
POST/api/v1/artifacts
API key or token
Register a durable library artifact from an upload.
cognichem_zip: validated result.zip with chainable manifest ports. raw_file: server packages an allowlisted PDB/SDF/SMILES file, mechanism, CSV compound table (table/csv), or PNG / JPEG figure (image/png or image/jpeg; at most 10 MB and 25 megapixels, metadata stripped).
Call GET /artifacts/usage as a preflight. Oversized bodies are rejected via Content-Length before the file is read into memory.
Parameters
| Name | Type | Description |
|---|---|---|
Idempotency-Key | string | A unique key (a UUID) for this request. Retrying with the same key and body returns the first result instead of repeating the work; the same key with a different body is a 409. |
Request body
multipart/form-data
| Field | Type | Description |
|---|---|---|
data_format | string | null | Required for |
data_kind | string | null | Required for |
filerequired | string | CogniChem zip or raw allowlisted file |
moderequired | string |
|
Example request
curl -X POST "https://api.cognichem.com/api/v1/artifacts" \
-H "X-Api-Key: $COGNICHEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-F "[email protected]" \
-F 'mode=MODE'from cognichem_client import CogniChem
client = CogniChem.from_env()
result = client.artifacts.upload("file.zip")
print(result)Python SDK pip install cognichem-client (1.1 or later). from_env() reads COGNICHEM_API_KEY. The SDK sends an Idempotency-Key; pass idempotency_key= to reuse one when you retry.
Responses
Successful Response · application/json · ArtifactResponse
| Field | Type | Description |
|---|---|---|
content_type | string | Default: |
created_at | string | null | |
derived_from | string | null | |
expires_at | string | null | |
idrequired | string | |
is_virtual | boolean | Default: |
job_id | string | null | |
job_name | string | null | |
job_type | string | null | |
manifest | object | |
name | string | null | |
ports[] | ArtifactPortSummary[] | |
ports.data_formatrequired | string | |
ports.data_kindrequired | string | |
ports.portrequired | string | |
ports.record_count | integer | Default: |
run_id | string | null | |
run_name | string | null | |
size_bytes | integer | Default: |
step_id | string | null |
{
"content_type": "application/zip",
"created_at": "2026-07-31T12:00:00+00:00",
"expires_at": "2026-08-30T12:00:00+00:00",
"id": "art-01JTESTEXAMPLE0000000000",
"job_id": "job-abc123",
"manifest": {
"job_type": "autodockvina",
"manifest_version": 1,
"ports": {
"archive": {
"format": "zip",
"kind": "archive",
"record_count": 1,
"records": [
{
"files": {
"primary": "."
},
"id": "all"
}
]
},
"poses": {
"format": "pdbqt",
"kind": "docking_poses",
"record_count": 1,
"records": [
{
"files": {
"primary": "pocket-1/lig-0007_out.pdbqt"
},
"id": "lig-0007",
"metrics": {
"binding_affinity_kcal_mol": -9.4
}
}
]
}
},
"warnings": []
},
"size_bytes": 4096
}Errors are RFC 7807 problem details (application/problem+json) with status, title, detail, request_id, and a retryability hint (validation, auth, quota, conflict, upstream, timeout, or terminal). Handling errors
| Status | When |
|---|---|
400 | Missing fields or unsupported mode |
401 | Missing or invalid credentials. |
402 | Wallet cannot cover the Assistant turn hold. |
403 | Authenticated but not allowed to access the resource. |
404 | Resource not found or not owned by the user. |
409 | Conflict (e.g. idempotency key reuse with a different body). |
413 | File/zip exceeds size cap or storage quota |
422 | Invalid zip/manifest or unsupported raw kind/format |
429 | Rate limit exceeded. |
500 | Unexpected server error. |
503 | Dependency temporarily unavailable. |
Get artifact storage usage
GET/api/v1/artifacts/usage
API key or token
Return used_bytes, quota_bytes, artifact_count and tier.
Also by_source (bytes and count per run / job / upload), ttl_days for the caller's tier and the upload / download limits.
Example request
curl "https://api.cognichem.com/api/v1/artifacts/usage" \
-H "X-Api-Key: $COGNICHEM_API_KEY"from cognichem_client import CogniChem
client = CogniChem.from_env()
result = client.artifacts.usage()
print(result)Python SDK pip install cognichem-client (1.1 or later). from_env() reads COGNICHEM_API_KEY.
Responses
Successful Response · application/json · ArtifactUsageResponse
| Field | Type | Description |
|---|---|---|
artifact_countrequired | integer | |
by_source | ArtifactUsageBySource | null | |
by_source.job | ArtifactSourceUsage | Bytes and artifact count from one source. |
by_source.job.bytes | integer | Default: |
by_source.job.count | integer | Default: |
by_source.run | ArtifactSourceUsage | Bytes and artifact count from one source. |
by_source.run.bytes | integer | Default: |
by_source.run.count | integer | Default: |
by_source.upload | ArtifactSourceUsage | Bytes and artifact count from one source. |
by_source.upload.bytes | integer | Default: |
by_source.upload.count | integer | Default: |
limits | ArtifactLimits | null | |
limits.download_max_bytesrequired | integer | |
limits.image_upload_max_bytesrequired | integer | |
limits.link_max_bytes | integer | null | |
limits.raw_upload_max_bytesrequired | integer | |
limits.zip_upload_max_bytesrequired | integer | |
quota_bytesrequired | integer | |
tierrequired | integer | |
ttl_days | integer | null | |
used_bytesrequired | integer |
Errors are RFC 7807 problem details (application/problem+json) with status, title, detail, request_id, and a retryability hint (validation, auth, quota, conflict, upstream, timeout, or terminal). Handling errors
| Status | When |
|---|---|
400 | Invalid input or business rule violation. |
401 | Missing or invalid credentials. |
402 | Wallet cannot cover the Assistant turn hold. |
403 | Authenticated but not allowed to access the resource. |
404 | Resource not found or not owned by the user. |
409 | Conflict (e.g. idempotency key reuse with a different body). |
413 | Request body or workflow spec exceeds size caps. |
422 | Request body or query failed validation. |
429 | Rate limit exceeded. |
500 | Unexpected server error. |
503 | Dependency temporarily unavailable. |
What deleting artifacts would touch
GET/api/v1/artifacts/impact
API key or token
Per artifact: derived artifacts deleted with it, jobs whose result it is, saved models trained from it, and active runs that produced or reference it. Advisory only; deletes are never blocked.
Parameters
| Name | Type | Description |
|---|---|---|
idsrequired | string[] | Artifact ids (at most 50). Ids you don't own are left out. Limits: |
Example request
curl "https://api.cognichem.com/api/v1/artifacts/impact?ids=IDS" \
-H "X-Api-Key: $COGNICHEM_API_KEY"import os
import httpx
response = httpx.get(
"https://api.cognichem.com/api/v1/artifacts/impact",
params={"ids": "IDS"},
headers={"X-Api-Key": os.environ["COGNICHEM_API_KEY"]},
)
response.raise_for_status()
print(response.json())Uses httpx; the Python SDK has no method for this endpoint.
Responses
Successful Response · application/json · ArtifactImpactResponse
| Field | Type | Description |
|---|---|---|
items[]required | ArtifactImpact[] | |
items.artifact_idrequired | string | |
items.derived[] | string[] | |
items.jobs[] | ArtifactImpactJob[] | |
items.jobs.artifact_id | string | null | |
items.jobs.idrequired | string | |
items.jobs.job_name | string | null | |
items.jobs.job_type | string | null | |
items.models[] | ArtifactImpactModel[] | |
items.models.idrequired | string | |
items.models.model_type | string | null | |
items.models.name | string | null | |
items.runs[] | ArtifactImpactRun[] | |
items.runs.idrequired | string | |
items.runs.run_name | string | null | |
items.runs.status | string | null |
Errors are RFC 7807 problem details (application/problem+json) with status, title, detail, request_id, and a retryability hint (validation, auth, quota, conflict, upstream, timeout, or terminal). Handling errors
| Status | When |
|---|---|
400 | Invalid input or business rule violation. |
401 | Missing or invalid credentials. |
402 | Wallet cannot cover the Assistant turn hold. |
403 | Authenticated but not allowed to access the resource. |
404 | Resource not found or not owned by the user. |
409 | Conflict (e.g. idempotency key reuse with a different body). |
413 | Request body or workflow spec exceeds size caps. |
422 | Request body or query failed validation. |
429 | Rate limit exceeded. |
500 | Unexpected server error. |
503 | Dependency temporarily unavailable. |
Delete several artifacts
POST/api/v1/artifacts/bulk-delete
API key or token
Delete up to 50 artifacts, each with its derived artifacts.
Reports every id as deleted, not_found or failed; one failure doesn't stop the rest. deleted also lists derived artifacts removed with them. Send an Idempotency-Key to make a retry safe.
Parameters
| Name | Type | Description |
|---|---|---|
Idempotency-Key | string | A unique key (a UUID) for this request. Retrying with the same key and body returns the first result instead of repeating the work; the same key with a different body is a 409. |
Request body
application/json · BulkDeleteArtifactsRequest
| Field | Type | Description |
|---|---|---|
artifact_ids[]required | string[] | Limits: |
Example request
curl -X POST "https://api.cognichem.com/api/v1/artifacts/bulk-delete" \
-H "X-Api-Key: $COGNICHEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"artifact_ids": [
"ARTIFACT_IDS"
]
}'import os
import uuid
import httpx
response = httpx.post(
"https://api.cognichem.com/api/v1/artifacts/bulk-delete",
headers={"X-Api-Key": os.environ["COGNICHEM_API_KEY"], "Idempotency-Key": str(uuid.uuid4())},
json={"artifact_ids": ["ARTIFACT_IDS"]},
)
response.raise_for_status()
print(response.json())Uses httpx; the Python SDK has no method for this endpoint.
Responses
Successful Response · application/json · BulkDeleteArtifactsResponse
| Field | Type | Description |
|---|---|---|
deleted[] | string[] | |
failed[] | BulkDeleteFailure[] | |
failed.artifact_idrequired | string | |
failed.detailrequired | string | |
not_found[] | string[] |
Errors are RFC 7807 problem details (application/problem+json) with status, title, detail, request_id, and a retryability hint (validation, auth, quota, conflict, upstream, timeout, or terminal). Handling errors
| Status | When |
|---|---|
400 | Invalid input or business rule violation. |
401 | Missing or invalid credentials. |
402 | Wallet cannot cover the Assistant turn hold. |
403 | Authenticated but not allowed to access the resource. |
404 | Resource not found or not owned by the user. |
409 | Conflict (e.g. idempotency key reuse with a different body). |
413 | Request body or workflow spec exceeds size caps. |
422 | Request body or query failed validation. |
429 | Rate limit exceeded. |
500 | Unexpected server error. |
503 | Dependency temporarily unavailable. |
Get an artifact
GET/api/v1/artifacts/{artifact_id}
API key or token
Return metadata and manifest summary for an owned artifact.
Parameters
| Name | Type | Description |
|---|---|---|
artifact_idrequired | string |
Example request
curl "https://api.cognichem.com/api/v1/artifacts/ARTIFACT_ID" \
-H "X-Api-Key: $COGNICHEM_API_KEY"from cognichem_client import CogniChem
client = CogniChem.from_env()
result = client.artifacts.get("ARTIFACT_ID")
print(result)Python SDK pip install cognichem-client (1.1 or later). from_env() reads COGNICHEM_API_KEY.
Responses
Successful Response · application/json · ArtifactResponse
| Field | Type | Description |
|---|---|---|
content_type | string | Default: |
created_at | string | null | |
derived_from | string | null | |
expires_at | string | null | |
idrequired | string | |
is_virtual | boolean | Default: |
job_id | string | null | |
job_name | string | null | |
job_type | string | null | |
manifest | object | |
name | string | null | |
ports[] | ArtifactPortSummary[] | |
ports.data_formatrequired | string | |
ports.data_kindrequired | string | |
ports.portrequired | string | |
ports.record_count | integer | Default: |
run_id | string | null | |
run_name | string | null | |
size_bytes | integer | Default: |
step_id | string | null |
{
"content_type": "application/zip",
"created_at": "2026-07-31T12:00:00+00:00",
"expires_at": "2026-08-30T12:00:00+00:00",
"id": "art-01JTESTEXAMPLE0000000000",
"job_id": "job-abc123",
"manifest": {
"job_type": "autodockvina",
"manifest_version": 1,
"ports": {
"archive": {
"format": "zip",
"kind": "archive",
"record_count": 1,
"records": [
{
"files": {
"primary": "."
},
"id": "all"
}
]
},
"poses": {
"format": "pdbqt",
"kind": "docking_poses",
"record_count": 1,
"records": [
{
"files": {
"primary": "pocket-1/lig-0007_out.pdbqt"
},
"id": "lig-0007",
"metrics": {
"binding_affinity_kcal_mol": -9.4
}
}
]
}
},
"warnings": []
},
"size_bytes": 4096
}Errors are RFC 7807 problem details (application/problem+json) with status, title, detail, request_id, and a retryability hint (validation, auth, quota, conflict, upstream, timeout, or terminal). Handling errors
| Status | When |
|---|---|
400 | Invalid input or business rule violation. |
401 | Missing or invalid credentials. |
402 | Wallet cannot cover the Assistant turn hold. |
403 | Authenticated but not allowed to access the resource. |
404 | Resource not found or not owned by the user. |
409 | Conflict (e.g. idempotency key reuse with a different body). |
413 | Request body or workflow spec exceeds size caps. |
422 | Request body or query failed validation. |
429 | Rate limit exceeded. |
500 | Unexpected server error. |
503 | Dependency temporarily unavailable. |
Delete an artifact
DELETE/api/v1/artifacts/{artifact_id}
API key or token
Delete an owned artifact, its volume bytes, and its derived artifacts.
Jobs whose result was deleted lose their result link; see GET /artifacts/impact first.
Parameters
| Name | Type | Description |
|---|---|---|
artifact_idrequired | string |
Example request
curl -X DELETE "https://api.cognichem.com/api/v1/artifacts/ARTIFACT_ID" \
-H "X-Api-Key: $COGNICHEM_API_KEY"from cognichem_client import CogniChem
client = CogniChem.from_env()
result = client.artifacts.delete("ARTIFACT_ID")
print(result)Python SDK pip install cognichem-client (1.1 or later). from_env() reads COGNICHEM_API_KEY.
Responses
Successful Response · application/json · MessageResponse
| Field | Type | Description |
|---|---|---|
messagerequired | string | The message content. |
Errors are RFC 7807 problem details (application/problem+json) with status, title, detail, request_id, and a retryability hint (validation, auth, quota, conflict, upstream, timeout, or terminal). Handling errors
| Status | When |
|---|---|
400 | Invalid input or business rule violation. |
401 | Missing or invalid credentials. |
402 | Wallet cannot cover the Assistant turn hold. |
403 | Authenticated but not allowed to access the resource. |
404 | Resource not found or not owned by the user. |
409 | Conflict (e.g. idempotency key reuse with a different body). |
413 | Request body or workflow spec exceeds size caps. |
422 | Request body or query failed validation. |
429 | Rate limit exceeded. |
500 | Unexpected server error. |
503 | Dependency temporarily unavailable. |
Download artifact zip or one record member
GET/api/v1/artifacts/{artifact_id}/download
API key or token
Stream result.zip or a single record member.
Without record: whole-zip (virtual artifacts → 409). With record: volume-side member extract; virtual hops to parent.
Parameters
| Name | Type | Description |
|---|---|---|
artifact_idrequired | string |
| Name | Type | Description |
|---|---|---|
record | string | When set, stream one manifest record member via volume-side extract. Omit for whole |
port | string | Optional port scope when record id is ambiguous. |
Example request
curl "https://api.cognichem.com/api/v1/artifacts/ARTIFACT_ID/download" \
-H "X-Api-Key: $COGNICHEM_API_KEY"from cognichem_client import CogniChem
client = CogniChem.from_env()
result = client.artifacts.download("ARTIFACT_ID", save_path=".")
print(result)Python SDK pip install cognichem-client (1.1 or later). from_env() reads COGNICHEM_API_KEY.
Responses
Successful Response · application/json
Response fields: any
Errors are RFC 7807 problem details (application/problem+json) with status, title, detail, request_id, and a retryability hint (validation, auth, quota, conflict, upstream, timeout, or terminal). Handling errors
| Status | When |
|---|---|
400 | Invalid input or business rule violation. |
401 | Missing or invalid credentials. |
402 | Wallet cannot cover the Assistant turn hold. |
403 | Authenticated but not allowed to access the resource. |
404 | Artifact missing/not owned, or with |
409 | Virtual whole-zip (no |
410 | Virtual |
413 | Whole zip or record member exceeds download size cap. |
422 | Request body or query failed validation. |
429 | Rate limit exceeded. |
500 | Unexpected server error. |
503 | Dependency temporarily unavailable. |
Get a link that downloads the whole zip
POST/api/v1/artifacts/{artifact_id}/download-link
API key or token
Sign a link that streams the artifact's whole result.zip, at sizes above the direct download's limit.
Open the url before expires_at (a few minutes); the browser saves the file as it arrives. The link names this one artifact only.
Parameters
| Name | Type | Description |
|---|---|---|
artifact_idrequired | string |
Example request
curl -X POST "https://api.cognichem.com/api/v1/artifacts/ARTIFACT_ID/download-link" \
-H "X-Api-Key: $COGNICHEM_API_KEY"import os
import httpx
response = httpx.post(
"https://api.cognichem.com/api/v1/artifacts/ARTIFACT_ID/download-link",
headers={"X-Api-Key": os.environ["COGNICHEM_API_KEY"]},
)
response.raise_for_status()
print(response.json())Uses httpx; the Python SDK has no method for this endpoint.
Responses
Successful Response · application/json · ArtifactDownloadLinkResponse
| Field | Type | Description |
|---|---|---|
expires_atrequired | string | |
filenamerequired | string | |
size_bytesrequired | integer | |
urlrequired | string | Open within a few minutes; it downloads the zip. |
Errors are RFC 7807 problem details (application/problem+json) with status, title, detail, request_id, and a retryability hint (validation, auth, quota, conflict, upstream, timeout, or terminal). Handling errors
| Status | When |
|---|---|
400 | Invalid input or business rule violation. |
401 | Missing or invalid credentials. |
402 | Wallet cannot cover the Assistant turn hold. |
403 | Authenticated but not allowed to access the resource. |
404 | Artifact missing, expired, or not yours. |
409 | Virtual artifact: it has no zip; download records. |
413 | Zip exceeds the download link size limit. |
422 | Request body or query failed validation. |
429 | Rate limit exceeded. |
500 | Unexpected server error. |
503 | Download links are not available here. |