Integrations

sfp server API reference for Integrations: 15 endpoints.

POST/sfp/api/integrations

Securely store credentials for external integrations. Credentials are encrypted at rest using AES-256.

Authentication: Requires Owner role. Application tokens are not permitted for credential creation.

Scope options:

  • Global (isGlobal: true): Credentials available to all projects. Use for shared services like a company-wide Jira.
  • Project-scoped (projects: [...]): Credentials only for specific repositories. Projects must be registered first via POST /projects.

Common setups:

  • Jira: provider: "jira", authType: "basic_auth", credentials: { base_url, username, api_token }
  • GitHub PAT: provider: "github", authType: "pat", credentials: { token }

See full guide: https://docs.flxbl.io/sfp/api-reference/integrations

Authorization

access-token
AuthorizationBearer <token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

curl -X POST "https://example.com/sfp/api/integrations" \  -H "Content-Type: application/json" \  -d '{    "provider": "github",    "authType": "pat",    "credentials": {      "token": "ghp_xxxx"    }  }'
Empty
GET/sfp/api/integrations

List all configured integrations. Returns integration metadata without credentials.

Authentication: Requires Owner role. This endpoint is for administrative purposes to view and manage integrations.

Authorization

access-token
AuthorizationBearer <token>

In: header

Query Parameters

provider?string

Filter by provider: github or jira

Value in

  • "github"
  • "azuredevops"
  • "jfrog"
  • "gitlab"
  • "npm"
  • "github_packages"
  • "jira"
  • "azure-devops"
  • "servicenow"
  • "ai_anthropic"
  • "ai_openai"
  • "ai_google"
  • "ai_github_copilot"
  • "ai_amazon_bedrock"
  • "ai_google_vertex"
  • "ai_cloudflare_gateway"
  • "ai_anthropic_platform"
  • "datadog"
  • "newrelic"
  • "splunk"
  • "browserbase"
  • "slack"
  • "teams"

Response Body

curl -X GET "https://example.com/sfp/api/integrations"
Empty
GET/sfp/api/integrations/defaults

List all integrations marked as system defaults. One default per provider category (AI providers are grouped — only one default across all AI providers). Default integrations are used as fallback when a project has no project-specific integration.

Authentication: Requires Owner role.

Authorization

access-token
AuthorizationBearer <token>

In: header

Response Body

curl -X GET "https://example.com/sfp/api/integrations/defaults"
Empty
GET/sfp/api/integrations/credentials

Fetch integrations matching the filter criteria. All access is logged for audit purposes.

Authentication: Requires Owner role or Application token. Application tokens must specify a provider or project filter to prevent unscoped credential enumeration.

Secret material is returned to application tokens only (workers/CI — the machinery that consumes the credential). Human callers (Owners) receive integration METADATA only — credentials is omitted from every entry, so no stored secret ever reaches a browser or terminal session.

Authorization

access-token
AuthorizationBearer <token>

In: header

Query Parameters

provider?string

Filter by service: github or jira

Value in

  • "github"
  • "azuredevops"
  • "jfrog"
  • "gitlab"
  • "npm"
  • "github_packages"
  • "jira"
  • "azure-devops"
  • "servicenow"
  • "ai_anthropic"
  • "ai_openai"
  • "ai_google"
  • "ai_github_copilot"
  • "ai_amazon_bedrock"
  • "ai_google_vertex"
  • "ai_cloudflare_gateway"
  • "ai_anthropic_platform"
  • "datadog"
  • "newrelic"
  • "splunk"
  • "browserbase"
  • "slack"
  • "teams"
project?string

Filter by registered project identifier (e.g., flxbl-io/sf-core). List projects via GET /projects.

feature*string
workItemRef*string

Response Body

curl -X GET "https://example.com/sfp/api/integrations/credentials?feature=string&workItemRef=string"
Empty
GET/sfp/api/integrations/ai/models

The manually-maintained APPROVED model catalog, per AI provider, in each provider's own model-id format. Newest first — the first entry is the provider's automatic default. Feeds the AI integration card's model chooser.

Authentication: Requires Owner role (same audience as the integration forms).

Authorization

access-token
AuthorizationBearer <token>

In: header

Response Body

curl -X GET "https://example.com/sfp/api/integrations/ai/models"
Empty
GET/sfp/api/integrations/ai/cherry-to-policy

Returns a non-secret, deterministic policy result for the cherry-to CLI. Credential material is never included; application callers retrieve the selected integration through the audited credentials endpoint.

Authorization

access-token
AuthorizationBearer <token>

In: header

Query Parameters

project*string

Registered repository identifier

target?string

Target branch to evaluate against cherryTo.targetBranches

Response Body

application/json

curl -X GET "https://example.com/sfp/api/integrations/ai/cherry-to-policy?project=string"
{  "enabled": true,  "targetAllowed": true,  "status": "available",  "reason": "cherry_to_not_configured",  "integrationProvider": "ai_anthropic",  "runtimeProvider": "anthropic",  "model": "string",  "integrationId": "string"}
PATCH/sfp/api/integrations/{id}

Update credentials, config, or default status of an existing integration. Only provided fields are updated — omitted fields remain unchanged.

Authentication: Requires Owner role.

Updatable fields:

  • credentials: Credential fields to update — merged onto the stored credentials. Omitted keys and blank strings keep their stored value; an explicit null clears a field.
  • config: Provider-specific configuration
  • isDefault: Toggle default status for this provider category

Immutable fields (cannot be changed after creation):

  • provider
  • authType
  • projects / isGlobal

Authorization

access-token
AuthorizationBearer <token>

In: header

Path Parameters

id*string

Integration ID (UUID)

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

curl -X PATCH "https://example.com/sfp/api/integrations/string" \  -H "Content-Type: application/json" \  -d '{}'
Empty
DELETE/sfp/api/integrations/{id}

Permanently delete an integration and its encrypted credentials.

Authentication: Requires Owner role. This action cannot be undone.

Effects:

  • Removes the integration configuration
  • Deletes encrypted credentials from secure storage
  • Removes integration reference from associated projects
  • Logs deletion in audit trail

Authorization

access-token
AuthorizationBearer <token>

In: header

Path Parameters

id*string

Integration ID (UUID)

Response Body

curl -X DELETE "https://example.com/sfp/api/integrations/string"
Empty
POST/sfp/api/integrations/servicenow/release-gate

Internal worker-only endpoint: used by the request-release flow to decide whether a release must be gated by a ServiceNow change request, and to retrieve the connection + change-request text (including the candidate baseline changelog). Restricted to the internal worker (application token).

Authorization

access-token
AuthorizationBearer <token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

curl -X POST "https://example.com/sfp/api/integrations/servicenow/release-gate" \  -H "Content-Type: application/json" \  -d '{    "repositoryIdentifier": "string",    "environments": [      "string"    ],    "releaseCandidate": "string"  }'
Empty
POST/sfp/api/integrations/servicenow/release-gate/open

Internal worker-only endpoint: resolves release-gate policy, opens/reuses the shared ServiceNow CR for the release candidate set, and registers the generic approval-gate record without returning ServiceNow credentials to the worker.

Authorization

access-token
AuthorizationBearer <token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

curl -X POST "https://example.com/sfp/api/integrations/servicenow/release-gate/open" \  -H "Content-Type: application/json" \  -d '{    "repositoryIdentifier": "string",    "environments": [      "string"    ],    "releaseCandidate": "string"  }'
Empty
POST/sfp/api/integrations/servicenow/release-gate/status

Internal worker-only endpoint: returns the cached ServiceNow gate decision and refreshes it from ServiceNow only when the per-gate cache is due.

Authorization

access-token
AuthorizationBearer <token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

curl -X POST "https://example.com/sfp/api/integrations/servicenow/release-gate/status" \  -H "Content-Type: application/json" \  -d '{    "repositoryIdentifier": "string",    "releaseCandidate": "string",    "environment": "string",    "correlationId": "string"  }'
Empty
POST/sfp/api/integrations/servicenow/release-gate/event

Internal worker-only endpoint: posted by the request-release worker when the change request is opened and when it is approved/rejected/timed out, so the gate appears in sfp_approval_audit. Does not create a pending approval. Restricted to the internal worker (application token).

Authorization

access-token
AuthorizationBearer <token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

curl -X POST "https://example.com/sfp/api/integrations/servicenow/release-gate/event" \  -H "Content-Type: application/json" \  -d '{    "event": "requested",    "repositoryIdentifier": "string",    "releaseCandidate": "string",    "environments": [      "string"    ],    "correlationId": "string"  }'
Empty
POST/sfp/api/integrations/servicenow/change-requests/test

Creates a real ServiceNow change request using the project integration and the same configured field rendering as the release gate. Stored credentials are never returned.

Authorization

access-token
AuthorizationBearer <token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

curl -X POST "https://example.com/sfp/api/integrations/servicenow/change-requests/test" \  -H "Content-Type: application/json" \  -d '{    "repositoryIdentifier": "string"  }'
Empty
GET/sfp/api/integrations/servicenow/field-catalog

Returns the server-owned merge fields available to serviceNowChangeRequest.fieldTemplate.

Authorization

access-token
AuthorizationBearer <token>

In: header

Response Body

curl -X GET "https://example.com/sfp/api/integrations/servicenow/field-catalog"
Empty
GET/sfp/api/integrations/platforms/health

Verifies that the source control platform (GitHub or Azure DevOps) is reachable and that credentials are valid for each registered project.

How it works

Each project registered via POST /projects declares a platform field (github or azure-devops). This endpoint resolves the credentials for each project's platform and makes a lightweight API call to confirm access.

Credential resolution

PlatformWhat is checked
GitHubUses the GitHub App credentials (user-configured integration first, falls back to built-in App from server environment). Calls GET /repos/{owner}/{repo} to confirm repository access.
Azure DevOpsUses the Service Principal credentials from the configured integration. Calls GET /_apis/connectiondata to confirm API connectivity.

Modes

ParameterBehavior
No projectLists all registered projects and checks each one. Useful for a full integration health overview.
project=flxbl-io/sf-coreChecks only the specified project. Useful for verifying a single onboarding.

Response statuses

Overall statusMeaning
healthyAll projects have working platform integrations
degradedSome projects are healthy, others are not
unhealthyNo project has a working platform integration

Common failure causes

  • GitHub: App not installed on the organization, or repository is private and not accessible to the App
  • Azure DevOps: Service Principal not registered via POST /integrations, invalid client credentials, or organization URL is wrong

Authentication

Requires any authenticated role (Owner, Member, or Application token).

Authorization

access-token
AuthorizationBearer <token>

In: header

Query Parameters

project?string

Project identifier to check (e.g., flxbl-io/sf-core for GitHub, org/project/repo for Azure DevOps). Omit to check all registered projects.

Response Body

application/json

curl -X GET "https://example.com/sfp/api/integrations/platforms/health"
{  "status": "healthy",  "timestamp": "2026-02-20T08:35:53.050Z",  "platforms": [    {      "provider": "github",      "project": "flxbl-io/sf-core",      "status": "healthy",      "message": "GitHub App has access to flxbl-io/sf-core",      "latency": 482    }  ]}