> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ringg.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> To search or read these docs, connect the Ringg docs MCP server at https://docs.ringg.ai/mcp (no key needed; tools search_ringg_ai and query_docs_filesystem_ringg_ai) instead of browsing pages one by one. Setup for each client: https://docs.ringg.ai/resources/mcp-server/docs-mcp-server/mcp-for-ai-assistants.md
> The dashboard labels agents "Assistants"; these docs say "agent". Both mean the same object, identified by agent_id.
> API base URL: https://prod-api.ringg.ai/ca/api/v0. Send the workspace API key in the X-API-KEY header, from server-side code only.
> Placing a call dials a real phone number and spends credits. Confirm the number with the user before calling.
> To act on a Ringg workspace (place calls, edit agents, read transcripts), use the separate Ringg workspace MCP server at https://mcp.ringg.ai/mcp: https://docs.ringg.ai/resources/mcp-server/workspace-mcp-server/overview.md

# Lesson: What Ringg is

> Learn what a Ringg AI agent is, which channel it talks on (outbound, inbound, webcall or WhatsApp), and why Acme Lending's EMI reminder is an outbound agent.

export const Quiz = ({question, answers, correctFeedback, incorrectFeedback}) => {
  const [selected, setSelected] = React.useState(null);
  const [checked, setChecked] = React.useState(false);
  const quizId = React.useId();
  const isCorrect = checked && answers[selected]?.correct;
  const reset = () => {
    setSelected(null);
    setChecked(false);
  };
  const optionStyle = (answer, i) => {
    const base = {
      display: "flex",
      alignItems: "flex-start",
      gap: "0.6rem",
      padding: "0.6rem 0.8rem",
      marginTop: "0.5rem",
      borderRadius: "0.6rem",
      border: "1px solid rgba(128, 128, 128, 0.35)",
      cursor: checked ? "default" : "pointer",
      lineHeight: 1.45
    };
    if (checked && answer.correct) {
      return {
        ...base,
        borderColor: "rgba(22, 163, 74, 0.8)",
        background: "rgba(22, 163, 74, 0.12)"
      };
    }
    if (checked && selected === i && !answer.correct) {
      return {
        ...base,
        borderColor: "rgba(220, 38, 38, 0.8)",
        background: "rgba(220, 38, 38, 0.1)"
      };
    }
    if (!checked && selected === i) {
      return {
        ...base,
        borderColor: "currentColor",
        background: "rgba(128, 128, 128, 0.12)"
      };
    }
    return base;
  };
  const buttonStyle = disabled => ({
    marginTop: "0.9rem",
    padding: "0.45rem 0.9rem",
    borderRadius: "0.5rem",
    border: "1px solid rgba(128, 128, 128, 0.5)",
    background: "rgba(128, 128, 128, 0.1)",
    color: "inherit",
    font: "inherit",
    fontSize: "0.9em",
    cursor: disabled ? "not-allowed" : "pointer",
    opacity: disabled ? 0.5 : 1
  });
  return <div style={{
    marginTop: "1.5rem",
    padding: "1rem 1.1rem",
    borderRadius: "0.8rem",
    border: "1px solid rgba(128, 128, 128, 0.35)"
  }}>
      <Badge color="green">Quiz</Badge>
      <p id={quizId + "-question"} style={{
    fontWeight: 600,
    margin: "0.6rem 0 0.2rem"
  }}>
        {question}
      </p>
      <div role="radiogroup" aria-labelledby={quizId + "-question"} aria-disabled={checked}>
        {answers.map((answer, i) => <label key={i} style={optionStyle(answer, i)}>
            <input type="radio" name={"quiz-" + quizId} checked={selected === i} onChange={() => !checked && setSelected(i)} disabled={checked} style={{
    marginTop: "0.3rem",
    flexShrink: 0
  }} />
            <span>{answer.text}</span>
          </label>)}
      </div>
      {checked && <div role="status" aria-live="polite" aria-atomic="true" style={{
    marginTop: "0.9rem",
    padding: "0.7rem 0.9rem",
    borderRadius: "0.6rem",
    lineHeight: 1.5,
    background: isCorrect ? "rgba(22, 163, 74, 0.12)" : "rgba(220, 38, 38, 0.1)"
  }}>
          <strong style={{
    marginRight: "0.4rem"
  }}>{isCorrect ? "✓" : "✗"}</strong>
          {isCorrect ? correctFeedback : incorrectFeedback}
        </div>}
      {!checked ? <button type="button" onClick={() => selected !== null && setChecked(true)} disabled={selected === null} style={buttonStyle(selected === null)}>
          Check answer
        </button> : <button type="button" onClick={reset} style={buttonStyle(false)}>
          Try again
        </button>}
    </div>;
};

export const RelatedTopics = ({items}) => <div className="not-prose mt-12">
    <div className="text-sm font-medium text-gray-500 dark:text-zinc-400 mb-3">Related topics</div>
    <div className="flex flex-col gap-2.5">
      {items.map(([title, href]) => <a key={href} href={href} className="flex items-center gap-2.5 text-sm text-gray-700 hover:text-gray-950 dark:text-zinc-300 dark:hover:text-white">
          <Icon icon="file-text" size={16} color="currentColor" />
          {title}
        </a>)}
    </div>
  </div>;

**Part 1: Getting to know Ringg AI · Lesson 1 of 3 · 10 minutes**

## Objective

Say what Ringg does, name the channels an agent can talk on, and pick the one Acme Lending needs.

## The scenario

Acme Lending offers personal and two-wheeler loans across Maharashtra. Every month its staff phone customers whose EMI is about to fall due, confirm the amount, and ask when they will pay. These lessons replace those calls with an agent called Ananya.

## Hands-on

<Steps>
  <Step title="Know what an agent does">
    An agent makes and answers phone calls, talks to visitors in a web widget, and chats with customers on WhatsApp. Teams use them for EMI and payment reminders, lead qualification, appointment reminders, delivery updates and inbound support. You build one in the dashboard or by API, give it a number, and put it to work one call at a time, over a CSV list as a campaign, or as a step in a workflow.
  </Step>

  <Step title="Learn the channels">
    An agent's channel decides how conversations reach it. Four channels, and one that combines two of them:

    | Channel | The agent… |
    | - | - |
    | Outbound | Calls people, one at a time or from a list |
    | Inbound | Answers calls to a number attached to it |
    | Outbound-Inbound | Calls people and also answers callbacks on its number |
    | Webcall | Talks to visitors in a browser, through the widget |
    | WhatsApp | Chats with customers on your WhatsApp Business number |

    Most agents are single-prompt: one prompt drives the whole conversation. A multi-prompt agent is a canvas of nodes, for flows with strict steps such as identity checks or keypad menus. Ananya is single-prompt.
  </Step>

  <Step title="Pick Acme's channel">
    Acme places the reminder call; the customer does not ring Acme. So Ananya is an **Outbound** agent, and her calls come from a list of customers: a campaign, with a number to call from and Logs to read afterwards.
  </Step>

  <Step title="Find the four sections">
    Sign in to the dashboard and find the four sections these lessons use: **Assistants** at the top of the sidebar, then **Monitor → Logs**, **Monitor → Campaigns** and **Inventory → Numbers** in the groups below. Lesson 3 walks through each.
  </Step>
</Steps>

## Checkpoint

<Check>
  Without the docs open, you can point to **Assistants**, **Monitor → Logs**, **Monitor → Campaigns** and **Inventory → Numbers** in the sidebar, and say that Ananya is an outbound agent who calls a list.
</Check>

## Exercise

Pick a second use case from the list in step 1 and name the channel it needs. Expected result: inbound support is an **Inbound** agent, because the customer places the call; a payment reminder, lead qualification, appointment reminder or delivery update is **Outbound**, because your business does.

## What you learned

* An agent is what talks. Its channel decides whether it calls, answers, talks in a browser or chats on WhatsApp.
* Ananya is an outbound, single-prompt agent, and Acme will run her over a list as a campaign.
* Agents live under **Assistants**; calls, campaigns and numbers live under **Monitor** and **Inventory**.

<Quiz
  question="A clinic wants an agent that patients can phone to reschedule appointments. Which channel does that agent need?"
  answers={[
{ text: "Outbound, because the clinic owns the agent", correct: false },
{ text: "Webcall, because patients use the clinic's website", correct: false },
{ text: "Inbound, because the patient places the call", correct: true },
{ text: "WhatsApp, because patients prefer chat", correct: false },
]}
  correctFeedback="Right. The channel follows who starts the conversation: the patient dials the clinic, so the agent answers calls to a number attached to it. Acme's reminder is the reverse, Acme calls the customer, which makes Ananya Outbound."
  incorrectFeedback="Not quite. Ask who starts the conversation. When the customer dials your number, the agent is Inbound. Outbound agents place calls from a list, Webcall agents talk in a browser, and WhatsApp agents reply in chat."
/>

<RelatedTopics items={[["Ringg AI", "/get-started/introduction"], ["How Ringg works", "/get-started/how-ringg-works"]]} />


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.