Overview
Integrations are installable, OAuth-connected, per-account additions that connect SparkVault to external systems. They are distinct from global Products, which are always available and never require installation, and from platform Elements (Entropy, Sparks, SparkLinks, Vaults, Ingots), which are the primitives everything else composes over.
Slack
Browse vaults, manage ingots and share protected files from Slack, and send expiring, single-read secrets with /share_secret or /secret.
HubSpot
Encrypted file storage on HubSpot CRM records: a SparkVault Files tab on every Contact, Company, Deal, and Ticket.
Salesforce
Encrypted file storage on Salesforce CRM records: a SparkVault Files panel on every Account, Contact, Opportunity, and Case.
All three integrations connect to an external service and require an OAuth authorization on that service before they are active. Install them from app.sparkvault.com/integrations, or see the OAuth Install Flow below.
Why Use Integrations?
Zero Cryptographic Expertise Required
Each integration provides its own setup and access flow. Slack brings vaults, ingots and one-time secrets into App Home, slash commands and dialogs, while vault keys are entered only on a brief SparkVault page; Slack processes the information entered or displayed in its interface. HubSpot and Salesforce files use SparkVault's vault and Forge access controls.
Tenant and Record Isolation by Design
The CRM integrations serve many portal/org users against one shared installation without ever sharing access: vault unseals mint per-user VAT sessions keyed to the verified CRM user, and every download or delete is verified against the requesting record's folder, enforcing per-record isolation within a tenant.
Predictable Pricing
Secrets sent from Slack are free on every plan. HubSpot and Salesforce add no per-operation fees; standard vault storage and transfer pricing applies.
Fully Audited
The vault, file, and SparkLink operations an integration performs are recorded in your
audit trail at the scope they touch, like any other; Slack
additionally exposes usage analytics at GET /v1/apps/slack/analytics.
Authentication
Integration endpoints authenticate on four planes:
| Plane | Endpoints | Authentication |
|---|---|---|
| Management | List, get, install, update, and uninstall (/v1/apps, /v1/apps/:app_id) |
List and get: standard SparkVault auth, a JWT session or an X-API-Key header. Install, update and uninstall: the session of an admin or owner; an API key is refused. Install and update are refused (403) for every integration here, since each connects through its OAuth flow. |
| Provider webhooks | Slack webhooks/commands, webhooks/interactions and webhooks/events; HubSpot's webhooks |
Signature-verified per provider: Slack X-Slack-Signature, HubSpot signature v3. Salesforce has no provider webhook. |
| Slack page steps | Slack webhooks/native/*: connect, unlock, sharing and private download on a brief SparkVault page |
A one-use link SparkVault issued in Slack, sent from the SparkVault page; connecting also requires Sign in with Slack as the member the link names. |
| CRM proxy | HubSpot/Salesforce resolve, files, unseal, download, delete-file |
Provider context: HubSpot-signed requests resolved by portal_id lookup; Salesforce session bearer verified against the installed org. |
No integration holds your API key. HubSpot and Salesforce act for your account through a SparkVault credential that their OAuth callback obtains from SparkVault itself, never exposed to the browser, and every request they make with it answers to your account's plan, storage and bandwidth exactly as your own requests do. The Slack integration holds only the sessions its members start: each member signs in to SparkVault as themselves, and the app keeps that member's session, encrypted, to act as them in Slack with no more access than they have. Disconnecting, removing or re-authorizing the workspace ends every member's session, and each also expires on its own. There is no integration credential for you to create or rotate.
Create and manage API keys from the API Keys page. Use separate keys for different environments and integrations.
Entropy is a platform Element: FIPS 140-3 validated, HSM-backed randomness available to every account without installation. See the Entropy API documentation.
Response Format
All integration endpoints follow the standard SparkVault response format:
{
"data": {
// Integration-specific response fields
},
"meta": {
"api_version": "1.2.828",
"request_id": "7f3c9a2e5b1d4e8f9a6c2d4b-1k",
"response_ms": 42,
"timestamp": 1783036800
}
}
Authenticated success responses also carry meta.quota: your account's current
rate-limit status (see Rate Limits).
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid app_id"
},
"meta": {
"api_version": "1.2.828",
"request_id": "7f3c9a2e5b1d4e8f9a6c2d4b-1k"
}
}
Install Lifecycle API
Integrations are installed per account and managed through the /v1/apps endpoints.
Listing and reading an integration take standard SparkVault authentication (JWT or API key).
Installing, updating and uninstalling take the session of an admin or owner; an
API key is refused (403). Every integration here connects through its
OAuth Install Flow, so a direct install or update is refused (403).
/v1/apps
List the account's installed integrations plus the ids of every integration available in the catalog.
Response Fields
| Field | Type | Description |
|---|---|---|
installed |
array | Installed integrations, each with app_id, status, installed_at (Unix epoch seconds), and settings. |
available |
array | Ids of all integrations in the catalog: slack, hubspot, salesforce. |
List integrations
Requestcurl https://api.sparkvault.com/v1/apps \
-H "X-API-Key: sv_live_abc123xyz789..."
{
"data": {
"installed": [
{
"app_id": "slack",
"status": "active",
"installed_at": 1783036800,
"settings": {}
}
],
"available": ["slack", "hubspot", "salesforce"]
}
}
/v1/apps/:app_id
Get installation status and catalog details for a single integration. An uninstalled integration returns installed: false with status not_installed, not a 404.
Response Fields
| Field | Type | Description |
|---|---|---|
app_id |
string | Integration id (slack, hubspot, or salesforce). |
name |
string | Display name from the catalog. |
description |
string | Catalog description. |
category |
string | Always integrations. |
features |
array | Catalog feature list. |
pricing |
object | Pricing summary: per-operation entries (operations) and a human-readable description. |
oauth_required |
boolean | Whether the integration requires an OAuth authorization on the external service. true for all three. |
installed |
boolean | Whether the integration is installed for this account. |
status |
string | active when installed; not_installed otherwise. |
settings |
object | The installation's settings. Present when installed. |
installed_at |
integer | Install time (Unix epoch seconds). Present when installed. |
account |
object | Account branding for customer-facing surfaces: organization_name, logo_url_light, logo_url_dark. |
/v1/apps/:app_id
Install an integration. Refused (403) for an integration with oauth_required, whatever the request carries: it installs only through its OAuth flow. All three catalog integrations are OAuth-connected.
All three catalog integrations set oauth_required. They are installed through the
OAuth Install Flow, which validates the provider grant and then
creates the installation: the grant is the only proof that you control the external workspace,
so no one creates the installation, its workspace binding or its settings directly.
/v1/apps/:app_id
Update an installed integration's settings. Refused (403) for an integration with oauth_required, whose settings and workspace binding change only through its OAuth flow; all three catalog integrations are OAuth-connected.
/v1/apps/:app_id
Uninstall an integration. Requires the session of an admin or owner; an API key is refused. Returns 204 No Content. The installation is soft-deleted, and connecting the integration again through its OAuth flow reactivates it.
Error Responses
| Status | Code | Description |
|---|---|---|
| 400 | VALIDATION_ERROR |
Invalid app_id |
| 403 | FORBIDDEN |
Install or update of an OAuth-connected integration; install, update or uninstall by an API key, or by a member who is not an admin or owner |
| 404 | NOT_FOUND |
Unknown integration id, or uninstalling an integration that is not installed |
OAuth Install Flow
Every integration requires an OAuth authorization on the external service. The flow is the same for all three:
- Authorize on the provider: Start the install from app.sparkvault.com/integrations. You are redirected to the provider's consent screen.
-
Exchange the code: After the provider redirects back, the frontend posts the
authorization code to the integration's OAuth callback under your SparkVault session (JWT):
POST /v1/apps/{slack|hubspot|salesforce}/oauth/callbackwith{ code, redirect_uri }. The CRM integrations additionally send the selectedvault_id. Their SparkVault credential is minted between trusted services and is never exposed to browser JavaScript. -
Server-side validation: The backend exchanges the code with the provider and
validates the grant. Slack requires the
commandsandchat:writebot scopes and is workspace-scoped. Org-wide Enterprise Grid installs are rejected. HubSpot and Salesforce verify the selected vault's ownership server-side with the caller's own token, so an installation can never bind to someone else's vault. - Installation created: On success the installation is created. Slack and Salesforce re-authorize an existing active install in place with a fresh token set (the recovery path for a revoked or expired connection); HubSpot requires uninstalling before reinstalling.
Slack OAuth callback
Requestcurl -X POST https://api.sparkvault.com/v1/apps/slack/oauth/callback \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"code": "slack_oauth_code",
"redirect_uri": "https://app.sparkvault.com/apps/slack/oauth/callback"
}'
{
"data": {
"installed": true,
"team_id": "T0123456789",
"team_name": "Acme Corp",
"account_id": "acc_xyz789..."
}
}
Uninstalling
Every integration uninstalls user-initiated via
DELETE /v1/apps/{app_id}/uninstall (the session of an admin or owner; an API key is
refused); Slack's first asks Slack to remove the app from the workspace. Slack and
HubSpot also uninstall automatically on their signed provider webhook: Slack
app_uninstalled/tokens_revoked, HubSpot app.deauthorize.
Salesforce has no uninstall webhook: a Salesforce session proves only that its user belongs to
the org, not the authority to disconnect the org for everyone.
Available Integrations
Slack
Browse vaults, manage ingots, and share protected files or expiring, single-read secrets from Slack.
/sparkvault, App Home and shortcuts for vaults and ingots in Slack, unlocked on a brief SparkVault page- Durable
files.svshares and one-timex.svSparkLinks, with access review before posting /share_secretand/secretfor single-read Sparks- Direct-message and channel destinations
- Recipient confirmation before reading
- Automatic expiration for unread secrets
- Workspace secret usage reporting
Pricing: Secrets are free on every plan. Files use normal storage and transfer capacity.
| Method | Path | Purpose | Auth |
|---|---|---|---|
| POST | /v1/apps/slack/webhooks/commands | Slash command handler | Slack signature |
| POST | /v1/apps/slack/webhooks/interactions | Button/modal interactions | Slack signature |
| POST | /v1/apps/slack/webhooks/events | Slack Events API | Slack signature |
| POST | /v1/apps/slack/oauth/callback | OAuth install callback | Admin or owner session |
| DELETE | /v1/apps/slack/uninstall | User-initiated uninstall | Admin or owner session |
| POST | /v1/apps/slack/webhooks/native/* | SparkVault page steps: connect, unlock, sharing, private download | One-use link from Slack |
| GET | /v1/apps/slack/analytics | Usage analytics | JWT or API key |
View full Slack documentation →
HubSpot
Encrypted file storage on HubSpot CRM records. Access vault files directly from Contact, Company, Deal, and Ticket tabs.
- SparkVault Files tab on CRM records
- Folder-per-record organization (Contacts, Companies, Deals, Tickets)
- Triple Zero-Trust encryption via Forge
- Vault unseal via VMK or DVAK
- Download and delete files from HubSpot; an upload opens the record's folder in SparkVault in a new tab
Pricing: Standard vault storage and transfer pricing applies. No additional per-operation fees.
| Method | Path | Purpose | Auth |
|---|---|---|---|
| POST | /v1/apps/hubspot/resolve | Map CRM record to vault + folder | HubSpot v3 signature + portal_id lookup |
| POST | /v1/apps/hubspot/files | List files in a CRM record's folder, with the SparkVault upload page for it | HubSpot v3 signature + portal_id lookup |
| POST | /v1/apps/hubspot/unseal | Unseal vault with VMK/DVAK | HubSpot v3 signature + portal_id lookup |
| POST | /v1/apps/hubspot/download | Get Forge URL for file download | HubSpot v3 signature + portal_id lookup |
| POST | /v1/apps/hubspot/delete-file | Delete a file from the vault | HubSpot v3 signature + portal_id lookup |
| POST | /v1/apps/hubspot/oauth/callback | OAuth install + server-verified vault selection | Admin or owner session |
| DELETE | /v1/apps/hubspot/uninstall | User-initiated uninstall | Admin or owner session |
| POST | /v1/apps/hubspot/webhooks | HubSpot webhook events | HubSpot signature v3 |
View full HubSpot documentation →
Salesforce
Encrypted file storage on Salesforce CRM records. Access vault files directly from Account, Contact, Opportunity, and Case pages.
- SparkVault Files panel on CRM records
- Folder-per-record organization (Accounts, Contacts, Opportunities, Cases)
- Triple Zero-Trust encryption via Forge
- Vault unseal via VMK or DVAK
- Download and delete files from Salesforce; an upload opens the record's folder in SparkVault in a new tab
Package version: the panel requires version 1.8 of the SparkVault managed package. Earlier versions do not send the Salesforce session SparkVault verifies, so SparkVault refuses every request their panel makes.
Pricing: Standard vault storage and transfer pricing applies. No additional per-operation fees.
| Method | Path | Purpose | Auth |
|---|---|---|---|
| POST | /v1/apps/salesforce/resolve | Map CRM record to vault + folder | Salesforce session bearer |
| POST | /v1/apps/salesforce/files | List files in a CRM record's folder, with the SparkVault upload page for it | Salesforce session bearer |
| POST | /v1/apps/salesforce/unseal | Unseal vault with VMK/DVAK | Salesforce session bearer |
| POST | /v1/apps/salesforce/download | Get Forge URL for file download | Salesforce session bearer |
| POST | /v1/apps/salesforce/delete-file | Delete a file from the vault | Salesforce session bearer |
| POST | /v1/apps/salesforce/oauth/callback | OAuth install + server-verified vault selection | Admin or owner session |
| DELETE | /v1/apps/salesforce/uninstall | User-initiated uninstall | Admin or owner session |
Common Error Codes
Error Responses
| Status | Code | Description |
|---|---|---|
| 400 | VALIDATION_ERROR |
Invalid or missing required parameters |
| 401 | AUTHENTICATION_ERROR |
Missing or invalid API key |
| 402 | PLAN_REQUIRED |
An active subscription is required for this operation |
| 429 | RATE_LIMIT_EXCEEDED |
Too many requests. Retry after the specified time. |
| 500 | INTERNAL_ERROR |
Server error. Contact support if persistent. |
Rate Limits
There are no per-integration rate limits. Rate limiting is account-wide: 5000 operations per minute in a fixed 60-second window, applied to every authenticated API call. The limiter fails closed: if the rate-limit check itself cannot complete, the request is rejected rather than let through.
Authenticated success responses report your current status in meta.quota:
{
"quota": {
"limit": 5000,
"used": 15,
"remaining": 4985,
"resets_at": 1783036860
}
}
Exceeding the limit returns 429 RATE_LIMIT_EXCEEDED with a Retry-After
header and details carrying limit, used, and
resets_at.
Enterprise customers can request increased rate limits. Contact your account representative or reach out to support@sparkvault.com to discuss your requirements.
Best Practices
- Use scoped API keys: Create separate keys per application and rotate them regularly.
- Handle errors gracefully: Implement proper error handling and retry logic with exponential backoff for transient failures.
-
Monitor usage: Read what an integration did in the
audit trail and Slack usage analytics with
GET /v1/apps/slack/analytics. Account-wide usage and costs live in the Reporting API. - Cache when appropriate: Some responses can be cached briefly to reduce API calls, but never cache sensitive data or security-critical values.
- Validate inputs client-side: Reduce API calls by validating parameters before sending requests.