- 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
Most people interact with connectors in two ways:- 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 C1- 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 C1 ecosystem has several SDKs and CLIs with different purposes.For connector developers
baton-sdk is the Go library you import when building a connector. It provides:
- 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 C1 users (not connector development)
cone is the C1 CLI for end-users and administrators. It handles access management workflows:
Which tool do I need?
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 C1 tools installed
- Produces standard output - A
.c1zfile that any C1 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.
Prerequisites for building
If you’re going to build a connector, you’ll need: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)