Dikarya API v1
Programmatic access for scripts and tools. All endpoints require a bearer token.
Quick start
1. Mint a token at /user/tokens.
2. Send it in the Authorization header.
curl
Requires jq.
Use "input_type": "pasted_sequence"
when sending FASTA text in JSON — "fasta" is reserved for file-upload flows and is not supported on this endpoint.
TOKEN="dikarya_..."
# Identity check
curl -H "Authorization: Bearer $TOKEN" https://dikarya.us/api/v1/me
# Create a small working tree job and save the returned UUID
JOB_ID=$(
curl -s -X POST https://dikarya.us/api/v1/jobs \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"input_type": "pasted_sequence",
"sequence": ">Sample_A\nATGCGTACGTAGCTAGCTAGCTAGCTAGCTAACGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCG\n>Sample_B\nATGCGTACGTAGCTAGCTAGCTAGCTAGCTAACGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGTTTGATCGATCGATCG\n>Sample_C\nATGCGTACGTAGCTAGCTAGCTAGCTAGCTAACGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGTTTGATCG\n>Sample_D\nATGCGTACGTAGCTAGCTAGCTAGCTAGCTAACGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGTTTGATCGATCGATCGATCGATCG",
"tree_method": "fasttree",
"alignment_method": "mafft",
"trimming_method": "none",
"notes": "API test with valid pasted FASTA"
}' | jq -r '.data.id'
)
echo "$JOB_ID"
# Poll until the job finishes
for i in {1..60}; do
STATUS=$(
curl -s -H "Authorization: Bearer $TOKEN" \
"https://dikarya.us/api/v1/jobs/$JOB_ID" | jq -r '.data.status // .error.message'
)
echo "$(date +%T) $STATUS"
case "$STATUS" in
completed|failed|error) break ;;
esac
sleep 2
done
# Show the final job record
curl -s -H "Authorization: Bearer $TOKEN" \
"https://dikarya.us/api/v1/jobs/$JOB_ID" | jq
# Download the Newick tree
curl -H "Authorization: Bearer $TOKEN" \
"https://dikarya.us/api/v1/jobs/$JOB_ID/files/tree.newick" \
-o tree.newick
cat tree.newick
Python
Reads your token from DIKARYA_TOKEN.
Same pasted_sequence convention as the curl example.
import os
import time
import requests
API = "https://dikarya.us/api/v1"
TOKEN = os.environ["DIKARYA_TOKEN"]
HEADERS = {"Authorization": f"Bearer {TOKEN}"}
sequence = """>Sample_A
ATGCGTACGTAGCTAGCTAGCTAGCTAGCTAACGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCG
>Sample_B
ATGCGTACGTAGCTAGCTAGCTAGCTAGCTAACGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGTTTGATCGATCGATCG
>Sample_C
ATGCGTACGTAGCTAGCTAGCTAGCTAGCTAACGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGTTTGATCG
>Sample_D
ATGCGTACGTAGCTAGCTAGCTAGCTAGCTAACGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGTTTGATCGATCGATCGATCGATCG
"""
payload = {
"input_type": "pasted_sequence",
"sequence": sequence,
"tree_method": "fasttree",
"alignment_method": "mafft",
"trimming_method": "none",
"notes": "Python API test with valid pasted FASTA",
}
response = requests.post(
f"{API}/jobs",
headers={**HEADERS, "Content-Type": "application/json"},
json=payload,
)
response.raise_for_status()
job_id = response.json()["data"]["id"]
print("Job ID:", job_id)
while True:
response = requests.get(f"{API}/jobs/{job_id}", headers=HEADERS)
response.raise_for_status()
job = response.json()["data"]
print(job["status"])
if job["status"] in ("completed", "failed", "error"):
break
time.sleep(2)
if job["status"] != "completed":
raise RuntimeError(f"Job did not complete: {job['status']}")
tree_response = requests.get(
f"{API}/jobs/{job_id}/files/tree.newick",
headers=HEADERS,
)
tree_response.raise_for_status()
print(tree_response.text)
Use the Authorize button below to plug in your token,
then any endpoint can be tried directly from this page.