Skip to main content
Glama

get_event_participants

Retrieve participants of a Hotmart event. Filter by email, ticket status, check-in status, or e-ticket details.

Instructions

Event Participants

Retorna os participantes de um evento.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
event_idYesID do evento
max_resultsNoNúmero máximo de resultados por página
page_tokenNoToken de paginação para a próxima página
buyer_emailNoE-mail do comprador
participant_emailNoE-mail do participante
last_updateNoÚltima atualização (timestamp em milissegundos)
id_lotNoID do lote
ticket_statusNoStatus do ingresso. Values: SOLD, INVITE, INVITE_CANCELED, REFUNDED, CHARGEBACK, EXCLUDED, AVAILABLE, RESERVED
ticket_typeNoTipo do ingresso. Values: PAID, FREE, ALL
checkin_statusNoStatus do check-in. Values: PENDING, PARTIAL, CONCLUDED, ALL
id_eticketNoID do e-ticket
ticket_qr_codeNoQR code do ingresso
selectNoSeleção de campos customizados na resposta

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Implementation Reference

  • The async function get_event_participants that implements the tool logic. It builds query params from optional arguments, calls the Hotmart API endpoint /events/api/v1/{event_id}/participants via get_client().get(), and returns the JSON result.
    async def get_event_participants(
        event_id: int,
        max_results: Optional[int] = None,
        page_token: Optional[str] = None,
        buyer_email: Optional[str] = None,
        participant_email: Optional[str] = None,
        last_update: Optional[int] = None,
        id_lot: Optional[int] = None,
        ticket_status: Optional[str] = None,
        ticket_type: Optional[str] = None,
        checkin_status: Optional[str] = None,
        id_eticket: Optional[int] = None,
        ticket_qr_code: Optional[str] = None,
        select: Optional[str] = None,
    ) -> str:
        """Event Participants
        
        Retorna os participantes de um evento.
        
        Args:
            event_id: ID do evento
            max_results: Número máximo de resultados por página
            page_token: Token de paginação para a próxima página
            buyer_email: E-mail do comprador
            participant_email: E-mail do participante
            last_update: Última atualização (timestamp em milissegundos)
            id_lot: ID do lote
            ticket_status: Status do ingresso. Values: SOLD, INVITE, INVITE_CANCELED, REFUNDED, CHARGEBACK, EXCLUDED, AVAILABLE, RESERVED
            ticket_type: Tipo do ingresso. Values: PAID, FREE, ALL
            checkin_status: Status do check-in. Values: PENDING, PARTIAL, CONCLUDED, ALL
            id_eticket: ID do e-ticket
            ticket_qr_code: QR code do ingresso
            select: Seleção de campos customizados na resposta"""
        endpoint = f"/events/api/v1/{event_id}/participants"
        params = {}
        if max_results is not None:
            params["max_results"] = max_results
        if page_token is not None:
            params["page_token"] = page_token
        if buyer_email is not None:
            params["buyer_email"] = buyer_email
        if participant_email is not None:
            params["participant_email"] = participant_email
        if last_update is not None:
            params["last_update"] = last_update
        if id_lot is not None:
            params["id_lot"] = id_lot
        if ticket_status is not None:
            params["ticket_status"] = ticket_status
        if ticket_type is not None:
            params["ticket_type"] = ticket_type
        if checkin_status is not None:
            params["checkin_status"] = checkin_status
        if id_eticket is not None:
            params["id_eticket"] = id_eticket
        if ticket_qr_code is not None:
            params["ticket_qr_code"] = ticket_qr_code
        if select is not None:
            params["select"] = select
        result = await get_client().get(endpoint, params=params)
        return json.dumps(result, indent=2)
  • The _discover_and_register_tools function that auto-discovers all async functions in the tools package and registers them with FastMCP via mcp.tool()(obj). This dynamically registers get_event_participants as an MCP tool.
    def _discover_and_register_tools() -> int:
        """Import all modules under hotmart_mcp.tools and register async functions."""
        registered = 0
    
        for module_info in pkgutil.iter_modules(tools_pkg.__path__, prefix=f"{tools_pkg.__name__}."):
            if module_info.name.endswith("__init__"):
                continue
    
            module = importlib.import_module(module_info.name)
    
            for name, obj in inspect.getmembers(module, iscoroutinefunction):
                if name.startswith("_"):
                    continue
                mcp.tool()(obj)
                registered += 1
    
        return registered
  • The get_client() helper that provides a shared lazy singleton HotmartClient instance used by the handler to make API calls.
    def get_client() -> HotmartClient:
        global _client
        if _client is None:
            _client = HotmartClient()
        return _client
  • The function signature serves as the schema: event_id (int, required), plus many optional parameters (max_results, page_token, buyer_email, participant_email, last_update, id_lot, ticket_status, ticket_type, checkin_status, id_eticket, ticket_qr_code, select) defining the expected inputs.
    async def get_event_participants(
        event_id: int,
        max_results: Optional[int] = None,
        page_token: Optional[str] = None,
        buyer_email: Optional[str] = None,
        participant_email: Optional[str] = None,
        last_update: Optional[int] = None,
        id_lot: Optional[int] = None,
        ticket_status: Optional[str] = None,
        ticket_type: Optional[str] = None,
        checkin_status: Optional[str] = None,
        id_eticket: Optional[int] = None,
        ticket_qr_code: Optional[str] = None,
        select: Optional[str] = None,
    ) -> str:
        """Event Participants
        
        Retorna os participantes de um evento.
        
        Args:
            event_id: ID do evento
            max_results: Número máximo de resultados por página
            page_token: Token de paginação para a próxima página
            buyer_email: E-mail do comprador
            participant_email: E-mail do participante
            last_update: Última atualização (timestamp em milissegundos)
            id_lot: ID do lote
            ticket_status: Status do ingresso. Values: SOLD, INVITE, INVITE_CANCELED, REFUNDED, CHARGEBACK, EXCLUDED, AVAILABLE, RESERVED
            ticket_type: Tipo do ingresso. Values: PAID, FREE, ALL
            checkin_status: Status do check-in. Values: PENDING, PARTIAL, CONCLUDED, ALL
            id_eticket: ID do e-ticket
            ticket_qr_code: QR code do ingresso
            select: Seleção de campos customizados na resposta"""
        endpoint = f"/events/api/v1/{event_id}/participants"
        params = {}
        if max_results is not None:
            params["max_results"] = max_results
        if page_token is not None:
            params["page_token"] = page_token
        if buyer_email is not None:
            params["buyer_email"] = buyer_email
        if participant_email is not None:
            params["participant_email"] = participant_email
        if last_update is not None:
            params["last_update"] = last_update
        if id_lot is not None:
            params["id_lot"] = id_lot
        if ticket_status is not None:
            params["ticket_status"] = ticket_status
        if ticket_type is not None:
            params["ticket_type"] = ticket_type
        if checkin_status is not None:
            params["checkin_status"] = checkin_status
        if id_eticket is not None:
            params["id_eticket"] = id_eticket
        if ticket_qr_code is not None:
            params["ticket_qr_code"] = ticket_qr_code
        if select is not None:
            params["select"] = select
        result = await get_client().get(endpoint, params=params)
        return json.dumps(result, indent=2)
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, and the description only states it returns participants. No disclosure of behavioral traits (e.g., read-only nature, pagination behavior, authorization needs, or side effects).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise (two lines) and front-loaded with the title and purpose. No wasted words, but it could be expanded slightly for clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is too brief given the complexity (13 parameters, filtering, pagination). An output schema exists, but the description does not explain filtering options or pagination behavior, leaving gaps for effective usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with all parameters described individually. The description adds no extra meaning beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns participants of an event ("Retorna os participantes de um evento"). The verb 'returns' and resource 'participants' are specific, but it does not differentiate from sibling tools like get_sales_participants or get_students.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. Sibling tools exist for related but different resources (e.g., sales, students), but no explicit when/when-not or exclusions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/thaleslaray/hotmart-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server