Service keys and the agents that use them
Save a key from the catalog, your own HTTP API or a database, choose which agents use it, check it and rotate it.
On this page
What a key is
A credential is a key Sallyport keeps for one service: an API key, a token, a sign-in at the provider or a database password. Sallyport adds it to each call itself. No agent, person or API can read it back.
A saved key goes to every agent of its workspace, including agents an owner or admin creates later. An AI client that a member connects by signing in starts with no keys, and an owner or admin adds them on its “Access” list. Adding keys takes the owner or admin role.
Pick the source
Open Add a credential. “Credential source” has six choices:
| Credential source | Use it for |
|---|---|
| Catalog | A service Sallyport knows, such as GitHub, Stripe or Cloudflare. Its address and the way the key travels are already set. |
| Custom API | Any public HTTPS API outside the catalog. |
| Remote MCP | An MCP server on the internet. See MCP clients and remote servers. |
| SSH host | A server your agents run commands on. See SSH commands. |
| Database | Your PostgreSQL, MySQL, SQL Server, ClickHouse, MongoDB or Redis at a public address. Agents get one tool to read and one to change. |
| S3 storage | A bucket of Amazon S3, Cloudflare R2, Backblaze B2, Wasabi, DigitalOcean Spaces, Google Cloud Storage or any S3-compatible storage. See S3 storage. |
| Your mailbox at Gmail, Outlook, Yahoo, iCloud, Fastmail, Zoho or your own mail server. Agents send, read and sort its mail. See Email. |
Add a catalog service
Pick the service in “Service from the catalog”. “Name in the console” fills itself, for example github-live. With several workspaces, pick the “Workspace” too.
Keep “Live” under “Environment”. Agents created in the console are live, and a live agent sees live keys only.
Under “How to connect …”, choose a way. “Sign in with …” takes you to the provider and back; Sallyport keeps the grant and renews it. “Access token”, “API key” and the other ways take a key you paste.
“Create the key at …” opens the provider’s page for a new key. A service at an address of your own also asks for “Your address at …”. Press “Save the credential”, or the sign-in button.
Some sign-ins need your own app at the provider. The form then shows a “Redirect URI”: register it in the app, then paste the app’s “Client ID” and “Client secret”.
Services that take an app’s client ID and secret
Greenhouse Harvest v3, Zoom Server-to-Server apps, Auth0 machine-to-machine applications, Bandwidth and the Sinch Conversation API take an app’s client ID and secret. Make the app at the provider and paste both. Sallyport buys a short-lived token at the address the provider names and renews it before it expires. Zoom also asks for the account ID; Greenhouse takes the ID of the user the token acts as, or acts as the app’s own user.
PlanetScale and Etsy want two parts of a key in one header. Type each part into its own field; Sallyport joins them on every call.
Services that sign each request
Some services take no key in the request at all: every call carries a signature made with a secret or a private key. Binance, Bybit, OKX, Kraken, Coinbase, App Store Connect, GitHub Apps, Snowflake key pairs, NetSuite and Azure Service Bus work this way. Paste the key the way the form asks; Sallyport signs every call at the moment it is sent, and the key itself never leaves.
| How to connect | What Sallyport does on each call |
|---|---|
| API key and secret | Adds the time and a signature of the request made with the secret, in the header or query parameter the service names. |
| Private key | Signs a short-lived token with the key and sends it as the bearer. For a GitHub App the token buys an installation token first. |
| OAuth 1.0a tokens | Signs the request with the consumer and token secrets and sends the Authorization: OAuth … header. |
A person who approves a call approves the request itself. The time and the signature are added when the call is sent, after the yes, so an approval given minutes earlier still fits. The agent leaves them out; if it sends its own, Sallyport drops them.
Connect your own HTTP API
Choose “Custom API” and enter the “HTTPS service URL”, for example https://api.example.com:8443/v1. Add the port when it is not 443. Leave out a login, a query and a fragment.
The path limits the key: with /v1, calls reach /v1 and the paths below it only. Choose the “Authentication”, enter the key and press “Save credential and connect”.
| Authentication | What Sallyport adds to each call |
|---|---|
| Bearer | Authorization: Bearer … |
| Basic | The user name and password as Authorization: Basic …. |
| API key | The key in a “Request header” (X-API-Key, Authorization: token … or your own), a “Query parameter”, a “JSON request body” field or the “URL path”. |
| Digest | The user name and password answer the service’s Digest challenge. The password never crosses the wire. |
| Sign-in endpoint | A session token. Sallyport posts the user name and password to the “Sign-in URL” and reads the token from the JSON answer, a response header or a cookie. It sends the token in the header you name and signs in again when the session ends. |
| Client certificate | Nothing in a header: Sallyport presents the “Certificate” and “Private key”, PEM, in the TLS handshake. |
| OAuth: sign in | A token from a sign-in at the provider. You enter its “Authorization URL”, “Token URL”, “Scopes” and your app’s client ID and secret. Register https://mcp.sallyport.cloud/callback/upstream as the app’s redirect URI. |
| Google service account | A Google token Sallyport mints from the “Service account JSON” you paste, for the “Scopes” you list. |
| OAuth: client credentials | A token Sallyport mints for your app at its “Token URL” and renews before it expires. The token URL may be on another host than the API, like login.microsoftonline.com for Azure. |
| AWS Signature V4 | A signature on every request, made with your “Access key ID” and “Secret access key” for the “Region” and “Signing service” you name. For S3 buckets, the S3 storage source does it for you. |
| HMAC signature | A signature on every request, made with your “Signing secret”. The “Signing template” from the service’s docs says what is signed and where the signature goes. An “API key (optional)” travels in the “API key header”. |
| Signed JWT | A short-lived JWT Sallyport signs with your “Private key”. The “JWT template” holds the algorithm, the claims and the lifetime, and an exchange when the service trades the JWT for a token. |
| OAuth 1.0a | A signature on every request from your “Consumer key”, “Consumer secret”, “Token ID” and “Token secret”. Pick the “Signature method”. A “Realm (optional)” is for a service such as NetSuite, which wants the account ID. |
The “Injection preview” shows what goes out. “Advanced connection options” adds headers and query parameters sent with every call. They are settings, so keep keys out of them.
A service that wants a client certificate beside its key takes it under “Add a client certificate”, sealed with the key. Some services, such as a Kubernetes API server, use a certificate no public authority signed. Paste their CA under “Trusted CA certificates” in “Advanced connection options”. Only that connection trusts it, and it still reaches public addresses only.
“What the calls are” tells a read from a change. “REST” goes by the method. “GraphQL” makes a query a read and a mutation a change. “JSON-RPC” makes the “Read methods” you list reads and every other method a change. “SQL in the body” reads the statement at “Where the statement is”, such as /statement for Snowflake. One SELECT is a read, and DROP or a DELETE without WHERE is destructive.
Choose which agents use a key
The key’s page lists “Agents that can use this key”. “Remove” takes the key from one agent.
To give it back, open the agent in Agents and go to “Access”. “Add connection” adds one key, and “Add all” adds every key of the workspace.
Each row has “Ask every call” and a rule for “read”, “write” and “destructive”: “Automatic”, “Approval required” or “Denied”. New rows run every call without asking. See Approvals.
Check that a key works
When the service has a check, Sallyport runs it as it saves the key. For GitHub that is GET /user. The result is under “Where this key goes” on the key’s page, and “Check again” repeats it.
Rotate a key
Create a new key at the provider first. On the key’s page, press “Rotate credential”, enter the new value and press “Save the new credential”.
The new version works at once, and Sallyport checks it. The old version keeps working for 24 hours so calls already running can finish.
Then revoke the old key at the provider; “Revoke it at …” opens the page. Press “I revoked it” to record that. To rename a key, press its name at the top of its page. “Delete key” at the bottom takes the key and its connections away; the dialog first names the agents that lose them.