- List resources (users, groups, roles, apps, projects, etc.)
- Define entitlements (the permissions you can grant on those resources)
- Emit grants (the facts of who currently has which entitlements)
Where connectors fit
- Deploy an existing connector (you configure it; you do not write Go)
- Build or extend a connector (you write Go against
baton-sdk)
Sync and provision
Connectors do two things: Sync (read): Pull access data from your systems into ConductorOne- Who exists? What groups? What roles?
- What permissions are available?
- Who has what access right now?
- Grant: Give someone access they’ve been approved for
- Revoke: Remove access that’s been terminated
- Create Account: JIT (Just-In-Time) provisioning
- Delete Resource: Remove accounts entirely
The special role of identity providers
Identity Providers (IdPs) like Okta, Azure AD, or Google Workspace have a unique position: they’re often the source of truth for who your users are. Most connectors sync users from the target system. But IdP connectors do more:- They define the canonical user identities
- Other systems’ users are correlated back to IdP users
- User lifecycle (join, move, leave) often originates in the IdP
Understanding the tools
Before diving into implementation, it helps to understand which tools do what. The ConductorOne ecosystem has several SDKs and CLIs with different purposes.For connector developers
| Tool | Purpose | When to use |
|---|---|---|
| baton-sdk | Go SDK for building connectors | Building or extending a connector |
| baton | CLI for inspecting sync output | Debugging .c1z files locally |
- The
ResourceSyncerinterface you implement - Pagination helpers for API calls
- Resource and grant builders
- HTTP client utilities with retry logic
.c1z files. After your connector runs, use it to verify the output:
For ConductorOne users (not connector development)
| Tool | Purpose | When to use |
|---|---|---|
| cone | CLI for ConductorOne platform | Access requests, approvals, searches |
| conductorone-sdk-go | Go SDK for ConductorOne API | Integrating with C1 platform |
Which tool do I need?
| I want to… | Use this |
|---|---|
| Build a new connector | baton-sdk |
| Debug my connector’s output | baton CLI |
| Request or approve access | cone CLI |
| Build an app that uses ConductorOne | conductorone-sdk-go |
| Deploy a pre-built connector | The connector binary |
cone and baton are separate tools for separate purposes. You don’t use cone to build connectors, and you don’t use baton to manage access requests.The connector binary
When you build a connector, you produce a standalone binary (e.g.,baton-okta, baton-github). This binary:
- Embeds the SDK - It’s compiled with
baton-sdk, not dependent on it at runtime - Is self-contained - No runtime dependencies except the target system’s API
- Runs independently - You don’t need any other ConductorOne tools installed
- Produces standard output - A
.c1zfile that any ConductorOne environment can consume
The minimum contract
The beauty of the Baton SDK is how little you need to implement. At the SDK level, the primary interface for connector developers isResourceSyncer:
ResourceType(ctx): define the type (and traits) of a resource (for example “user” with traitTRAIT_USER)List(ctx, parentResourceID, token): list instances of that resource type (paged)Entitlements(ctx, resource, token): list entitlements offered by that resource (paged)Grants(ctx, resource, token): list who has those entitlements (paged)
When to build vs reuse
- Use an existing connector when it exists and your needs are met. The operational cost is configuration and deployment.
- Contribute upstream when the connector exists but is missing a capability you need (for example, adding a resource type or provisioning path). This reduces long-term fork burden and helps the community.
- Build a new connector when the target system is unsupported or proprietary. With the SDK handling the heavy lifting, most connectors can be built in a few days.
- A pre-built connector exists and meets your needs
- You need quick integration - use baton-http for REST APIs
- You need database integration - use baton-sql for SQL databases
What “working” looks like
baton-demo is an example connector with hardcoded data that demonstrates a fully runnable sync. No API credentials needed - you can try it right now.
What “working” does not guarantee
- “Runs locally” does not mean “safe in production.” You still need to handle pagination, retries, and rate limits (and prove you do).
- Provisioning is not implied by syncing. Many connectors are read-only or partially provisionable; you must check per connector.
- Docs-site capability tables are not the API contract. They are a directory for humans; use the connector’s own manifests and the SDK interfaces as ground truth.
Next steps
Core concepts
Resources, entitlements, grants, traits, and the sync lifecycle
Building connectors
Project structure and implementation patterns
Meta-connectors
Configure baton-http or baton-sql without writing Go
Community
Getting help, contributing, support channels
Prerequisites for building
If you’re going to build a connector, you’ll need:| Tool | Version | Purpose |
|---|---|---|
| Go | See go.mod | Connector runtime |
| Git | Any | Version control |
| make | Any | Build automation |
Go version requirements vary by connector and SDK version. Check the
go.mod file in baton-sdk or your target connector for the current minimum version.- Access to the system you want to connect to
- API credentials with read permissions
- An IDE with Go support (VS Code, GoLand)
Quick reference
| Term | Meaning |
|---|---|
| Connector | Go binary that syncs and provisions access data |
| c1z | Compressed sync output file |
| Resource | User, group, role, or custom entity |
| Entitlement | Permission that can be granted |
| Grant | Assignment of entitlement to principal |
| Baton SDK | Go library that handles sync orchestration |
| Sync | Reading access data from a system |
| Provision | Writing access changes back (grant, revoke, create, delete) |
| Reconciliation | Comparing actual vs desired access and correcting drift |