Luna SaludReferencia de la APILuna Salud

Crear una cita

POST/appointments

Agenda una cita presencial para un paciente existente de su organización con un profesional de salud y un servicio. La hora de fin se calcula con la duración del servicio. La hora de inicio debe ser futura, estar dentro de la disponibilidad del profesional y estar libre; use GET /availability para encontrar horarios disponibles. Si reintenta una solicitud idéntica, recibe la cita ya creada en lugar de un duplicado. La cita se crea como CONFIRMED y no se envía confirmación ni recordatorios al paciente. Requiere una clave de API con permiso de escritura.

Ejemplos de código

Node.js

const fetch = require('node-fetch');

async function llamarApi() {
  const claveApi = 'YOUR_API_KEY';
  const url = `https://account.lunahealth.app/api/appointments`;
  const requestBody = {
    // Agregue sus datos del cuerpo de la solicitud aquí
  };

  try {
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${claveApi}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(requestBody)
    });
    
    if (!response.ok) {
      throw new Error(`API error: ${response.status}`);
    }
    
    const data = await response.json();
    console.log(data);
    return data;
  } catch (error) {
    console.error('Error al llamar a la API:', error);
    throw error;
  }
}

llamarApi();

Python

import requests

def llamarApi():
    claveApi = 'YOUR_API_KEY'
    
    url = 'https://account.lunahealth.app/api/appointments'
    
    headers = {
        'Authorization': f'Bearer {claveApi}',
        'Content-Type': 'application/json'
    }
    
    params = {

    }
    
    # Agregue sus datos del cuerpo de la solicitud aquí
    request_body = {}
        try:
        response = requests.post(
            url,
            headers=headers,
            params=params,
            json=request_body
        )
        response.raise_for_status()
        
        data = response.json()
        print(data)
        return data
    except requests.exceptions.RequestException as e:
        print(f'Error al llamar a la API: {e}')
        raise

llamarApi()

Cuerpo de la solicitud

Requerido

Campos de la solicitud

NombreTipoRequeridoDescripción
patientIdstringSíID del paciente
staffIdstringSíID del profesional de salud que atenderá al paciente
serviceIdstringSíID del servicio; su duración define la hora de fin
startTimestring (date-time)SíHora de inicio en ISO 8601 con desfase UTC, por ejemplo un start_time de GET /availability
locationIdstringNoID de la sucursal donde será la cita
reasonForVisitstringNoMotivo de la consulta, visible para el personal

Ejemplo de solicitud

{
  "patientId": "string",
  "staffId": "string",
  "serviceId": "string",
  "startTime": "2025-01-01T00:00:00Z",
  "locationId": "string",
  "reasonForVisit": "string"
}

Respuestas

EstadoDescripción
200Respuesta exitosa
400Datos de entrada no válidos
401Autorización no proporcionada
403Acceso insuficiente
500Error interno del servidor

200 — Respuesta exitosa

Campos de la respuesta

NombreTipoRequeridoDescripción
idstringSí—
statusstringSí—
typestringSí—
titlestringnullSí—
descriptionstringnullSí—
start_timestringSí—
end_timestringSí—
telemedicinebooleanSí—
created_atstringSí—
updated_atstringSí—
patientobject | nullSí—
staffsarray<object>Sí—
serviceobject | nullSí—
locationobject | nullSí—

Ejemplo de respuesta

{
  "id": "string",
  "status": "NEW",
  "type": "APPOINTMENT",
  "title": null,
  "description": null,
  "start_time": "string",
  "end_time": "string",
  "telemedicine": true,
  "created_at": "string",
  "updated_at": "string",
  "patient": {
    "id": "string",
    "first_name": null,
    "last_name": null,
    "email": null
  },
  "staffs": [
    {
      "id": "string",
      "first_name": null,
      "last_name": null
    }
  ],
  "service": {
    "id": "string",
    "name": "string"
  },
  "location": {
    "id": "string",
    "name": null
  }
}

400 — Datos de entrada no válidos

Campos de la respuesta

NombreTipoRequeridoDescripción
messagestringSíThe error message
codestringSíThe error code
issuesarray<object>NoAn array of issues that were responsible for the error

Ejemplo de respuesta

{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}

401 — Autorización no proporcionada

Campos de la respuesta

NombreTipoRequeridoDescripción
messagestringSíThe error message
codestringSíThe error code
issuesarray<object>NoAn array of issues that were responsible for the error

Ejemplo de respuesta

{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}

403 — Acceso insuficiente

Campos de la respuesta

NombreTipoRequeridoDescripción
messagestringSíThe error message
codestringSíThe error code
issuesarray<object>NoAn array of issues that were responsible for the error

Ejemplo de respuesta

{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}

500 — Error interno del servidor

Campos de la respuesta

NombreTipoRequeridoDescripción
messagestringSíThe error message
codestringSíThe error code
issuesarray<object>NoAn array of issues that were responsible for the error

Ejemplo de respuesta

{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}