http://localhost:3001/api
All endpoints except authentication require a JWT token in the Authorization header:
Authorization: Bearer <token>
POST /auth/register
Content-Type: application/json
{
"username": "string",
"password": "string",
"email": "string (optional)"
}Response:
{
"token": "jwt_token_string",
"user": {
"id": "uuid",
"username": "string",
"email": "string"
}
}POST /auth/login
Content-Type: application/json
{
"username": "string",
"password": "string"
}Response:
{
"token": "jwt_token_string",
"user": {
"id": "uuid",
"username": "string",
"email": "string"
}
}GET /personas
Authorization: Bearer <token>Response:
[
{
"id": "uuid",
"user_id": "uuid",
"name": "string",
"type": "synthetic_user" | "advisor",
"description": "string",
"avatar_url": "string",
"metadata": {},
"created_at": "timestamp",
"updated_at": "timestamp"
}
]GET /personas/:id
Authorization: Bearer <token>POST /personas
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "string",
"type": "synthetic_user" | "advisor",
"description": "string",
"avatar_url": "string",
"metadata": {}
}PUT /personas/:id
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "string (optional)",
"description": "string (optional)",
"avatar_url": "string (optional)",
"metadata": {} (optional)
}DELETE /personas/:id
Authorization: Bearer <token>GET /personas/:personaId/files
Authorization: Bearer <token>Response:
[
{
"id": "uuid",
"persona_id": "uuid",
"name": "string",
"content": "string",
"type": "markdown" | "pdf_analysis" | "linked_in_profile",
"created_at": "timestamp"
}
]POST /personas/:personaId/files
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "string",
"content": "string",
"type": "markdown" | "pdf_analysis" | "linked_in_profile"
}GET /chat/sessions
Authorization: Bearer <token>Response:
[
{
"id": "uuid",
"user_id": "uuid",
"name": "string",
"created_at": "timestamp",
"updated_at": "timestamp"
}
]GET /chat/sessions/:id
Authorization: Bearer <token>POST /chat/sessions
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "string",
"personaIds": ["uuid", "uuid"]
}PUT /chat/sessions/:id
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "string"
}DELETE /chat/sessions/:id
Authorization: Bearer <token>GET /chat/sessions/:sessionId/personas
Authorization: Bearer <token>GET /chat/sessions/:sessionId/messages
Authorization: Bearer <token>Response:
[
{
"id": "uuid",
"session_id": "uuid",
"sender_type": "user" | "persona",
"persona_id": "uuid (optional)",
"content": "string",
"created_at": "timestamp"
}
]POST /chat/sessions/:sessionId/messages
Authorization: Bearer <token>
Content-Type: application/json
{
"sender_type": "user" | "persona",
"persona_id": "uuid (optional, required if sender_type is persona)",
"content": "string"
}GET /simulations
Authorization: Bearer <token>Response:
[
{
"id": "uuid",
"user_id": "uuid",
"persona_id": "uuid",
"mode": "web_page" | "marketing" | "sales_pitch" | "investor_pitch",
"bg_info": "string",
"opening_line": "string (optional)",
"stimulus_image": "string (optional)",
"mime_type": "string (optional)",
"name": "string",
"created_at": "timestamp",
"updated_at": "timestamp"
}
]GET /simulations/:id
Authorization: Bearer <token>POST /simulations
Authorization: Bearer <token>
Content-Type: application/json
{
"persona_id": "uuid",
"mode": "web_page" | "marketing" | "sales_pitch" | "investor_pitch",
"bg_info": "string",
"opening_line": "string (optional)",
"stimulus_image": "string (optional)",
"mime_type": "string (optional)",
"name": "string"
}PUT /simulations/:id
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "string (optional)",
"bg_info": "string (optional)",
"opening_line": "string (optional)",
"stimulus_image": "string (optional)",
"mime_type": "string (optional)"
}DELETE /simulations/:id
Authorization: Bearer <token>All errors follow this format:
{
"error": "Error message description"
}Status Codes:
200- Success201- Created204- No Content (successful delete)400- Bad Request401- Unauthorized403- Forbidden404- Not Found409- Conflict (e.g., username already exists)500- Internal Server Error