Every agent platform needs to know who's who. AGNT Identity is the foundation — users, accounts, team members, identifiers, and preferences. It's the layer that connects a person to their calendars, contacts, conversations, and agent behaviors.
Most platforms give you a user table and call it done. AGNT Identity gives you a full graph: a user has identifiers (email addresses, phone numbers), each identifier has platform connections (Google, Microsoft), each connection has preferences (working hours, buffer times, notification settings), and all of it is queryable through a single API.
This is not optional plumbing. This is the data model your agents think in.
A user is a person on your platform. They have a name, email, timezone, and optional metadata. Users are the anchor point — everything else (identifiers, calendars, contacts, memories, preferences) hangs off a user.
Users can be created explicitly via the API or auto-provisioned when a delegated JWT includes an email AGNT hasn't seen before. See Authentication for details on auto-provisioning.
Accounts
An account is an organization. Users belong to accounts as members with roles (member or admin). A user can belong to multiple accounts. API calls are scoped to an account via account-scoped JWTs.
Deleting an account cascades. Everything under it — users, identifiers, calendars, contacts, tasks, chats — is removed.
Identifiers
An identifier is a way to reach a person. Email addresses, phone numbers — anything that uniquely identifies a user across platforms. Each identifier has:
A type (e.g., email)
A value (e.g., jane@acme.co)
A primary flag (one identifier per type is primary)
A platforms object tracking OAuth connections (Google, Microsoft)
Identifiers are the bridge to external services. When a user grants Google OAuth access, that's recorded on an identifier. When you sync calendars, you sync them through an identifier. When you query availability, you query it for an identifier.
Preferences
Preferences are per-identifier settings that control agent behavior. They're organized by skill:
Preferences are what make an agent personal. Two users can use the same scheduling agent, but one prefers 30-minute meetings with 15-minute buffers while the other prefers 60-minute meetings with no buffers. Preferences make that work without hardcoding.
Team Members
Team members are the humans who manage the account — your internal team. They're distinct from users (who are your end users). Members have roles:
admin -- Full access to account settings, certificates, and provider configuration
member -- Standard access to the account's resources
Invite members by email. They show up in the member list as "invited" until they accept.
API Reference
Auth Endpoints
Method
Path
Description
Auth
GET
/auth/google
Get Google OAuth login URL
None
GET
/auth/google/callback
Google OAuth callback
None
GET
/auth/microsoft
Get Microsoft OAuth login URL
None
GET
/auth/microsoft/callback
Microsoft OAuth callback
None
POST
/auth/exchange
Exchange OAuth code for token
None
POST
/auth/account/:accountId/token
Get account-scoped JWT
Bearer
POST
/auth/refresh
Refresh token
Bearer
GET
/auth/me
Get current user info
Bearer
POST
/auth/accept-terms
Accept terms of service
Bearer
Get OAuth Login URL
GET https://api.agnt.ai/auth/google?redirectUri=https://yourapp.com/callback
GET https://api.agnt.ai/auth/microsoft?redirectUri=https://yourapp.com/callback
If you're building an agent that needs to understand users, here's what matters:
Users vs. identifiers. A user is a person. An identifier is a way to reach them. One user can have multiple email identifiers. Always resolve from identifier to user when you need the full picture.
Check platforms on identifiers. Before trying to sync a user's Google Calendar, verify that platforms.google.accessGranted is true on their identifier. If it's not, the user needs to complete OAuth first.
Preferences drive behavior. Don't hardcode meeting durations or working hours. Read them from preferences. If preferences aren't set, use sensible defaults (30 minutes, 9-5 weekdays) but tell the user they can customize.
externalId is your bridge. When creating users, set externalId to your application's user ID. This lets you look up AGNT users by your own ID without maintaining a mapping table.
Cascading deletes are real. Deleting a user removes their identifiers, which removes their preferences, calendars, and timelines. Deleting an account removes everything. Make sure your agent warns before destructive operations.
GET /users/:userId is the richest endpoint. It returns identifiers, contacts, and memories in a single call. Use it when your agent needs full context about a person.
For Product Teams
AGNT Identity is the data model everything else builds on. Here's what shapes the product:
OAuth is the onboarding funnel. Google and Microsoft OAuth are the primary way users connect. The flow is standard: redirect to provider, user grants access, exchange code for token. The auth/exchange endpoint handles the handshake.
Accounts scope everything. All API calls happen within an account context. Account-scoped JWTs ensure data isolation. If you're building a multi-tenant product, each tenant maps to an AGNT account.
Team members are internal, users are external. Members are your team — the people who build and manage the product. Users are the end users your agents serve. They're separate concepts with separate APIs.
Preferences are per-identifier, not per-user. This seems like an odd choice until you realize a user might want different working hours for their work email vs. their personal email. Preferences attach to identifiers because identifiers are what connect to external services.
Account stats give you the dashboard. The /account/stats endpoint returns total tasks, pending tasks, completed tasks, certificates, chats, and API calls. This is your usage dashboard in one call.
Auto-provisioning reduces friction. When a delegated JWT contains an email AGNT hasn't seen, the user is created automatically. No signup form needed. No separate user creation step. This is deliberate — agents shouldn't wait for humans to register.