> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.6mm.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.6mm.com/_mcp/server.

# Integração de negociação de segundos

Este guia é dirigido a **Agent Java SDK `v0.3.0`** e Java 8+.

## Preparar a identidade, autenticação e fundos

A negociação em segundos utiliza a mesma ligação de utilizador e autenticação de entrada que a negociação perpétua. Utiliza saldos de financiamento; margem perpétua utiliza saldos contratuais. Configure o produto/modo de front-end e o ambiente de fundos de back-end separadamente.

Inicializar `client` utilizando [Início rápido](/pt-PT/sdk/agent-sdk/java/quick-start). Guarde o mapeamento do utilizador ligado e obtenha o ID do utilizador parceiro na sessão de back-end autenticada.

## Redirecionar entrada

```java
import com.sixmm.agent.model.CreateEntryUrlRequest;
import com.sixmm.agent.model.CreateEntryUrlResponse;

CreateEntryUrlResponse entry = client.createEntryUrl(
        CreateEntryUrlRequest.of("merchant-user-001")
                .withRedirectPath("/zh-CN/up-down?tradingMode=demo")
                .withReturnUrl("https://merchant.example/markets"));
String webUrl = entry.webUrl;
```

O SDK chama `POST /v1/agent/create-entry-url`. Volte a colocar `webUrl` no frontend do parceiro e abra-o imediatamente. `expireAt` utiliza segundos Unix. Um bilhete tem uma vida curta e é único; obter outro após expiração ou consumo.

| Produto              | Exemplo de caminho de front-end                     | Carteira      |
| -------------------- | --------------------------------------------------- | ------------- |
| Para cima/para baixo | `/zh-CN/up-down?tradingMode=real` ou `demo`         | Financiamento |
| Alto/Baixo           | `/zh-CN/high-low?tradingMode=real` ou `demo`        | Financiamento |
| Rede                 | `/zh-CN/grid-prediction?tradingMode=real` ou `demo` | Financiamento |
| Futuros perpétuos    | `/zh-CN/futures/BTCUSDT?tradingMode=real` ou `demo` | Contrato      |

Utilize as rotas de front-end reais fornecidas por 6MM. `redirectPath` é um caminho relativo da plataforma que começa por `/`; `returnUrl` é um parceiro absoluto HTTP/HTTPS URL. Um ticket de entrada autentica o utilizador e não executa uma transferência.

## Entrada incorporada

Utilize o fluxo `partner-token` e `tokenProvider` existente. Não existe um token específico para previsão. Crie o widget com o `page` e `tradingMode` pretendidos e utilize o seu `channelId` atual ao chamar o back-end do parceiro.

```java
import com.sixmm.agent.model.CreateEmbedTokenRequest;
import com.sixmm.agent.model.CreateEmbedTokenResponse;

String channelId = "tw_example_channel";
CreateEmbedTokenResponse auth = client.createEmbedToken(
        CreateEmbedTokenRequest.of("merchant-user-001", channelId));
String embedToken = auth.embedToken;
long expireAt = auth.expireAt;
```

O SDK chama `POST /v1/agent/create-embed-token`. `symbol` é opcional; não escolhe um produto de negociação de segundos. A seleção do produto pertence ao frontend. O token não seleciona um ambiente de fundos nem altera saldos.

## Exemplo completo de front-end

Estas opções foram verificadas em relação ao tempo de execução público Trading Widget `1.8.0` no dia 10/10/2026. As versões do widget e do Agent Java SDK são independentes.

```html
<div id="seconds-widget" style="width: 100%; height: 720px"></div>
<script src="https://app.6mm.com/sdk/trading-widget/v1/index.js"></script>
<script>
  const page = 'up-down';
  const tradingMode = 'demo';
  const capabilities = TradingWidget.capabilities;
  if (!capabilities?.partnerToken ||
      !capabilities.pages?.includes(page) ||
      !capabilities.tradingModes?.includes(tradingMode)) {
    throw new Error('Trading Widget SDK does not support the requested page or mode');
  }

  const widget = TradingWidget.create('#seconds-widget', {
    baseUrl: 'https://app.6mm.com',
    page,
    tradingMode,
    theme: 'dark',
    locale: 'zh-CN',
    auth: {
      mode: 'partner-token',
      tokenProvider: async ({ channelId }) => {
        // Partner-owned endpoint; derive the user from the backend session.
        const response = await fetch('/api/seconds/embed-token', {
          method: 'POST',
          credentials: 'same-origin',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ channelId }),
        });
        if (!response.ok) {
          throw new Error('Failed to request embed token');
        }
        const result = await response.json();
        if (typeof result.embedToken !== 'string' || !result.embedToken.trim() ||
            !Number.isFinite(result.expireAt) || result.channelId !== channelId) {
          throw new Error('Invalid embed token response');
        }
        return {
          embedToken: result.embedToken,
          expireAt: result.expireAt,
          channelId: result.channelId,
        };
      },
    },
    onReady() {
      console.log('Trading widget ready');
    },
    onError(error) {
      console.error('Trading widget error', error.code);
    },
  });
  window.addEventListener('beforeunload', () => widget.destroy());
</script>
```

| Opção         | Valores                                  | Significado                                                                 |
| ------------- | ---------------------------------------- | --------------------------------------------------------------------------- |
| `page`        | `up-down`, `high-low`, `grid-prediction` | Página do produto.                                                          |
| `tradingMode` | `real`, `demo`                           | O predefinido é `real`; definido explicitamente.                            |
| `baseUrl`     | `https://app.6mm.com`                    | Origem do frontend da plataforma; o Widget constrói a sua incorporação URL. |

## Resposta de back-end do parceiro

`/api/seconds/embed-token` é um endpoint propriedade do parceiro, e não um novo 6MM API. Autentique a sessão, derive `agentUserId` do lado do servidor e chame `createEmbedToken`. Devolver esta estrutura de nível superior:

```json
{
  "embedToken": "short-one-time-token",
  "expireAt": 1791590700,
  "channelId": "tw_xxx"
}
```

Utilize o `expireAt` real da resposta do agente, e não o valor ilustrativo. A resposta do agente não contém `channelId`; o seu backend ecoa o valor do pedido atual. Se o seu API agrupar os resultados em `data`, desembrulhe essa camada antes de voltar de tokenProvider. Rejeite falhas de negócio em vez de devolver um objeto de sucesso inválido.

Cada inicialização ou renovação obtém um novo token. Nunca armazene em cache e troque novamente o mesmo token ou coloque-o num URL. Reutilize o mesmo canal de instância durante a renovação; utilize o novo canal após recriar a instância.

## Combine o ambiente dos fundos

Um frontend `demo` requer pedidos de fundos simulados com `environment=SIMULATED`. Um frontend `real` requer fundos de produção. Nem `tradingMode` nem a criação de tokens alteram o objetivo de fundos de back-end.

Ao trocar de utilizador ou de modo de negociação, destrua o widget antigo e crie uma nova instância. Consulte os saldos de financiamento, transfira fundos e confirme o resultado final através do endpoint de estado específico do financiamento antes de tratar o utilizador como financiado.

Ver [Carteira de financiamento](/pt-PT/sdk/agent-sdk/java/funding-wallet) e [Guia ambiental](/pt-PT/sdk/agent-sdk/java/environments).

## Fonte e guias relacionados

* [Fonte oficial v0.3.0](https://github.com/6mm-com/agent-java-sdk/tree/54aa3c1)
* [Visão geral da consulta e paginação](/pt-PT/sdk/agent-sdk/java/perpetual-queries)
* [Carteira de financiamento](/pt-PT/sdk/agent-sdk/java/funding-wallet)
* [Guia de atualização](/pt-PT/sdk/agent-sdk/java/upgrade)