icon file Flask Track Docs

Flask Track API

Open API Documentation

Open API Documentation

API Guides

Flask Track exposes a JSON REST API for programmatic interaction with:

The API is designed for:


Authentication

Flask Track supports:

  1. Session-authenticated users
  2. Organization API keys

API access is scoped to a single organization.


Authentication Headers

All API requests require:

x-organization: <organization_uuid>
x-api-key: <api_key>

Example:

curl https://flasktrack.com/api/1/[species](/species/view) \
  -H "x-organization: 11111111-1111-1111-1111-111111111111" \
  -H "x-api-key: ft_live_xxxxxxxxx"

Rate Limits

API requests are rate limited:

Rate limiting is applied per authenticated user or API key.


Base URL

https://flasktrack.com/api

Response Format

All endpoints return JSON.

Example:

[
  {
    "id": "e7b7b939-86f1-4d76-8df7-c7303d0f38db",
    "name": "MS Media"
  }
]

Users API

List Users

Returns all active organization users.

Endpoint

GET /api/1/users

Example

curl https://flasktrack.com/api/1/users \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Response

[
  {
    "id": "uuid",
    "display_name": "Dr. Smith"
  }
]

Species API

List Species

Endpoint

GET /api/1/[species](/species/view)

Query Parameters

Parameter Description
domain Filter by sample domain

Example

curl "https://flasktrack.com/api/1/[species](/species/view)?domain=tissue_culture" \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Response

[
  {
    "id": "uuid",
    "name": "Banana (Musa acuminata)"
  }
]

Create Species

Endpoint

POST /api/1/[species](/species/view)

Request Body

{
  "domain": "tissue_culture",
  "latin_name": "Musa acuminata",
  "common_name": "Banana",
  "default_agro_plasmid": null
}

Example

curl -X POST https://flasktrack.com/api/1/[species](/species/view) \
  -H "Content-Type: application/json" \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY" \
  -d '{
    "domain": "tissue_culture",
    "latin_name": "Musa acuminata",
    "common_name": "Banana"
  }'

Response

201 Created

Workflow API

List Workflows

Endpoint

GET /api/1/[workflows](/workflows/view)

Query Parameters

Parameter Description
domain Filter by workflows domain
species Species UUID

Example

curl "https://flasktrack.com/api/1/[workflows](/workflows/view)?domain=tissue_culture" \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Response

[
  {
    "id": "uuid",
    "name": "Banana Micropropagation"
  }
]

Protocol API

List Protocols

Endpoint

GET /api/1/[protocols](/protocols/view)

Example

curl https://flasktrack.com/api/1/[protocols](/protocols/view) \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Response

[
  {
    "id": "uuid",
    "name": "Sterilization [Protocol](/protocols/view)"
  }
]

Ingredient API

List Ingredients

Endpoint

GET /api/1/[ingredients](/ingredients/view)

Example

curl https://flasktrack.com/api/1/[ingredients](/ingredients/view) \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Response

[
  {
    "id": "uuid",
    "name": "Murashige & Skoog Medium"
  }
]

Tool API

List Tools

Endpoint

GET /api/1/[tools](/tools/view)

Example

curl https://flasktrack.com/api/1/[tools](/tools/view) \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Response

[
  {
    "id": "uuid",
    "name": "Laminar Flow Hood"
  }
]

Plasmid API

List Plasmids

Endpoint

GET /api/1/[plasmids](/plasmids/view)

Example

curl https://flasktrack.com/api/1/[plasmids](/plasmids/view) \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Response

[
  {
    "id": "uuid",
    "name": "pCAMBIA1301",
    "unit": "ml"
  }
]

SampleAPI

Create Sample

Creates a new laboratory sample and initializes workflows scheduling.

Endpoint

POST /api/1/[samples](/samples/view)

Request Body

{
  "name": "Banana TC-001",
  "species_id": "uuid",
  "domain": "tissue_culture",
  "workflow_id": "uuid",
  "notes": "Imported from external LIMS",
  "scheduled_for": "2026-05-20T09:00",
  "timezone": "America/Puerto_Rico"
}

Example

curl -X POST https://flasktrack.com/api/1/[samples](/samples/view) \
  -H "Content-Type: application/json" \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY" \
  -d '{
    "name": "Banana TC-001",
    "species_id": "SPECIES_ID",
    "domain": "tissue_culture",
    "workflow_id": "WORKFLOW_ID",
    "notes": "Imported from external LIMS",
    "scheduled_for": "2026-05-20T09:00",
    "timezone": "America/Puerto_Rico"
  }'

Response

201 Created

Get Sample

Endpoint

GET /api/1/[samples](/samples/view)/{sample_id}

Example

curl https://flasktrack.com/api/1/[samples](/samples/view)/SAMPLE_ID \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Response

{
  "id": "uuid",
  "name": "Banana TC-001",
  "species_id": "uuid",
  "domain": "tissue_culture",
  "workflow_id": "uuid",
  "state": "active"
}

Lookup Samples

Bulk lookup helper endpoint.

Endpoint

GET /api/1/[samples](/samples/view)/lookup?ids=uuid1,uuid2

Example

curl "https://flasktrack.com/api/1/[samples](/samples/view)/lookup?ids=UUID1,UUID2" \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Response

{
  "uuid1": "[Sample](/samples/view) A",
  "uuid2": "[Sample](/samples/view) B"
}

List Sample Events

Returns all recorded sample events including entities and execution metadata.

Endpoint

GET /api/1/[samples](/samples/view)/{sample_id}/events

Example

curl https://flasktrack.com/api/1/[samples](/samples/view)/SAMPLE_ID/events \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Response

[
  {
    "id": "uuid",
    "event_type": "transfer",
    "notes": "Transferred to fresh media",
    "occurred_at": "2026-05-19T14:00:00Z",
    "entities": []
  }
]

SampleSchedule

Returns workflows scheduling data for a sample.

Endpoint

GET /api/1/[samples](/samples/view)/{sample_id}/schedule

Example

curl https://flasktrack.com/api/1/[samples](/samples/view)/SAMPLE_ID/schedule \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Batch API

List Batches

Endpoint

GET /api/1/[batches](/batches/view)

Example

curl https://flasktrack.com/api/1/[batches](/batches/view) \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Response

{
  "items": [
    {
      "id": "uuid",
      "name": "Banana [Batch](/batches/view) A — Banana (Musa acuminata)"
    }
  ]
}

Create Batch

Endpoint

POST /api/1/[batches](/batches/view)

Request Body

{
  "species_id": "uuid",
  "workflow_id": "uuid",
  "name": "Banana Production [Batch](/batches/view)",
  "domain": "tissue_culture",
  "notes": "May production run",
  "planned_quantity": 500,
  "scheduled_for": "2026-05-20T08:00",
  "timezone": "America/Puerto_Rico"
}

Example

curl -X POST https://flasktrack.com/api/1/[batches](/batches/view) \
  -H "Content-Type: application/json" \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY" \
  -d '{
    "species_id": "SPECIES_ID",
    "workflow_id": "WORKFLOW_ID",
    "name": "Banana Production [Batch](/batches/view)",
    "domain": "tissue_culture",
    "planned_quantity": 500,
    "scheduled_for": "2026-05-20T08:00",
    "timezone": "America/Puerto_Rico"
  }'

Response

201 Created

Batch Schedule

Returns generated workflows schedule data for a batch.

Endpoint

GET /api/1/[batches](/batches/view)/{batch_id}/schedule

Example

curl https://flasktrack.com/api/1/[batches](/batches/view)/BATCH_ID/schedule \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Reports API

List Reports

Returns public organization reports.

Endpoint

GET /api/1/[reports](/reports/overview)

Example

curl https://flasktrack.com/api/1/[reports](/reports/overview) \
  -H "x-organization: ORG_ID" \
  -H "x-api-key: API_KEY"

Response

[
  {
    "id": "uuid",
    "name": "Monthly Yield [Report](/reports/overview)",
    "description": "Production metrics by [workflows](/workflows/view)"
  }
]

Domains

Supported SampleDomain values include:

all
tissue_culture
agrobacterium
fungus

Common Event Types

Common SampleAction values include:

initialize
sterilize
subculture
transfer
selection
expand
harvest
complete
fail
archive

Error Responses

Example:

{
  "error": "[Sample](/samples/view) not found"
}

Common status codes:

Code Meaning
200 Success
201 Created
400 Invalid request
401 Unauthorized
403 Forbidden
404 Not found
429 Rate limited
500 Internal error