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. // name that scopes the team-members listing.
func betterStackRegistration() *Registration { func betterStackRegistration() *Registration {
return &Registration{ return &Registration{
Provider: coredata.ConnectorProviderBetterStack, Provider: coredata.ConnectorProviderBetterStack,
DisplayName: "Better Stack", DisplayName: "Better Stack",
SupportsAPIKey: true, DocumentationURL: accessReviewDocsURL("better-stack"),
ProbeURL: "https://betterstack.com/api/v2/team-members", SupportsAPIKey: true,
ProbeURL: "https://betterstack.com/api/v2/team-members",
APIKeyExtraSettings: []ExtraSetting{ APIKeyExtraSettings: []ExtraSetting{
{Key: "teamName", Label: "Team Name", Required: true}, {Key: "teamName", Label: "Team Name", Required: true},
}, },

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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