Formatos de contenido y medios

Trabaja con contenido de texto enriquecido en JSON, HTML o Markdown, y extrae URLs de medios de tus entradas de diario.

Soporte multi-formato de contenido

Todos los endpoints con contenido del editor de texto enriquecido soportan tres formatos para máxima flexibilidad:

  • TipTap JSON (formato nativo)
  • HTML (para visualización web)
  • Markdown (para herramientas externas y servidores MCP)

Endpoints soportados:

  • Planes de Operación (/api/v1/trade-plans)
  • Análisis de Operaciones (/api/v1/trade-writeups)
  • Estrategias (/api/v1/strategies)
  • Tarjetas de Reporte (/api/v1/report-cards)
  • Playbooks (/api/v1/playbooks)

Leer contenido en diferentes formatos

Usando el parámetro format

Agrega ?format=json|html|markdown a cualquier solicitud GET:

# Obtener contenido como HTML
GET /api/v1/trade-plans/123?format=html

# Obtener contenido como Markdown
GET /api/v1/trade-writeups/456?format=markdown

# Obtener los tres formatos (predeterminado)
GET /api/v1/strategies/789

Formatos de respuesta

Predeterminado (formato JSON):

Cuando format=json o se omite, recibes las tres versiones:

{
  "data": {
    "id": "123",
    "title": "Mi Plan de Operación",
    "content": { ... },
    "content_html": "<p>Este es un plan de operación.</p>",
    "content_markdown": "Este es un plan de operación."
  }
}

Escribir contenido en diferentes formatos

Al crear o actualizar entradas, puedes enviar contenido en cualquier formato:

// Opción 1: TipTap JSON (nativo)
await fetch('https://app.mypropjournal.com/api/v1/trade-plans', {
  method: 'POST',
  body: JSON.stringify({
    title: 'Mi Plan',
    content: { type: 'doc', content: [...] }
  })
});

// Opción 2: HTML
await fetch('https://app.mypropjournal.com/api/v1/trade-plans', {
  method: 'POST',
  body: JSON.stringify({
    title: 'Mi Plan',
    content_html: '<p>Detalles del plan</p>'
  })
});

// Opción 3: Markdown
await fetch('https://app.mypropjournal.com/api/v1/trade-plans', {
  method: 'POST',
  body: JSON.stringify({
    title: 'Mi Plan',
    content_markdown: '# Detalles del Plan\n\nEsto es **importante**.'
  })
});

Extracción de medios

Extrae automáticamente todas las URLs de imágenes y videos de tu contenido sin necesidad de analizar.

Usando include_media

Agrega ?include_media=true a cualquier solicitud GET:

GET /api/v1/trade-plans/123?include_media=true
GET /api/v1/trade-writeups?format=markdown&include_media=true

Formato de respuesta

{
  "data": {
    "id": "123",
    "title": "Mi Plan de Operación",
    "content": { ... },
    "media": {
      "images": [
        "https://example.com/grafico1.jpg",
        "https://example.com/configuracion.png"
      ],
      "videos": [
        {
          "src": "https://www.youtube.com/embed/abc123",
          "originalUrl": "https://www.youtube.com/watch?v=abc123"
        }
      ],
      "all": [
        "https://example.com/grafico1.jpg",
        "https://example.com/configuracion.png",
        "https://www.youtube.com/watch?v=abc123"
      ]
    }
  }
}

Casos de uso

Construir una galería

const response = await fetch(
  'https://app.mypropjournal.com/api/v1/trade-writeups/123?include_media=true',
  { headers: { 'Authorization': 'Bearer mpj_tu_clave_api' } }
);

const data = await response.json();
const images = data.data.media.images;

// Mostrar en un componente de galería
images.forEach(url => {
  const img = document.createElement('img');
  img.src = url;
  document.getElementById('gallery').appendChild(img);
});

Integración con servidor MCP

import requests

# Obtener plan de operación como Markdown para consumo de LLM
response = requests.get(
    'https://app.mypropjournal.com/api/v1/trade-plans/123?format=markdown',
    headers={'Authorization': f'Bearer {api_key}'}
)

trade_plan = response.json()['data']
markdown_content = trade_plan['content']

# Usar markdown en prompts de LLM
print(f"# {trade_plan['title']}\n\n{markdown_content}")

Siguientes pasos