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
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
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
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
- Content Formats — Multi-format content and media extraction
- Trades — Link writeups to specific trades
- Trading Plans — Trading business plans