Document Version: 1.0 Date: December 5, 2025 API Version: v1.0 Base URL: https://api.ethraeon.com/v1 Patent: USPTO Provisional #7 (ETH-2025-001)
Core Endpoints:
POST /mode/activate - Activate specific mode
GET /mode/current - Get current mode state
POST /mode/evaluate - Evaluate automatic transition
GET /mode/history - Mode transition history
POST /artifacts - Create artifact
GET /artifacts/{id} - Retrieve artifact
PUT /artifacts/{id} - Update artifact
DELETE /artifacts/{id} - Delete artifact
POST /artifacts/{id}/relationships - Create relationship
POST /boards - Create board
GET /boards - List boards
GET /boards/{id} - Get board details
PUT /boards/{id}/layout - Update spatial layout
POST /tracks - Create track
GET /tracks - List tracks
PUT /tracks/{id} - Update track
GET /tracks/{id}/dependencies - Get dependency graph
Purpose: Explicitly activate a mode (amenable, challenge, board, orchestration)
Request Body:
{
"target_mode": "challenge|amenable|board|orchestration",
"reason": "string (optional)",
"context": {
"conversation_id": "string",
"previous_exchanges": "integer"
},
"persist": true
}Response (200 OK):
{
"success": true,
"mode_state": {
"mode_id": "uuid",
"user_id": "uuid",
"current_mode": "challenge",
"behavioral_contract": {
"response_style": "multi_frame",
"challenge_threshold": 1.0,
"artifact_creation": true,
"multi_frame_analysis": true
},
"activation_timestamp": "ISO 8601 datetime"
}
}Error Codes: - 400 - Invalid mode or transition - 401 - Unauthorized - 429 - Rate limit exceeded
Purpose: Retrieve user’s current mode state
Response (200 OK):
{
"user_id": "uuid",
"current_mode": "challenge",
"behavioral_contract": {
"mode": "challenge",
"response_style": "multi_frame",
"challenge_threshold": 1.0,
"artifact_creation": true,
"multi_frame_analysis": true
},
"activation_timestamp": "ISO 8601 datetime",
"session_id": "uuid"
}Purpose: Evaluate if automatic mode transition should occur
Request Body:
{
"user_input": "string",
"context": {
"conversation_history": [],
"current_mode": "amenable"
}
}Response (200 OK):
{
"should_transition": true,
"target_mode": "challenge",
"confidence": 0.85,
"reason": "Strategic decision detected",
"analysis": {
"ambiguity_score": 0.7,
"strategic_keywords_found": ["should", "option"],
"recommendation": "ACTIVATE_CHALLENGE_MODE"
}
}Purpose: Retrieve mode transition history
Query Parameters: - limit (integer, default: 50, max: 500) - offset (integer, default: 0) - start_date (ISO date, optional) - end_date (ISO date, optional)
Response (200 OK):
{
"total": 142,
"limit": 50,
"offset": 0,
"transitions": [
{
"transition_id": "uuid",
"from_mode": "amenable",
"to_mode": "challenge",
"timestamp": "ISO 8601 datetime",
"reason": "Ambiguity detected",
"confidence": 0.8
}
]
}Purpose: Create new artifact from substantial content
Request Body:
{
"title": "string (1-255 chars)",
"content": "string",
"artifact_type": "concept|design|decision|note|constraint",
"board_id": "uuid (optional)",
"categories": ["string"],
"metadata": {}
}Response (201 Created):
{
"artifact_id": "uuid",
"title": "string",
"artifact_type": "string",
"board_id": "uuid",
"categories": ["string"],
"created_at": "ISO 8601 datetime",
"url": "https://app.ethraeon.com/boards/{board_id}/artifacts/{artifact_id}"
}Purpose: Retrieve specific artifact with relationships
Response (200 OK):
{
"artifact_id": "uuid",
"user_id": "uuid",
"board_id": "uuid",
"artifact_type": "design",
"title": "string",
"content": "string",
"categories": ["string"],
"metadata": {},
"relationships": [
{
"target_artifact_id": "uuid",
"relationship_type": "derives_from|contradicts|extends|requires",
"strength": 0.8
}
],
"created_at": "ISO 8601 datetime",
"updated_at": "ISO 8601 datetime"
}Purpose: Update existing artifact
Request Body:
{
"title": "string (optional)",
"content": "string (optional)",
"categories": ["string"] (optional),
"pinned": true (optional)
}Response (200 OK):
{
"success": true,
"artifact_id": "uuid",
"updated_at": "ISO 8601 datetime"
}Purpose: Delete artifact (soft delete)
Response (200 OK):
{
"success": true,
"artifact_id": "uuid",
"deleted_at": "ISO 8601 datetime"
}Purpose: Create explicit relationship between artifacts
Request Body:
{
"target_artifact_id": "uuid",
"relationship_type": "derives_from|contradicts|extends|requires",
"strength": 0.85
}Relationship Types: - derives_from: Target artifact evolved from source - contradicts: Target presents opposing view to source - extends: Target builds upon source - requires: Target depends on source
Response (201 Created):
{
"success": true,
"relationship_id": "uuid",
"source_artifact_id": "uuid",
"target_artifact_id": "uuid",
"relationship_type": "string",
"strength": 0.85,
"created_at": "ISO 8601 datetime"
}Purpose: Create new thematic board
Request Body:
{
"name": "string (1-255 chars)",
"board_type": "strategy|ux|technical|narrative|philosophy|constraints",
"description": "string (optional)",
"spatial_layout": {
"layout_type": "grid|freeform|hierarchical"
}
}Response (201 Created):
{
"board_id": "uuid",
"name": "string",
"board_type": "string",
"url": "https://app.ethraeon.com/boards/{board_id}",
"created_at": "ISO 8601 datetime"
}Purpose: List all boards for user
Query Parameters: - board_type (string, optional) - limit (integer, default: 50) - offset (integer, default: 0)
Response (200 OK):
{
"total": 23,
"boards": [
{
"board_id": "uuid",
"name": "string",
"board_type": "string",
"artifact_count": 47,
"last_accessed": "ISO 8601 datetime",
"url": "https://app.ethraeon.com/boards/{board_id}"
}
]
}Purpose: Retrieve full board with artifacts and spatial layout
Response (200 OK):
{
"board_id": "uuid",
"name": "string",
"board_type": "string",
"description": "string",
"artifacts": [
{
"artifact_id": "uuid",
"title": "string",
"artifact_type": "concept",
"position": {"x": 120, "y": 340}
}
],
"spatial_layout": {
"layout_type": "freeform",
"clusters": [
{
"cluster_id": "uuid",
"artifact_ids": ["uuid1", "uuid2"],
"centroid": {"x": 250, "y": 400}
}
]
},
"created_at": "ISO 8601 datetime",
"last_accessed": "ISO 8601 datetime"
}Purpose: Update board spatial layout
Request Body:
{
"artifacts": [
{
"artifact_id": "uuid",
"position": {"x": 150, "y": 400}
}
],
"clusters": [
{
"cluster_id": "uuid",
"artifact_ids": ["uuid1", "uuid2"],
"centroid": {"x": 300, "y": 450}
}
]
}Response (200 OK):
{
"success": true,
"board_id": "uuid",
"updated_at": "ISO 8601 datetime"
}Purpose: Create new orchestration track
Request Body:
{
"track_name": "string (1-255 chars)",
"track_type": "technical|ux|content|strategy|research",
"description": "string (optional)",
"dependencies": ["uuid"]
}Response (201 Created):
{
"track_id": "uuid",
"track_name": "string",
"track_type": "string",
"status": "active",
"progress": 0.0,
"created_at": "ISO 8601 datetime"
}Purpose: List all tracks with status
Response (200 OK):
{
"total_tracks": 5,
"active_tracks": 3,
"tracks": [
{
"track_id": "uuid",
"track_name": "string",
"track_type": "string",
"status": "active|blocked|ready|completed|paused",
"progress": 0.45,
"next_action": "string",
"dependencies": [
{
"track_id": "uuid",
"track_name": "string",
"status": "completed"
}
]
}
]
}Purpose: Update track state
Request Body:
{
"status": "ready|blocked|completed|paused",
"progress": 0.65,
"next_action": "string"
}Response (200 OK):
{
"success": true,
"track_id": "uuid",
"updated_at": "ISO 8601 datetime"
}Purpose: Get track dependency graph
Response (200 OK):
{
"track_id": "uuid",
"dependencies": [
{
"track_id": "uuid",
"track_name": "string",
"dependency_type": "blocks|enables|informs",
"status": "completed"
}
],
"blocked_by": [],
"blocks": [
{
"track_id": "uuid",
"track_name": "string"
}
]
}| API Endpoint | State Machine Event | State Change |
|---|---|---|
| POST /mode/activate | USER_COMMAND | current_mode → target_mode (IMMEDIATE) |
| POST /mode/evaluate | AMBIGUITY_DETECTED | amenable → challenge (if score > 0.6) |
| POST /mode/evaluate | STRATEGIC_KEYWORDS | amenable → challenge (if detected) |
| POST /mode/evaluate | RESOLUTION_ACHIEVED | challenge → amenable (if finalized) |
| POST /artifacts | SUBSTANTIAL_CONTENT | * → board (if criteria met) |
| POST /tracks | PARALLEL_REQUEST | * → orchestration (if multiple tracks) |
Valid Transitions:
AMENABLE → CHALLENGE, BOARD, ORCHESTRATION
CHALLENGE → AMENABLE, BOARD
BOARD → AMENABLE, ORCHESTRATION
ORCHESTRATION → AMENABLE
Invalid Transitions:
CHALLENGE → ORCHESTRATION (direct)
(Must first return to AMENABLE)
BOARD → CHALLENGE (direct)
(Must first return to AMENABLE)
ORCHESTRATION → CHALLENGE, BOARD (direct)
(Must complete all tracks first)
Header:
Authorization: Bearer {jwt_token}
Token Structure:
{
"user_id": "uuid",
"email": "user@example.com",
"tier": "individual|team|enterprise",
"permissions": ["read", "write", "admin"],
"exp": 1733356800,
"iat": 1733270400
}Header:
X-API-Key: eth_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
| Tier | Requests/Hour | Artifacts/Day | Boards Total | Tracks Concurrent |
|---|---|---|---|---|
| Individual | 1,000 | 100 | 25 | 3 |
| Team | 5,000 | 500 | 100 | 6 |
| Enterprise | 20,000 | Unlimited | Unlimited | 12 |
Response Headers:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 847
X-RateLimit-Reset: 1733360400
{
"error": {
"code": "ERROR_CODE",
"message": "Human-readable error message",
"details": {},
"timestamp": "ISO 8601 datetime",
"request_id": "uuid"
}
}| Code | HTTP Status | Description |
|---|---|---|
| INVALID_TRANSITION | 400 | Requested mode transition not valid |
| RESOURCE_NOT_FOUND | 404 | Artifact, board, or track not found |
| UNAUTHORIZED | 401 | Missing or invalid authentication |
| FORBIDDEN | 403 | Insufficient permissions |
| RATE_LIMIT_EXCEEDED | 429 | Too many requests |
| VALIDATION_ERROR | 422 | Request validation failed |
| INTERNAL_ERROR | 500 | Server error |
import requests
class EthraeonClient:
def __init__(self, api_key):
self.base_url = "https://api.ethraeon.com/v1"
self.headers = {
"X-API-Key": api_key,
"Content-Type": "application/json"
}
def activate_mode(self, mode, reason=None):
response = requests.post(
f"{self.base_url}/mode/activate",
headers=self.headers,
json={"target_mode": mode, "reason": reason}
)
return response.json()
def evaluate_transition(self, user_input, context=None):
response = requests.post(
f"{self.base_url}/mode/evaluate",
headers=self.headers,
json={"user_input": user_input, "context": context or {}}
)
return response.json()
def create_artifact(self, title, content, board_id=None):
response = requests.post(
f"{self.base_url}/artifacts",
headers=self.headers,
json={
"title": title,
"content": content,
"artifact_type": "concept",
"board_id": board_id
}
)
return response.json()
# Usage
client = EthraeonClient("eth_live_your_api_key")
# Activate Challenge Mode
mode = client.activate_mode("challenge", "Strategic decision")
print(f"Mode: {mode['mode_state']['current_mode']}")
# Evaluate automatic transition
eval_result = client.evaluate_transition("Should we go with A or B?")
if eval_result['should_transition']:
print(f"Recommend: {eval_result['target_mode']}")
# Create artifact
artifact = client.create_artifact(
"Feature Prioritization",
"Comprehensive framework for...",
board_id="uuid"
)
print(f"Artifact: {artifact['url']}")class EthraeonAPI {
private apiKey: string;
private baseUrl: string = "https://api.ethraeon.com/v1";
constructor(apiKey: string) {
this.apiKey = apiKey;
}
async activateMode(mode: string, reason?: string) {
const response = await fetch(`${this.baseUrl}/mode/activate`, {
method: "POST",
headers: {
"X-API-Key": this.apiKey,
"Content-Type": "application/json"
},
body: JSON.stringify({ target_mode: mode, reason })
});
return response.json();
}
async evaluateTransition(userInput: string, context?: object) {
const response = await fetch(`${this.baseUrl}/mode/evaluate`, {
method: "POST",
headers: {
"X-API-Key": this.apiKey,
"Content-Type": "application/json"
},
body: JSON.stringify({ user_input: userInput, context: context || {} })
});
return response.json();
}
async createArtifact(title: string, content: string, boardId?: string) {
const response = await fetch(`${this.baseUrl}/artifacts`, {
method: "POST",
headers: {
"X-API-Key": this.apiKey,
"Content-Type": "application/json"
},
body: JSON.stringify({
title,
content,
artifact_type: "concept",
board_id: boardId
})
});
return response.json();
}
}
// Usage
const client = new EthraeonAPI("eth_live_your_api_key");
// Activate Challenge Mode
const mode = await client.activateMode("challenge", "Need alternatives");
console.log(`Mode: ${mode.mode_state.current_mode}`);
// Evaluate transition
const eval = await client.evaluateTransition("Should we go with A or B?");
if (eval.should_transition) {
console.log(`Recommend: ${eval.target_mode}`);
}
// Create artifact
const artifact = await client.createArtifact(
"Feature Prioritization",
"Comprehensive framework...",
"uuid"
);
console.log(`Artifact: ${artifact.url}`);POST /webhooks
Request:
{
"url": "https://your-app.com/webhooks/ethraeon",
"events": [
"mode.activated",
"artifact.created",
"track.completed"
],
"secret": "your_webhook_secret"
}| Event | Fired When |
|---|---|
mode.activated |
Mode transition occurs |
mode.deactivated |
Mode exits |
artifact.created |
New artifact created |
artifact.updated |
Artifact modified |
board.created |
New board created |
track.created |
New track initiated |
track.completed |
Track finishes |
{
"event": "mode.activated",
"timestamp": "ISO 8601 datetime",
"data": {
"user_id": "uuid",
"mode": "challenge",
"reason": "Ambiguity detected"
},
"signature": "hmac_sha256_signature"
}OpenAPI Version: 3.0.0 Title: ETHRAEON Challenge Board Mode API Version: 1.0.0 Base URL: https://api.ethraeon.com/v1
Security Schemes: - bearerAuth (HTTP Bearer JWT) - apiKeyAuth (X-API-Key header)
Tags: - mode - Mode management endpoints - artifacts - Artifact CRUD operations - boards - Board management - tracks - Track orchestration - users - User management - webhooks - Event notifications
⟁ API SPEC v1.0 COMPLETE
Copyright © 2025 S. Jason Prohaska (ingombrante©) All Rights Reserved • Schedule A+ Enhanced IP Protection USPTO Provisional Patent #7 (ETH-2025-001)
END OF CHALLENGE BOARD MODE API SPECIFICATION v1.0