- A team is the workspace that owns your hubs, media, and API keys. Signing up creates one for you, and you can belong to more than one. See Tenancy.
- The team owner is the user who created the team. Only the owner can rename it.
- The active team is the team the admin is working in right now. Every admin page shows the active team’s data.
403. See Authentication.
The Account area
The Account area splits your settings into five sections. They are listed in a panel on the left of the page, under “Team, payment accounts, developer tools” (stacked above the content on a phone). The page opens on Profile & security.Team
The Team section (“People who run the account. Not hub members.”) has two tabs, People and Team settings. Only the team owner can open it. Anyone else sees “Only the team owner can see team members.” People lists the team’s people, read only:- Your own row shows your name and email, marked You, with your role (Owner or Member). Select it to open the role and the Joined date.
- Other members are not named yet, because the admin cannot read other people’s profiles. They are counted in one row, for example “2 other members”, with “Names appear once available.”
- You cannot invite people, change roles, or remove members here. See Not yet for adding a member with the API.
Profile & security
Profile & security (“Your own sign-in”) has a Profile group with First name, Last name, and a read-only Email (“Contact support to change”). When you change a name, Save and Discard appear. The Security group has a Password row, “Change the password you sign in with.”, with a Change button. It opens a Change password dialog with Current password, New password (at least 8 characters) and New password again, and a Reset via email instead link. On success the admin shows “Password changed” and signs your other sessions out. See Change your password with the API.Payment accounts
In the admin: Payment accounts (“The Stripe account every hub pays into”) connects the team’s Stripe account so its hubs can accept payments. The connection belongs to the team and is shared by all of its hubs. Only the team owner can manage it. Anyone else sees “Only the team owner can manage payment accounts.” The section shows one of three states:
The connect buttons take you to Stripe, where you finish onboarding, and then bring you back to this section. The admin checks the status when you return (“Checking payment status…”) and shows “Payments are ready.” once Stripe has enabled payments. If Stripe cannot be opened, the section says “We couldn’t open Stripe. Try again.”
Connecting starts from one of the team’s hubs. If the team has no hub yet, the Connect Stripe button is hidden and the section shows Create a hub first: “Connecting Stripe starts from one of this team’s hubs.” with a Go to your hubs link. Create a hub, then come back.
Developer tools
Developer tools (“API keys, webhook endpoints, external login, verified domains, OAuth clients”) is for the team owner. Anyone else sees the owner notice and none of the tools below.- API keys are the first group. Create key is in the page header. Creating, copying, changing, and revoking keys works as described in Manage API keys in the admin.
- Webhooks lists the team’s endpoints by host, with a Disabled badge where one is off. Add endpoint asks for a name, an endpoint URL, and the hub whose events it receives, then shows the signing secret once. Each row’s menu has Delete. With no hub yet, the group says “Create a hub first, then send its events to another app.”
- Under Advanced:
- External login (“Sign in with Google, Facebook or a company login.”) lists providers, each with an on/off switch and an Edit or Remove menu, and Add provider. See Configure an external-login provider.
- Verified domains (“Email domains that use the company login.”) lists domains. For one still waiting on DNS, it shows the TXT record to add, a copy button, and Verify now. Add domain asks for a domain and a hub. See Verified-Domain SSO.
- OAuth clients (“Let other apps sign people in with Mio.”) lists clients with a copy button for the client ID, a Delete menu, and New client.
Billing
Billing (“Your Membership.io plan. Hub revenue is under each hub’s Payments.”) shows “Billing isn’t in the API yet”: the plan, seats, invoices and payment method are not available in the admin, and today they live with the billing provider.Edit your profile with the API
In the admin, this is Profile & security, where you edit First name and Last name and select Save. The email is read only (“Contact support to change”); see The Account area. Send the fields you want to change to your own user. The body is flat, with the fields at the top level:200 with the updated user. Things to know:
- You can only update yourself. Any other user id returns
404. There is noPATCH /api/v1/users/meshortcut, so use your id fromGET /api/v1/auth/me. - Send only the fields you want to change. A field you leave out keeps its value.
nullclears that name, and the response is200with the name set tonull. An empty string ("") sets the name to an empty string. - There is no field for your email address, so the API cannot change it either.
Rename a team with the API
In the admin, the owner renames the team on the Team settings tab of Team, with Team name and Save; see Team. Other members do not see the section: they get “Only the team owner can see team members.” Find the team’s id and check whether you own it. A team’sowner_id is the id of its owner:
{"name": "..."} body:
200 with the updated team. Only the team owner can rename a team; anyone else gets 403. name is the only field you can change: sending slug or any other attribute returns 422, and a body without a name returns 422 with code no_updatable_fields. See Error handling.
Reference: Update Team · List Teams
Change your password with the API
In the admin, this is the Change button in the Security group of Profile & security, which opens the Change password dialog. Reset via email instead opens the public forgot-password form. See Forgot your password for the email flow and its alpha limitation. Use your signed-in platform access token and a flat request body. The response is200 with a fresh access token and refresh token. Replace the tokens you stored; older refresh sessions are revoked. A team API key gets 403. See the change-password request and error responses and the generated endpoint.
Switch teams
In the admin: select your avatar at the bottom of the sidebar to open the account menu. On a phone, tap the menu button at the top left, then your avatar at the bottom of the menu. The row under your name and email reads Team: . If you belong to one team, this is a static label and the Account page has no Switch team row. If you belong to several teams, open Team: to see your teams, with the active one checked, and select the team you want. The admin switches to it, and pages such as Hubs, Library, and API keys show that team’s data. On the Account page, Open account menu in the Switch team row takes you to the same menu. The admin remembers your choice. The team stays active when you reload the page, and the next time you sign in, on any device, the admin opens the team you last switched to. If you have never switched, it opens the oldest team you own, or one of the teams you belong to if you own none. You only see teams you are a member of. Another team appears in the list when its owner adds you (see Not yet) or when you create one with Create Team. With the API: switch with an emptyPOST:
200 with the team. The request checks that you are a member of the team (403 if you are not) and saves it as your default team. GET /api/v1/auth/me returns the default team as default_team_id, and it is the team the admin opens after you sign in.
Switching does not return a new token, and it does not change the team that a team-scoped request acts on: that still comes from the path. See the next section. A team API key cannot switch teams and gets 403, because a key is bound to one team.
Reference: Switch Team · Get Me
The active team in API calls
The active team is a choice the admin keeps in your browser. It is not a setting on your token or your API key. The admin sends the active team’s id with every request it makes, in the path of team-scoped routes and in anX-Team-ID header.
When you call the API yourself, the team a request acts on comes from:
Your access token records your default team when you sign in or refresh it, so a switch reaches the token at your next sign-in or refresh. To pick the team yourself, send the header:
400, and a team you are not a member of returns 403.
A team API key always acts on its own team. A path or an X-Team-ID header that names a different team returns 403. See API keys and Tenancy.
Not yet
The admin is in alpha. These are not on the Account page yet:-
Inviting team members by email (MIO-3900). The admin lists the team’s people read only and has no invites. With the API, the team owner can add someone who already has an account, by their user id. They can find their id in
data.idofGET /api/v1/auth/me.Success is201. Someone who is already a member returns409, and anyone but the owner gets403. A team API key can add a member too, but not give them a role: a key request that setsrole_idreturns403, so assigning a role needs the owner’s signed-in session. The new member can switch to the team, but only the owner can rename it or manage its API keys. See Add Member. Letting a member read the contact directory. The owner can give a member a reduced, read-only view of the team’s contacts with thecontacts.readteam permission. With the owner’s signed-in session (team API keys get403on these routes):- Create a role for the team:
POST /api/v1/roleswithteam_idset to your team. - Attach the permission:
POST /api/v1/roles/{role_id}/permissionswith{"slug": "contacts.read"}. A team role accepts only team-scoped permissions; anything else, such asusers.read, returns422with codepermission_not_team_scoped. - Give the member the role:
PATCH /api/v1/teams/{team_id}/members/{user_id}with{"data": {"type": "team_members", "attributes": {"role_id": "<role id>"}}}. Send"role_id": nullto take it away.
GET /api/v1/teams/{team_id}/contact-directory, which lists the team’s live contacts with six fields only:contact_id,first_name,last_name,email,sourceandcreated_at. It never includes deleted contacts, and it supportsfilter[email],filter[source],sortand cursor pagination. Access is checked against the member’s current role on every request, so removing the permission, the role or the membership takes effect straight away. The owner can call it too; the full contact routes stay owner-only. Who can change the team’s media. Media follows the same team roles. Any team member can read the media library. Editing needs the team owner, or a member whose team role holds themedia.editpermission, which you attach exactly likecontacts.readabove. Editing covers uploading, renaming and updating files, folders and playlists, attaching and detaching, transcripts, transcoding, and publishing to or unpublishing from hubs. Deleting files, folders and playlists, and replacing a file’s media, stay with the team owner. A member withoutmedia.editgets403on an edit, and a member with it gets403on a delete. A full-scope team API key keeps full media access, deletes included, so the mio CLI’s media commands keep working. Hub owners and admins signed in to a hub keep their current editor access, and the MCP media tools stay owner-only. When this shipped, every existing member without a role was given a team role named “Media editor” that holdsmedia.edit, so nobody lost editing. A member whose role is a platform system role keeps that role and can read the team’s media but not change it. A member holds one role, so giving them a team role replaces their platform role. - Create a role for the team:
- Profile pictures. You cannot upload an avatar, in the admin or with the API. The admin shows your initials.
-
Deleting a team. The admin has no button for it. The API has
DELETE /api/v1/teams/{team_id}, for the owner with a signed-in session only (team API keys get403). It refuses with409while the team still has hubs, contacts, or API keys, and the error’smetacounts them. See Delete Team.
Next steps
- Tenancy: how teams and hubs scope your data.
- Authentication: when to use a platform JWT, a contact JWT, or a team API key.
- API keys: create a team API key for your integration or the CLI.
- Sign in as a creator: the platform sign-in flow for your own tools.