---
name: "admin_save_domain"
area: "admin"
title: "Let colleagues join by email domain"
price: "$0.001"
method: "POST"
url: "https://api.conecto.chat/v1/tools/admin_save_domain"
mcp_server: "https://api.conecto.chat/mcp/admin"
auth: "Authorization: Bearer <conecto_sk_ key>"
docs_url: "https://conecto.chat/tools/admin/admin_save_domain"
---

# Let colleagues join by email domain (`admin_save_domain`)

Adds the company's email domain, proves it with a TXT record, and sets how people on it join.

Add the company's email domain, prove it, and choose how people on it join. Added, it comes back with a TXT record for its DNS; once the record is up, verify: true proves it. joining: request lets people with an address there ask to join (an owner, admin or this agent approves with admin_decide_join_request); open lets them join right away as members, which only the owner turns on; off stops both. People who join get the domain's team and areas.

Price: $0.001 a call. A call that fails costs nothing.

## Use it when

Colleagues should find the company's account when they sign in with their work address.

- For one person you already know, use [admin_save_person](https://conecto.chat/tools/admin/admin_save_person.md).

## Say this to your agent

> Let everyone with an @hansenvoss.example address ask to join, and put them in the Warehouse team.

## Inputs

| Name | Type | Required | Description | Allowed values | Default |
|---|---|---|---|---|---|
| `domain` | string | yes | The part of the company's addresses after the @, like hansenvoss.example. 4 to 253 characters. |  |  |
| `verify` | boolean | no |  |  |  |
| `joining` | string | no |  | `"off"`, `"request"`, `"open"` |  |
| `team` | string | no | Up to 80 characters. |  |  |
| `areas` | array of strings | no |  |  |  |

## Example

Written for Hansen & Voss, a restaurant-equipment wholesaler in Hamburg with 60 staff.

MCP: call `admin_save_domain` on the MCP server `https://api.conecto.chat/mcp/admin` with these arguments:

```json
{
  "domain": "hansenvoss.example",
  "verify": true,
  "joining": "request",
  "team": "Warehouse"
}
```

REST:

```bash
curl https://api.conecto.chat/v1/tools/admin_save_domain \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "hansenvoss.example", "verify": true, "joining": "request", "team": "Warehouse"}'
```

## Response

```json
{
  "call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
  "tool": "admin_save_domain",
  "status": "succeeded",
  "replayed": false,
  "cost_usd": "$0.001",
  "balance_usd": "$19.75",
  "result": {
    "domain": {
      "domain": "hansenvoss.example",
      "verified": true,
      "verified_at": "2026-10-14T08:00:00+00:00",
      "joining": "request",
      "team": "Warehouse",
      "areas": null,
      "dns_record": {
        "type": "TXT",
        "name": "@",
        "value": "conecto-verification=6ykvBp1em-09EK4SFTAYwHQaW9QV5fm8"
      },
      "added_at": "2026-10-14T08:00:00+00:00"
    },
    "added": true,
    "proved": true
  }
}
```

`result`: domain: the domain with whether it is proved, how people join, their team and areas, and the TXT record to set; added; with verify, proved and what to fix if it is not.

## Errors

| Code | Status | When | Fix |
|---|---|---|---|
| `invalid_input` | 400 | The domain is not one, is a public email provider, or areas names no area. | Use the company's own domain, like hansenvoss.example. |
| `not_verified` | 409 | The domain is not proved yet, so nobody can join with it. | Add the TXT record from dns_record, then call again with verify: true. |
| `not_found` | 404 | No team has that name. | admin_overview lists the teams. |
| `scope_too_wide` | 409 | The areas reach past the team's. | Pick areas inside the team's. |
| `owner_required` | 403 | The key doesn't run the account, or joining right away was asked for. | Choose request instead, or hand the owner a link: account_owner_link with page settings. |
| `limit_reached` | 409 | The account has 10 domains. | Remove one first. |
| `rate_limited` | 429 | Twenty DNS checks an hour at most. | Wait; DNS changes can take an hour to show. |

The refusals every tool can give (401 key, 402 balance, 429 limits) are on the errors page: https://conecto.chat/docs/errors.md

## Related

- [admin_overview](https://conecto.chat/tools/admin/admin_overview.md): The account page's Home in one read: balance, spending, limits, teams, people, keys, systems and rentals. Free up to 1,000,000 reads a month.
- [admin_save_setup](https://conecto.chat/tools/admin/admin_save_setup.md): Saves the answers to the first questions: the AI the business uses, the jobs to hand over, the systems it runs and its size. Free.
- [admin_list_people](https://conecto.chat/tools/admin/admin_list_people.md): Who besides the owner can open the account, with role, teams, areas and end of access, and the requests to join waiting. Free up to 1,000,000 reads a month.
- [admin_save_person](https://conecto.chat/tools/admin/admin_save_person.md): Adds a person as a member or auditor, or changes their name, teams, areas or end of access. $0.001 a call.
- [admin_remove_person](https://conecto.chat/tools/admin/admin_remove_person.md): Takes a person's access away at once, with their own assistants. Free.
- [admin_list_domains](https://conecto.chat/tools/admin/admin_list_domains.md): The company's email domains on the account: proved or not, how people on them join, and the TXT record that proves each. Free up to 1,000,000 reads a month.
- [admin_remove_domain](https://conecto.chat/tools/admin/admin_remove_domain.md): Takes a domain off the account; people who joined with it stay. Free.
- [admin_decide_join_request](https://conecto.chat/tools/admin/admin_decide_join_request.md): Approves someone who asked to join, as a member in their domain's team, or declines them. $0.001 a call.
- [admin_list_join_codes](https://conecto.chat/tools/admin/admin_list_join_codes.md): The one-time codes made for other bots to join, with their team, areas, expiry and the bot that used each. Free up to 1,000,000 reads a month.
- [admin_make_join_code](https://conecto.chat/tools/admin/admin_make_join_code.md): A one-time code another bot uses to join this account, for one team and its areas. $0.001 a call.
- [admin_revoke_join_code](https://conecto.chat/tools/admin/admin_revoke_join_code.md): Withdraws a join code no bot used yet. Free.
- [admin_list_bridges](https://conecto.chat/tools/admin/admin_list_bridges.md): The bridges inside the company's network: online or not, last check-in, version and the systems each serves. Free up to 1,000,000 reads a month.
- [admin_make_bridge](https://conecto.chat/tools/admin/admin_make_bridge.md): A new bridge for systems behind the company's firewall, with its token (shown once) and the steps for IT. $0.001 a call.
- [admin_revoke_bridge](https://conecto.chat/tools/admin/admin_revoke_bridge.md): Stops a bridge at once; calls waiting for it fail at no cost. Free.
