Link the 19 API-key access-review connector docs

Each of these providers ships an API-key connection path and a driver, but
no Registration carried a DocumentationURL, so the console rendered no
"how do I get this token" link on the connect dialog. probo.com now has a
page per provider, so point each Registration at it.

Slugs are passed explicitly rather than derived from the enum, per
accessReviewDocsURL's contract, so BETTER_STACK maps to better-stack and
INCIDENT_IO to incident-io.

Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com>
This commit is contained in:
Aurélien Sibiril
2026-07-26 11:47:08 +02:00
parent fb68e98941
commit 4e1ecd41c2
19 changed files with 77 additions and 58 deletions

View File

@@ -38,10 +38,11 @@ import (
// name that scopes the team-members listing.
func betterStackRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderBetterStack,
DisplayName: "Better Stack",
SupportsAPIKey: true,
ProbeURL: "https://betterstack.com/api/v2/team-members",
Provider: coredata.ConnectorProviderBetterStack,
DisplayName: "Better Stack",
DocumentationURL: accessReviewDocsURL("better-stack"),
SupportsAPIKey: true,
ProbeURL: "https://betterstack.com/api/v2/team-members",
APIKeyExtraSettings: []ExtraSetting{
{Key: "teamName", Label: "Team Name", Required: true},
},

View File

@@ -31,9 +31,10 @@ import (
func brevoRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderBrevo,
DisplayName: "Brevo",
SupportsAPIKey: true,
Provider: coredata.ConnectorProviderBrevo,
DisplayName: "Brevo",
DocumentationURL: accessReviewDocsURL("brevo"),
SupportsAPIKey: true,
// Brevo authenticates with an API key sent in the api-key header
// rather than Authorization: Bearer. APIKeyHeader makes the
// APIKeyConnection send api-key instead and omit Authorization. There

View File

@@ -31,9 +31,10 @@ import (
func clickhouseRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderClickHouse,
DisplayName: "ClickHouse Cloud",
SupportsAPIKey: true,
Provider: coredata.ConnectorProviderClickHouse,
DisplayName: "ClickHouse Cloud",
DocumentationURL: accessReviewDocsURL("clickhouse"),
SupportsAPIKey: true,
// ClickHouse Cloud's control-plane API authenticates with HTTP Basic
// auth where the credential is keyId:keySecret. APIKeyBasicAuthUserPass
// makes the APIKeyConnection base64 the verbatim "keyId:keySecret"

View File

@@ -34,10 +34,11 @@ import (
func grafanaRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderGrafana,
DisplayName: "Grafana",
SupportsAPIKey: true,
BuildProbeURL: buildGrafanaProbeURL,
Provider: coredata.ConnectorProviderGrafana,
DisplayName: "Grafana",
DocumentationURL: accessReviewDocsURL("grafana"),
SupportsAPIKey: true,
BuildProbeURL: buildGrafanaProbeURL,
APIKeyExtraSettings: []ExtraSetting{
{Key: "baseUrl", Label: "Base URL", Required: true},
},

View File

@@ -31,9 +31,10 @@ import (
func incidentioRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderIncidentIO,
DisplayName: "incident.io",
SupportsAPIKey: true,
Provider: coredata.ConnectorProviderIncidentIO,
DisplayName: "incident.io",
DocumentationURL: accessReviewDocsURL("incident-io"),
SupportsAPIKey: true,
// incident.io publishes an OAuth2 flow, but it is outbound-only (for
// incident.io to call other apps), so access review authenticates
// with an API key presented as Authorization: Bearer, the default

View File

@@ -34,9 +34,10 @@ import (
func langfuseRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderLangfuse,
DisplayName: "Langfuse",
SupportsAPIKey: true,
Provider: coredata.ConnectorProviderLangfuse,
DisplayName: "Langfuse",
DocumentationURL: accessReviewDocsURL("langfuse"),
SupportsAPIKey: true,
// Langfuse's organization-scoped public API authenticates with HTTP
// Basic auth where the credential is publicKey:secretKey.
// APIKeyBasicAuthUserPass base64s the verbatim "publicKey:secretKey" the

View File

@@ -31,9 +31,10 @@ import (
func mercuryRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderMercury,
DisplayName: "Mercury",
SupportsAPIKey: true,
Provider: coredata.ConnectorProviderMercury,
DisplayName: "Mercury",
DocumentationURL: accessReviewDocsURL("mercury"),
SupportsAPIKey: true,
// Mercury authenticates with a self-serve API token presented as
// Authorization: Bearer, the default APIKeyConnection scheme. There
// is no third-party OAuth2 flow for the Users API. The token is

View File

@@ -34,11 +34,12 @@ import (
func metabaseRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderMetabase,
DisplayName: "Metabase",
SupportsAPIKey: true,
APIKeyHeader: "x-api-key",
BuildProbeURL: buildMetabaseProbeURL,
Provider: coredata.ConnectorProviderMetabase,
DisplayName: "Metabase",
DocumentationURL: accessReviewDocsURL("metabase"),
SupportsAPIKey: true,
APIKeyHeader: "x-api-key",
BuildProbeURL: buildMetabaseProbeURL,
APIKeyExtraSettings: []ExtraSetting{
{Key: "instanceUrl", Label: "Instance URL", Required: true},
},

View File

@@ -32,8 +32,9 @@ import (
func neonRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderNeon,
DisplayName: "Neon",
Provider: coredata.ConnectorProviderNeon,
DisplayName: "Neon",
DocumentationURL: accessReviewDocsURL("neon"),
// Neon's API authenticates with an API key (napi_...) presented
// as Authorization: Bearer, the default APIKeyConnection scheme.
// Neon's OAuth is partner-gated (manual application), so the

View File

@@ -41,6 +41,7 @@ func oktaRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderOkta,
DisplayName: "Okta",
DocumentationURL: accessReviewDocsURL("okta"),
SupportsAPIKey: true,
APIKeyAuthScheme: "SSWS",
BuildProbeURL: buildOktaProbeURL,

View File

@@ -35,6 +35,7 @@ func onePasswordRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderOnePassword,
DisplayName: "1Password",
DocumentationURL: accessReviewDocsURL("one-password"),
ProbeURL: "https://events.1password.com/api/v1/auditevents",
SupportsAPIKey: true,
SupportsClientCredentials: true,

View File

@@ -31,9 +31,10 @@ import (
func pylonRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderPylon,
DisplayName: "Pylon",
SupportsAPIKey: true,
Provider: coredata.ConnectorProviderPylon,
DisplayName: "Pylon",
DocumentationURL: accessReviewDocsURL("pylon"),
SupportsAPIKey: true,
// Pylon authenticates with an account API token presented as
// Authorization: Bearer, the default APIKeyConnection scheme. There
// is no third-party OAuth2 flow for the Users API. The token is bound

View File

@@ -34,6 +34,7 @@ func qoveryRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderQovery,
DisplayName: "Qovery",
DocumentationURL: accessReviewDocsURL("qovery"),
SupportsAPIKey: true,
APIKeyAuthScheme: "Token",
BuildProbeURL: buildQoveryProbeURL,

View File

@@ -39,10 +39,11 @@ import (
// omitted.
func renderRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderRender,
DisplayName: "Render",
SupportsAPIKey: true,
BuildProbeURL: buildRenderProbeURL,
Provider: coredata.ConnectorProviderRender,
DisplayName: "Render",
DocumentationURL: accessReviewDocsURL("render"),
SupportsAPIKey: true,
BuildProbeURL: buildRenderProbeURL,
APIKeyExtraSettings: []ExtraSetting{
{Key: "workspaceId", Label: "Workspace ID", Required: true},
},

View File

@@ -31,10 +31,11 @@ import (
func sendgridRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderSendGrid,
DisplayName: "SendGrid",
ProbeURL: "https://api.sendgrid.com/v3/teammates?limit=1&offset=0",
SupportsAPIKey: true,
Provider: coredata.ConnectorProviderSendGrid,
DisplayName: "SendGrid",
DocumentationURL: accessReviewDocsURL("sendgrid"),
ProbeURL: "https://api.sendgrid.com/v3/teammates?limit=1&offset=0",
SupportsAPIKey: true,
NewDriver: func(_ context.Context, c *http.Client, _ *coredata.Connector, logger *log.Logger) (drivers.Driver, error) {
return drivers.NewSendGridDriver(c, logger.Named("sendgrid")), nil
},

View File

@@ -34,11 +34,12 @@ import (
func signozRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderSigNoz,
DisplayName: "SigNoz",
SupportsAPIKey: true,
APIKeyHeader: "SIGNOZ-API-KEY",
BuildProbeURL: buildSigNozProbeURL,
Provider: coredata.ConnectorProviderSigNoz,
DisplayName: "SigNoz",
DocumentationURL: accessReviewDocsURL("signoz"),
SupportsAPIKey: true,
APIKeyHeader: "SIGNOZ-API-KEY",
BuildProbeURL: buildSigNozProbeURL,
APIKeyExtraSettings: []ExtraSetting{
{Key: "baseUrl", Label: "Base URL", Required: true},
},

View File

@@ -32,10 +32,11 @@ import (
func supabaseRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderSupabase,
DisplayName: "Supabase",
ProbeURL: "https://api.supabase.com/v1/organizations",
SupportsAPIKey: true,
Provider: coredata.ConnectorProviderSupabase,
DisplayName: "Supabase",
DocumentationURL: accessReviewDocsURL("supabase"),
ProbeURL: "https://api.supabase.com/v1/organizations",
SupportsAPIKey: true,
APIKeyExtraSettings: []ExtraSetting{
{Key: "organizationSlug", Label: "Organization Slug", Required: true},
},

View File

@@ -31,10 +31,11 @@ import (
func tailscaleRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderTailscale,
DisplayName: "Tailscale",
SupportsAPIKey: true,
ProbeURL: "https://api.tailscale.com/api/v2/tailnet/-/users",
Provider: coredata.ConnectorProviderTailscale,
DisplayName: "Tailscale",
DocumentationURL: accessReviewDocsURL("tailscale"),
SupportsAPIKey: true,
ProbeURL: "https://api.tailscale.com/api/v2/tailnet/-/users",
NewDriver: func(_ context.Context, c *http.Client, _ *coredata.Connector, _ *log.Logger) (drivers.Driver, error) {
return drivers.NewTailscaleDriver(c), nil
},

View File

@@ -32,10 +32,11 @@ import (
func tallyRegistration() *Registration {
return &Registration{
Provider: coredata.ConnectorProviderTally,
DisplayName: "Tally",
ProbeURL: "https://api.tally.so/me",
SupportsAPIKey: true,
Provider: coredata.ConnectorProviderTally,
DisplayName: "Tally",
DocumentationURL: accessReviewDocsURL("tally"),
ProbeURL: "https://api.tally.so/me",
SupportsAPIKey: true,
APIKeyExtraSettings: []ExtraSetting{
{Key: "organizationId", Label: "Organization ID", Required: true},
},