Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.corti.ai/llms.txt

Use this file to discover all available pages before exploring further.

Use this page when you want end-to-end examples that combine multiple Embedded API methods into a realistic integration flow.
These workflows complement the individual method reference pages. Use the method pages when you need payload details, validation rules, or return shapes for one specific method.

Initialize and start recording

In the examples below, api refers to your Embedded API instance.
  • Web Component / vanilla: const api = document.querySelector("corti-embedded");
  • React: const api = useCortiEmbeddedApi(cortiRef);
navigate({ path: ... }) is used for cross-surface consistency.
  • On @corti/embedded-web versions earlier than 0.3.0, use navigate("/session/...").
  • On @corti/embedded-web@0.3.0 and later, both shapes are accepted.
try {
  // 1. Authenticate
  const user = await api.auth({
    access_token: "...",
    refresh_token: "...",
    id_token: "...",
    token_type: "Bearer",
  });
  console.log("Authenticated as:", user.email);

  // 2. Configure app-level settings (optional)
  await api.configureApp({
    locale: { dictationLanguage: "en" },
  });

  // 3. Configure interaction defaults (optional)
  await api.setInteractionOptions({
    mode: {
      fallback: "virtual",
      options: ["in-person", "virtual"],
    },
  });

  // 4. Create interaction
  const interaction = await api.createInteraction({
    encounter: {
      identifier: "enc-123",
      status: "planned",
      type: "ambulatory",
      period: { startedAt: new Date().toISOString() },
      title: "Patient Visit",
    },
  });

  // 5. Navigate to the session
  await api.navigate({ path: `/session/${interaction.id}` });

  // 6. Start recording
  await api.startRecording();
} catch (error) {
  console.error("Workflow failed:", error.message, error.code);
}

Handle recording startup errors

async function startRecordingWithRetry() {
  try {
    await api.startRecording();
  } catch (error) {
    switch (error.code) {
      case "UNAUTHORIZED":
        await reauthenticate();
        await api.startRecording();
        break;

      case "NOT_READY":
        if (error.message.includes("createInteraction")) {
          await api.createInteraction({
            encounter: {
              identifier: `enc-${Date.now()}`,
              status: "planned",
              type: "ambulatory",
              period: { startedAt: new Date().toISOString() },
            },
          });
          await api.startRecording();
        }
        break;

      default:
        console.error("Unexpected error:", error);
    }
  }
}

Complete session lifecycle

let currentInteractionId = null;

async function initializeSession() {
  await api.auth({
    /* tokens */
  });

  await api.configureApp({
    ui: {
      aiChat: true,
    },
  });

  await api.setInteractionOptions({
    mode: {
      fallback: "virtual",
      options: ["in-person", "virtual"],
    },
    spokenLanguage: {
      fallback: "en-US",
    },
  });
}

async function startNewInteraction(encounterData) {
  const interaction = await api.createInteraction({
    encounter: encounterData,
  });
  currentInteractionId = interaction.id;

  await api.addFacts([
    { text: "Chief complaint: Headache", group: "symptoms" },
  ]);

  await api.navigate({ path: `/session/${interaction.id}` });
  await api.startRecording();
  return interaction;
}

async function endInteraction() {
  await api.stopRecording();
  const status = await api.getStatus();
  return status.interaction;
}