MY PROP JOURNAL

Trade write-ups

Create and manage post-trade analysis with rich text content and media support.

Overview

Trade Write-ups provide detailed post-trade analysis, including what went well, mistakes made, lessons learned, and chart screenshots. Each write-up supports rich text with images and videos.

Key features:

  • Link to specific trades
  • Multi-format content (JSON/HTML/Markdown)
  • Media URL extraction
  • Tagging and categorization
  • Full-text search

List trade write-ups

Retrieve a paginated list of trade write-ups with filtering options.

Endpoint: GET /api/v1/trade-writeups

Query parameters

ParameterTypeDescription
offsetintegerPagination offset (default 0)
limitintegerItems per page, max 100 (default 20)
trade_group_idstringFilter by linked trade group UUID
account_idstringFilter by account UUID
tagsstringComma-separated tag IDs
account_categorystringFilter by account type: prop or retail
start_datestringFilter writeups from this date (ISO 8601)
end_datestringFilter writeups until this date (ISO 8601)
searchstringSearch in title and content
formatstringContent format: json, html, or markdown
content_formatstringAlias for format
include_mediabooleanInclude media URLs (default false)

Example request

curl "https://app.mypropjournal.com/api/v1/trade-writeups?start_date=2026-05-01&format=html&include_media=true" \
  -H "Authorization: Bearer mpj_your_api_key_here"

Example response

{
  "data": [
    {
      "id": "abc-123",
      "trade_group_id": "trade-456",
      "title": "NQ Short - Lesson in Patience",
      "content": "<h2>What Went Well</h2><p>Entry was perfect...</p>",
      "media": {
        "images": ["https://storage.com/chart1.png"],
        "videos": [],
        "all": ["https://storage.com/chart1.png"]
      },
      "created_at": "2026-05-10T18:00:00Z"
    }
  ],
  "pagination": {
    "total": 23,
    "limit": 20,
    "offset": 0,
    "has_more": true
  }
}

Get single trade write-up

Endpoint: GET /api/v1/trade-writeups/{id}

Query parameters

ParameterTypeDescription
formatstringContent format: json, html, or markdown
include_mediabooleanInclude media URLs

Example

curl "https://app.mypropjournal.com/api/v1/trade-writeups/abc-123?format=markdown&include_media=true" \
  -H "Authorization: Bearer mpj_your_api_key_here"

Create trade write-up

Endpoint: POST /api/v1/trade-writeups

Request body

FieldTypeRequiredDescription
trade_idstringNoLink to a specific trade
titlestringYesWrite-up title
contentobjectNoTipTap JSON content
content_htmlstringNoHTML content
content_markdownstringNoMarkdown content

Example

await fetch('https://app.mypropjournal.com/api/v1/trade-writeups', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer mpj_your_api_key',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    trade_id: '550e8400-e29b-41d4-a716-446655440000',
    title: 'ES Trade - Overtrading Analysis',
    content_markdown: `**What Went Well:**
- Entry was at planned level
- Risk management followed perfectly

**Mistakes Made:**
- Took profit too early (fear)
- Could have held for T2

**Lessons Learned:**
Trust the plan. Let winners run.

**Action Items:**
- Review trailing stop strategy
- Practice holding through minor pullbacks
`
  })
});

Update trade write-up

Endpoint: PUT /api/v1/trade-writeups/{id}

Only include fields you want to update.

Example

curl -X PUT "https://app.mypropjournal.com/api/v1/trade-writeups/abc-123" \
  -H "Authorization: Bearer mpj_your_api_key_here" \
  -H "Content-Type": application/json" \
  -d '{
    "title": "Updated: ES Trade Analysis",
    "content_html": "<h2>Additional Notes</h2><p>Reviewed with mentor...</p>"
  }'

Delete trade write-up

Endpoint: DELETE /api/v1/trade-writeups/{id}

Cascade Delete Warning

Deleting a trade write-up will permanently cascade delete the following related data:

  • All tag associations for this write-up

This action cannot be undone. The API response will include warnings about what data was affected.

curl -X DELETE "https://app.mypropjournal.com/api/v1/trade-writeups/abc-123" \
  -H "Authorization: Bearer mpj_your_api_key_here"

Use cases

Weekly review export

import requests
from datetime import datetime, timedelta

def export_weekly_writeups(api_key):
    """Export last week's writeups as Markdown"""
    end_date = datetime.now().isoformat()
    start_date = (datetime.now() - timedelta(days=7)).isoformat()
    
    response = requests.get(
        'https://app.mypropjournal.com/api/v1/trade-writeups',
        headers={'Authorization': f'Bearer {api_key}'},
        params={
            'start_date': start_date,
            'end_date': end_date,
            'format': 'markdown',
            'limit': 100
        }
    )
    
    writeups = response.json()['data']
    
    # Compile into single document
    weekly_review = f"# Weekly Review ({start_date[:10]} to {end_date[:10]})\n\n"
    
    for writeup in writeups:
        weekly_review += f"## {writeup['title']}\n\n"
        weekly_review += f"{writeup['content']}\n\n---\n\n"
    
    return weekly_review

review = export_weekly_writeups('mpj_your_key')
print(review)

Automated analysis with AI

// Get all writeups and analyze patterns
const response = await fetch(
  'https://app.mypropjournal.com/api/v1/trade-writeups?format=markdown&limit=100',
  {
    headers: { 'Authorization': 'Bearer mpj_your_api_key' }
  }
);

const writeups = (await response.json()).data;

// Extract all "Mistakes Made" sections
const mistakes = writeups.map(w => {
  const match = w.content.match(/## Mistakes Made\n([\s\S]*?)(?=##|$)/);
  return match ? match[1].trim() : '';
}).filter(Boolean);

// Send to Claude for pattern analysis
const analysis = await analyzeWithClaude(mistakes.join('\n\n---\n\n'));
console.log('Common patterns:', analysis);

Next steps