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.