thesis Developers
API ReferenceThesis API

Thesis API

The thesis API

Stripe Webhook

Handle Stripe webhook events

post/stripe/webhook

Header parameters

stripe-signaturestringRequired

Returns

201
POST
POST /stripe/webhook HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Membership V0

Invite to organization by email

post/membership

Request body

organizationIdstringRequired
emailstringRequired
rolestringRequired

Enum: "owner", "admin", "member"

Returns

default
POST
POST /membership HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "organizationId": "organizationId",
  "email": "email",
  "role": "owner"
}

List memberships with users

get/membership

Returns

default
GET
GET /membership HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Delete membership

delete/membership/{membershipId}

Path parameters

membershipIdstringRequired

The ID of the membership to delete

Returns

default
DELETE
DELETE /membership/{membershipId} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Organization V0

Create organization with free plan

post/organization

Request body

namestringRequired
emailstringRequired
typestringRequired

Enum: "individual", "team"

Returns

default
POST
POST /organization HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "name": "name",
  "email": "email",
  "type": "individual"
}

List organizations for user

get/organization

Returns

default
GET
GET /organization HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Update the organization

put/organization

Request body

optInShareDataOptional
usageLimitCentsOptional
usageAllowanceCentsOptional
pricePerSeatCentsOptional
priceForOrganizationCentsOptional
machineQuotaOptional

Returns

default
PUT
PUT /organization HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "optInShareData": null,
  "usageLimitCents": null,
  "usageAllowanceCents": null,
  "pricePerSeatCents": null,
  "priceForOrganizationCents": null,
  "machineQuota": null
}

Get billing summary

get/organization/billing

Returns

default
GET
GET /organization/billing HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get paginated usage history

get/organization/billing/usage-history

Query parameters

limitnumberOptional

Number of records to return (max 100, default 20)

offsetnumberOptional

Number of records to skip (index-based pagination, default 0)

startDatestringOptional

Filter records from this date (ISO 8601)

endDatestringOptional

Filter records until this date (ISO 8601)

Returns

default
GET
GET /organization/billing/usage-history HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get paginated storage usage history

get/organization/billing/storage-usage-history

Query parameters

limitnumberOptional

Number of records to return (max 100, default 20)

offsetnumberOptional

Number of records to skip (index-based pagination, default 0)

startDatestringOptional

Filter records from this date (ISO 8601)

endDatestringOptional

Filter records until this date (ISO 8601)

Returns

200
GET
GET /organization/billing/storage-usage-history HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get paginated compute usage history

get/organization/billing/compute-usage-history

Query parameters

limitnumberOptional

Number of records to return (max 100, default 20)

offsetnumberOptional

Number of records to skip (index-based pagination, default 0)

startDatestringOptional

Filter records from this date (ISO 8601)

endDatestringOptional

Filter records until this date (ISO 8601)

Returns

200
GET
GET /organization/billing/compute-usage-history HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Change subscription plan (checkout for new subscribers, instant update for existing)

post/organization/billing/checkout

Request body

planstringRequired

Enum: "free", "payAsYouGo"

Returns

default
POST
POST /organization/billing/checkout HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "plan": "free"
}

Create billing portal session

post/organization/billing/portal

Returns

default
POST
POST /organization/billing/portal HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Update usage limit

put/organization/billing/usage-limit

Request body

limitRequired

Returns

default
PUT
PUT /organization/billing/usage-limit HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "limit": null
}

Get daily usage limit status for free tier

get/organization/rate-limit

Returns

200
GET
GET /organization/rate-limit HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Claim free trial for organization

post/organization/claim-trial

Returns

default
POST
POST /organization/claim-trial HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get trial status for organization

get/organization/trial

Returns

default
GET
GET /organization/trial HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Public V0

Accept organization invite via email link

get/public/organization-member/{membershipId}/accept-invite-via-email

Path parameters

membershipIdstringRequired

The membership ID from the invite email

Returns

200
GET
GET /public/organization-member/{membershipId}/accept-invite-via-email HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

List public datasets

get/public/datasets

Returns

200List of public datasets
GET
GET /public/datasets HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get a public dataset by ID

get/public/datasets/{id}

Path parameters

idstringRequired

Dataset ID

Returns

200Dataset with metadata
404Dataset not found
GET
GET /public/datasets/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

List public models

get/public/models

Returns

200List of public models
GET
GET /public/models HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get a public model by ID

get/public/models/{id}

Path parameters

idstringRequired

Model ID

Returns

200Model with metadata
404Model not found
GET
GET /public/models/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get download URL for a public dataset

get/public/datasets/{id}/download

Path parameters

idstringRequired

Dataset ID

Returns

200Signed download URL
404Dataset not found
GET
GET /public/datasets/{id}/download HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get download URL for a public model

get/public/models/{id}/download

Path parameters

idstringRequired

Model ID

Returns

200Signed download URL
404Model not found
GET
GET /public/models/{id}/download HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Release V0

List all releases

get/release

Query parameters

platformstringOptional

Filter by platform

osTypestringOptional

Filter by specific OS artifact type (e.g., aarch64.dmg, setup.exe)

versionstringOptional

Filter by specific version

Returns

default
GET
GET /release HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get latest release for each platform or a specific platform

get/release/latest

Query parameters

platformstringOptional

Get latest release for a specific platform

Returns

default
GET
GET /release/latest HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get Tauri update manifest

get/release/tauri-manifest

Returns Tauri-compatible update manifest. Automatically detects release channel from current_version (prerelease suffix = staging, clean semver = production).

Query parameters

current_versionstringRequired

Current app version (sent automatically by Tauri updater)

archOptional

Architecture (e.g., aarch64)

targetOptional

Target platform (e.g., darwin-aarch64)

Returns

200Tauri-compatible update manifest
204No update available
GET
GET /release/tauri-manifest HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Download release asset

get/release/download/{assetId}

Redirects to GCS CDN for the release asset.

Path parameters

assetIdstringRequired

GitHub asset ID

Returns

302Redirect to GCS download URL
400Invalid asset ID
404Asset not found
GET
GET /release/download/{assetId} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Responses V0

Create a response

post/responses

OpenAI Responses API compatible endpoint. Supports both streaming and non-streaming responses.

Request body

modelstringRequired
instructionsstringOptional
inputRequired
toolsarrayOptional
tool_choiceOptional
temperaturenumberOptional
top_pnumberOptional
max_output_tokensnumberOptional
truncationstringOptional

Enum: "auto", "disabled"

streambooleanOptional
reasoningobjectOptional
includearrayOptional
metadataobjectOptional
sessionIdstringOptional
organizationIdstringOptional

Returns

200
POST
POST /responses HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "model": "model",
  "instructions": "instructions",
  "input": null,
  "tools": [
    {
      "type": "type",
      "name": "name",
      "description": "description",
      "parameters": {
        "type": "type",
        "properties": {},
        "required": [
          {}
        ],
        "additionalProperties": false,
        "items": null,
        "enum": [
          {}
        ],
        "description": "description",
        "$schema": "$schema"
      },
      "strict": false
    }
  ],
  "tool_choice": null,
  "temperature": 1,
  "top_p": 1,
  "max_output_tokens": 1,
  "truncation": "auto",
  "stream": false,
  "reasoning": {
    "effort": "low"
  },
  "include": [
    "string"
  ],
  "metadata": {},
  "sessionId": "sessionId",
  "organizationId": "organizationId"
}
Responsejson
{
  "id": "id_1a2b3c",
  "object": "object",
  "created_at": 1,
  "model": "model",
  "status": "completed",
  "output": [
    {
      "type": "message",
      "id": "id_1a2b3c",
      "status": "status",
      "role": "assistant",
      "content": [
        {
          "type": "type",
          "text": "text",
          "annotations": {}
        }
      ],
      "call_id": "call_id",
      "name": "name",
      "arguments": "arguments",
      "output": "output",
      "summary": [
        {
          "type": "type",
          "text": "text"
        }
      ]
    }
  ],
  "usage": {
    "input_tokens": 1,
    "output_tokens": 1,
    "total_tokens": 1,
    "input_tokens_details": {
      "cached_tokens": 1
    },
    "output_tokens_details": {
      "reasoning_tokens": 1
    }
  },
  "error": null,
  "tool_calls": [
    {
      "id": "id_1a2b3c",
      "type": "type",
      "function": {
        "name": "name",
        "arguments": "arguments"
      }
    }
  ],
  "output_text": "output_text"
}

Session

Create a new session

post/session

Query parameters

sessionIdstringOptional

The session ID to use for the session

Returns

default
POST
POST /session HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

List all sessions for current user

get/session

Returns

default
GET
GET /session HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Reveal a session

get/session/reveal/{sessionId}

Path parameters

sessionIdstringRequired

The ID of the session to reveal

Returns

default
GET
GET /session/reveal/{sessionId} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Check if a session exists (for diagnostics)

get/session/check/{sessionId}

Path parameters

sessionIdstringRequired

The ID of the session to check

Returns

default
GET
GET /session/check/{sessionId} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Delete a session

delete/session/{sessionId}

Path parameters

sessionIdstringRequired

The ID of the session to delete

Returns

default
DELETE
DELETE /session/{sessionId} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

User

Get current user

get/user

Returns

default
GET
GET /user HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get current user by session

get/user/by-session

Returns

default
GET
GET /user/by-session HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Request password reset email

post/user/password-reset

Request body

emailstringRequired

The email to send password reset link to

Returns

defaultAlways returns true for security
POST
POST /user/password-reset HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "email": "user@example.com"
}

Token Usage Record

List usage records

get/usage-record

Query parameters

startDatestringOptional
endDatestringOptional
limitstringOptional

Returns

default
GET
GET /usage-record HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get usage summary

get/usage-record/summary

Query parameters

startDatestringOptional
endDatestringOptional

Returns

default
GET
GET /usage-record/summary HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Feedback V0

Submit feedback

post/feedback

Request body

namestringRequired

The name of the person submitting feedback

emailstringRequired

The email of the person submitting feedback

feedbackTypestringRequired

The type of feedback

Enum: "bug", "feature", "general"

messagestringRequired

The feedback message (minimum 10 characters)

metadataobjectOptional

Additional metadata about the feedback

Returns

default
POST
POST /feedback HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "name": "The name of the person submitting feedback",
  "email": "user@example.com",
  "feedbackType": "bug",
  "message": "The feedback message (minimum 10 characters)",
  "metadata": {
    "appVersion": "appVersion",
    "platform": "platform",
    "userAgent": "userAgent",
    "screenshot": "screenshot",
    "screenshotTimestamp": "2026-01-15T10:30:00Z"
  }
}

Machine

Create a new machine

post/machine

Request body

cloudstringOptional

Cloud provider

Enum: "gcp", "aws", "runpod", "together"

regionstringOptional

Cloud region

machineTypestringOptional

Instance type

preemptiblebooleanOptional

Whether to use preemptible/spot instance

diskSizeGbintegerOptional

Boot disk size in GB

gpuTypestringOptional

GPU accelerator type (e.g., nvidia-tesla-t4)

gpuCountintegerOptional

Number of GPUs to attach

Returns

201
POST
POST /machine HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "cloud": "gcp",
  "region": "Cloud region",
  "machineType": "Instance type",
  "preemptible": false,
  "diskSizeGb": 1,
  "gpuType": "GPU accelerator type (e.g., nvidia-tesla-t4)",
  "gpuCount": 1
}
Responsejson
{
  "id": "id_1a2b3c",
  "organizationId": null,
  "name": "name",
  "cloud": "cloud",
  "projectId": null,
  "region": "region",
  "machineType": "machineType",
  "image": "image",
  "status": "status",
  "coreToken": "coreToken",
  "error": null,
  "metadata": null,
  "createdAt": "2026-01-15T10:30:00Z",
  "updatedAt": "2026-01-15T10:30:00Z",
  "deletedAt": null,
  "isStopped": false,
  "lastStartDurationMs": null
}

List all machines for the organization

get/machine

Returns

200
GET
GET /machine HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Responsejson
[
  {
    "id": "id_1a2b3c",
    "organizationId": null,
    "name": "name",
    "cloud": "cloud",
    "projectId": null,
    "region": "region",
    "machineType": "machineType",
    "image": "image",
    "status": "status",
    "coreToken": "coreToken",
    "error": null,
    "metadata": null,
    "createdAt": "2026-01-15T10:30:00Z",
    "updatedAt": "2026-01-15T10:30:00Z",
    "deletedAt": null,
    "isStopped": false,
    "lastStartDurationMs": null
  }
]

Get compute pricing for machine types

get/machine/pricing

Returns

200
GET
GET /machine/pricing HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get machine by ID

get/machine/{id}

Path parameters

idstringRequired

Machine ID

Returns

200
GET
GET /machine/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Responsejson
{
  "id": "id_1a2b3c",
  "organizationId": null,
  "name": "name",
  "cloud": "cloud",
  "projectId": null,
  "region": "region",
  "machineType": "machineType",
  "image": "image",
  "status": "status",
  "coreToken": "coreToken",
  "error": null,
  "metadata": null,
  "createdAt": "2026-01-15T10:30:00Z",
  "updatedAt": "2026-01-15T10:30:00Z",
  "deletedAt": null,
  "isStopped": false,
  "lastStartDurationMs": null
}

Delete a machine

delete/machine/{id}

Path parameters

idstringRequired

Machine ID

Returns

200Machine deletion initiated
DELETE
DELETE /machine/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Check machine health status

get/machine/{id}/health

Path parameters

idstringRequired

Machine ID

Returns

200
GET
GET /machine/{id}/health HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Responsejson
{
  "cluster": {
    "status": "status",
    "healthy": false
  },
  "notebook": {
    "port": 1,
    "healthy": false,
    "responseTime": 1,
    "error": "error"
  },
  "core": {
    "port": 1,
    "healthy": false,
    "responseTime": 1,
    "error": "error"
  }
}

Stop a running machine (preserves disk)

post/machine/{id}/stop

Path parameters

idstringRequired

Machine ID

Returns

200Stop action initiated
POST
POST /machine/{id}/stop HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Start a stopped machine

post/machine/{id}/start

Path parameters

idstringRequired

Machine ID

Returns

200Start action initiated
POST
POST /machine/{id}/start HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Hard reset a machine (power cycle)

post/machine/{id}/reset

Path parameters

idstringRequired

Machine ID

Returns

200Reset action initiated
POST
POST /machine/{id}/reset HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Dataset

Upload a dataset file

post/dataset/upload

Returns

201
POST
POST /dataset/upload HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Responsejson
{
  "id": "id_1a2b3c",
  "organizationId": null,
  "name": "name",
  "description": null,
  "public": false,
  "structured": false,
  "path": "path",
  "format": "format",
  "version": 1,
  "rowCount": null,
  "columnCount": null,
  "sizeBytes": null,
  "schema": null,
  "files": null,
  "fileCount": null,
  "parentId": null,
  "chatId": null,
  "deletedAt": null,
  "createdAt": "2026-01-15T10:30:00Z",
  "updatedAt": "2026-01-15T10:30:00Z"
}

Get a signed URL for direct-to-GCS upload

post/dataset/upload-url

Request body

filenamestringRequired
publicbooleanOptional

Returns

201
POST
POST /dataset/upload-url HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "filename": "filename",
  "public": false
}

Confirm a direct-to-GCS upload and create the dataset record

post/dataset/confirm-upload

Request body

datasetIdstringRequired
pathstringRequired
namestringRequired
descriptionstringOptional
publicbooleanOptional
structuredbooleanOptional
parentIdstringOptional
chatIdstringOptional

Returns

201
POST
POST /dataset/confirm-upload HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "datasetId": "datasetId",
  "path": "path",
  "name": "name",
  "description": "description",
  "public": false,
  "structured": false,
  "parentId": "parentId",
  "chatId": "chatId"
}
Responsejson
{
  "id": "id_1a2b3c",
  "organizationId": null,
  "name": "name",
  "description": null,
  "public": false,
  "structured": false,
  "path": "path",
  "format": "format",
  "version": 1,
  "rowCount": null,
  "columnCount": null,
  "sizeBytes": null,
  "schema": null,
  "files": null,
  "fileCount": null,
  "parentId": null,
  "chatId": null,
  "deletedAt": null,
  "createdAt": "2026-01-15T10:30:00Z",
  "updatedAt": "2026-01-15T10:30:00Z"
}

List all datasets for the organization

get/dataset

Returns

200
GET
GET /dataset HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Responsejson
[
  {
    "id": "id_1a2b3c",
    "organizationId": null,
    "name": "name",
    "description": null,
    "public": false,
    "structured": false,
    "path": "path",
    "format": "format",
    "version": 1,
    "rowCount": null,
    "columnCount": null,
    "sizeBytes": null,
    "schema": null,
    "files": null,
    "fileCount": null,
    "parentId": null,
    "chatId": null,
    "deletedAt": null,
    "createdAt": "2026-01-15T10:30:00Z",
    "updatedAt": "2026-01-15T10:30:00Z"
  }
]

Get dataset by ID

get/dataset/{id}

Path parameters

idstringRequired

Dataset ID

Returns

200
GET
GET /dataset/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Responsejson
{
  "id": "id_1a2b3c",
  "organizationId": null,
  "name": "name",
  "description": null,
  "public": false,
  "structured": false,
  "path": "path",
  "format": "format",
  "version": 1,
  "rowCount": null,
  "columnCount": null,
  "sizeBytes": null,
  "schema": null,
  "files": null,
  "fileCount": null,
  "parentId": null,
  "chatId": null,
  "deletedAt": null,
  "createdAt": "2026-01-15T10:30:00Z",
  "updatedAt": "2026-01-15T10:30:00Z"
}

Update dataset metadata

put/dataset/{id}

Path parameters

idstringRequired

Dataset ID

Request body

namestringOptional
descriptionOptional
publicbooleanOptional
structuredbooleanOptional
rowCountintegerOptional
columnCountintegerOptional
sizeBytesintegerOptional
schemaobjectOptional
filesarrayOptional
fileCountintegerOptional
parentIdOptional

Returns

200
PUT
PUT /dataset/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "name": "name",
  "description": null,
  "public": false,
  "structured": false,
  "rowCount": 1,
  "columnCount": 1,
  "sizeBytes": 1,
  "schema": {
    "columns": [
      {
        "name": "name",
        "type": "type",
        "nullable": false
      }
    ]
  },
  "files": [
    "string"
  ],
  "fileCount": 1,
  "parentId": null
}
Responsejson
{
  "id": "id_1a2b3c",
  "organizationId": null,
  "name": "name",
  "description": null,
  "public": false,
  "structured": false,
  "path": "path",
  "format": "format",
  "version": 1,
  "rowCount": null,
  "columnCount": null,
  "sizeBytes": null,
  "schema": null,
  "files": null,
  "fileCount": null,
  "parentId": null,
  "chatId": null,
  "deletedAt": null,
  "createdAt": "2026-01-15T10:30:00Z",
  "updatedAt": "2026-01-15T10:30:00Z"
}

Delete a dataset

delete/dataset/{id}

Path parameters

idstringRequired

Dataset ID

Returns

200Dataset deleted
DELETE
DELETE /dataset/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get download URL for a dataset

get/dataset/{id}/download

Path parameters

idstringRequired

Dataset ID

Returns

200
GET
GET /dataset/{id}/download HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Responsejson
{
  "url": "Signed URL for downloading the dataset",
  "expiresAt": "2026-01-15T10:30:00Z"
}

Model

Upload a model file

post/model/upload

Returns

201
POST
POST /model/upload HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Responsejson
{
  "id": "id_1a2b3c",
  "organizationId": null,
  "name": "name",
  "description": null,
  "public": false,
  "path": "path",
  "sizeBytes": null,
  "deletedAt": null,
  "createdAt": "2026-01-15T10:30:00Z",
  "updatedAt": "2026-01-15T10:30:00Z"
}

Get a signed URL for direct-to-GCS upload

post/model/upload-url

Request body

filenamestringRequired
publicbooleanOptional

Returns

201
POST
POST /model/upload-url HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "filename": "filename",
  "public": false
}

Confirm a direct-to-GCS upload and create the model record

post/model/confirm-upload

Request body

modelIdstringRequired
pathstringRequired
namestringRequired
descriptionstringOptional
publicbooleanOptional

Returns

201
POST
POST /model/confirm-upload HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "modelId": "modelId",
  "path": "path",
  "name": "name",
  "description": "description",
  "public": false
}
Responsejson
{
  "id": "id_1a2b3c",
  "organizationId": null,
  "name": "name",
  "description": null,
  "public": false,
  "path": "path",
  "sizeBytes": null,
  "deletedAt": null,
  "createdAt": "2026-01-15T10:30:00Z",
  "updatedAt": "2026-01-15T10:30:00Z"
}

List all models for the organization

get/model

Returns

200
GET
GET /model HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Responsejson
[
  {
    "id": "id_1a2b3c",
    "organizationId": null,
    "name": "name",
    "description": null,
    "public": false,
    "path": "path",
    "sizeBytes": null,
    "deletedAt": null,
    "createdAt": "2026-01-15T10:30:00Z",
    "updatedAt": "2026-01-15T10:30:00Z"
  }
]

Get model by ID

get/model/{id}

Path parameters

idstringRequired

Model ID

Returns

200
GET
GET /model/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Responsejson
{
  "id": "id_1a2b3c",
  "organizationId": null,
  "name": "name",
  "description": null,
  "public": false,
  "path": "path",
  "sizeBytes": null,
  "deletedAt": null,
  "createdAt": "2026-01-15T10:30:00Z",
  "updatedAt": "2026-01-15T10:30:00Z"
}

Update model metadata

put/model/{id}

Path parameters

idstringRequired

Model ID

Request body

namestringOptional
descriptionOptional
publicbooleanOptional
sizeBytesintegerOptional

Returns

200
PUT
PUT /model/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "name": "name",
  "description": null,
  "public": false,
  "sizeBytes": 1
}
Responsejson
{
  "id": "id_1a2b3c",
  "organizationId": null,
  "name": "name",
  "description": null,
  "public": false,
  "path": "path",
  "sizeBytes": null,
  "deletedAt": null,
  "createdAt": "2026-01-15T10:30:00Z",
  "updatedAt": "2026-01-15T10:30:00Z"
}

Delete a model

delete/model/{id}

Path parameters

idstringRequired

Model ID

Returns

200Model deleted
DELETE
DELETE /model/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get download URL for a model

get/model/{id}/download

Path parameters

idstringRequired

Model ID

Returns

200
GET
GET /model/{id}/download HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Responsejson
{
  "url": "Signed URL for downloading the model",
  "expiresAt": "2026-01-15T10:30:00Z"
}

Newsletter Subscriber V0

Subscribe to newsletter

post/newsletter-subscriber

Request body

emailstringRequired

The subscriber's email address

Returns

201
409Email already subscribed
POST
POST /newsletter-subscriber HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "email": "user@example.com"
}
Responsejson
{
  "id": "id_1a2b3c",
  "email": "email",
  "createdAt": "2026-01-15T10:30:00Z"
}

User GitHub

Check if GitHub is connected

get/user/github/status

Returns

defaultGitHub connection status
GET
GET /user/github/status HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

List user GitHub repositories

get/user/github/repos

Returns

defaultList of repositories
GET
GET /user/github/repos HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Store GitHub OAuth token (platform callback)

post/user/github/token

Request body

accessTokenstringRequired
refreshTokenstringOptional
expiresAtstringOptional

Returns

defaultToken stored
POST
POST /user/github/token HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "accessToken": "accessToken",
  "refreshToken": "refreshToken",
  "expiresAt": "2026-01-15T10:30:00Z"
}

Admin

List all organizations with stats

get/admin/organizations

Query parameters

searchstringOptional

Search by organization name

planstringOptional

Filter by plan

typestringOptional

Filter by type

limitnumberOptional

Results per page (max 100)

offsetnumberOptional

Results to skip

sortBystringOptional

Sort field

sortOrderstringOptional

Sort order

Returns

default
GET
GET /admin/organizations HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get organization by ID with members and stats

get/admin/organizations/{id}

Path parameters

idstringRequired

Organization ID

Returns

default
GET
GET /admin/organizations/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Update organization

put/admin/organizations/{id}

Path parameters

idstringRequired

Organization ID

Request body

namestringOptional
typestringOptional

Enum: "individual", "team"

subscriptionPlanstringOptional

Enum: "free", "payAsYouGo"

optInShareDatastringOptional

Enum: "private", "shareData"

usageLimitCentsOptional
usageAllowanceCentsOptional
pricePerSeatCentsOptional
priceForOrganizationCentsOptional
machineQuotaOptional

Returns

default
PUT
PUT /admin/organizations/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "name": "name",
  "type": "individual",
  "subscriptionPlan": "free",
  "optInShareData": "private",
  "usageLimitCents": null,
  "usageAllowanceCents": null,
  "pricePerSeatCents": null,
  "priceForOrganizationCents": null,
  "machineQuota": null
}

Delete organization (soft delete)

delete/admin/organizations/{id}

Path parameters

idstringRequired

Organization ID

Returns

default
DELETE
DELETE /admin/organizations/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

List members of an organization

get/admin/organizations/{id}/members

Path parameters

idstringRequired

Organization ID

Returns

default
GET
GET /admin/organizations/{id}/members HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Add member to organization

post/admin/organizations/{id}/members

Path parameters

idstringRequired

Organization ID

Request body

emailstringRequired
rolestringRequired

Enum: "owner", "admin", "member"

Returns

default
POST
POST /admin/organizations/{id}/members HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "email": "user@example.com",
  "role": "owner"
}

Remove member from organization

delete/admin/organizations/{id}/members/{memberId}

Path parameters

idstringRequired

Organization ID

memberIdstringRequired

Membership ID

Returns

default
DELETE
DELETE /admin/organizations/{id}/members/{memberId} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get usage records for an organization

get/admin/organizations/{id}/usage

Path parameters

idstringRequired

Organization ID

Query parameters

startDatestringOptional

Start date (ISO 8601)

endDatestringOptional

End date (ISO 8601)

limitnumberOptional

Results per page (max 100)

offsetnumberOptional

Results to skip

metricTypestringOptional

Filter by metric type

Returns

default
GET
GET /admin/organizations/{id}/usage HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get Stripe subscription info for an organization

get/admin/organizations/{id}/stripe

Path parameters

idstringRequired

Organization ID

Returns

default
GET
GET /admin/organizations/{id}/stripe HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Cancel subscription at end of billing period

post/admin/organizations/{id}/stripe/cancel

Path parameters

idstringRequired

Organization ID

Returns

default
POST
POST /admin/organizations/{id}/stripe/cancel HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Cancel subscription immediately

post/admin/organizations/{id}/stripe/cancel-immediately

Path parameters

idstringRequired

Organization ID

Returns

default
POST
POST /admin/organizations/{id}/stripe/cancel-immediately HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Reactivate a subscription pending cancellation

post/admin/organizations/{id}/stripe/reactivate

Path parameters

idstringRequired

Organization ID

Returns

default
POST
POST /admin/organizations/{id}/stripe/reactivate HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Bill organization immediately for pending usage

post/admin/organizations/{id}/stripe/bill-now

Path parameters

idstringRequired

Organization ID

Returns

default
POST
POST /admin/organizations/{id}/stripe/bill-now HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

List trials for an organization

get/admin/organizations/{id}/trials

Path parameters

idstringRequired

Organization ID

Returns

default
GET
GET /admin/organizations/{id}/trials HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Create a claimable trial for an organization

post/admin/organizations/{id}/trials

Path parameters

idstringRequired

Organization ID

Request body

lengthDaysintegerRequired
maxUsageAllowanceCentsintegerRequired
claimOnCreatebooleanOptional

Returns

default
POST
POST /admin/organizations/{id}/trials HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "lengthDays": 1,
  "maxUsageAllowanceCents": 1,
  "claimOnCreate": false
}

Update a trial

put/admin/organizations/{id}/trials/{trialId}

Path parameters

idstringRequired

Organization ID

trialIdstringRequired

Trial ID

Request body

lengthDaysintegerOptional
maxUsageAllowanceCentsintegerOptional
periodStartOptional
periodEndOptional

Returns

default
PUT
PUT /admin/organizations/{id}/trials/{trialId} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY
Content-Type: application/json

{
  "lengthDays": 1,
  "maxUsageAllowanceCents": 1,
  "periodStart": null,
  "periodEnd": null
}

Delete a trial

delete/admin/organizations/{id}/trials/{trialId}

Path parameters

idstringRequired

Organization ID

trialIdstringRequired

Trial ID

Returns

default
DELETE
DELETE /admin/organizations/{id}/trials/{trialId} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

List all users

get/admin/users

Query parameters

searchstringOptional

Search by email or name

limitnumberOptional

Results per page (max 100)

offsetnumberOptional

Results to skip

Returns

default
GET
GET /admin/users HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get user by ID with organization memberships

get/admin/users/{id}

Path parameters

idstringRequired

User ID

Returns

default
GET
GET /admin/users/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

List all newsletter subscribers

get/admin/newsletter-subscribers

Query parameters

searchstringOptional

Search by email

limitnumberOptional

Results per page (max 100)

offsetnumberOptional

Results to skip

Returns

default
GET
GET /admin/newsletter-subscribers HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get usage analytics across all organizations

get/admin/usage

Query parameters

startDatestringOptional

Start date (ISO 8601)

endDatestringOptional

End date (ISO 8601)

groupBystringOptional

Group by period

Returns

default
GET
GET /admin/usage HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

List all machines across organizations

get/admin/machines

Query parameters

searchstringOptional

Search by machine name

statusstringOptional

Filter by status (e.g. RUNNING, STOPPED)

organizationIdstringOptional

Filter by organization ID

limitnumberOptional

Results per page (max 100)

offsetnumberOptional

Results to skip

Returns

default
GET
GET /admin/machines HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get machine by ID

get/admin/machines/{id}

Path parameters

idstringRequired

Machine ID

Returns

default
GET
GET /admin/machines/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Delete (terminate) a machine

delete/admin/machines/{id}

Path parameters

idstringRequired

Machine ID

Returns

default
DELETE
DELETE /admin/machines/{id} HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Stop a running machine

post/admin/machines/{id}/stop

Path parameters

idstringRequired

Machine ID

Returns

default
POST
POST /admin/machines/{id}/stop HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Start a stopped machine

post/admin/machines/{id}/start

Path parameters

idstringRequired

Machine ID

Returns

default
POST
POST /admin/machines/{id}/start HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

Get SkyPilot cluster status for a machine

get/admin/machines/{id}/skypilot-status

Path parameters

idstringRequired

Machine ID

Returns

200
GET
GET /admin/machines/{id}/skypilot-status HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY

List cron job executions

get/admin/cron-executions

Query parameters

jobNamestringOptional

Filter by job name

statusstringOptional

Filter by status

limitnumberOptional

Results per page (max 100)

offsetnumberOptional

Results to skip

sortBystringOptional

Sort field

sortOrderstringOptional

Sort order

Returns

default
GET
GET /admin/cron-executions HTTP/1.1
Host: api.thesis.io/v1
Authorization: Bearer $THESIS_API_KEY