Integration endpoints
Read a workspace's integrations, connect OpenSync with a space token, test the connection and disconnect it through the REST API.
Updated
Paths are relative to https://api.fishcamp.space/api/v1 and all need the X-Workspace-Id header. Everyone in the
workspace can read the integrations; connecting, testing and disconnecting are admin actions that must be made by a
person (requests with an API key get 403 forbidden). Setup in the app:
OpenSync integration.
The integration object
{
"provider": "opensync",
"connected": true,
"settings": {
"baseUrl": "https://api.opensync.space",
"spaceId": "space-123",
"folder": "Fishcamp/Meeting notes"
},
"tokenHint": "…Q7xk",
"lastStatus": "ok",
"lastError": null,
"lastUsedAt": "2026-11-05T15:31:04.000Z",
"updatedAt": "2026-11-05T14:10:00.000Z"
}| Field | Description |
|---|---|
provider | opensync, the only provider for now. |
connected | Whether the workspace is connected. When it's false, the other fields are null. |
settings | OpenSync's address, the space ID and the folder for notes. |
tokenHint | The last four characters of the token, for admins only; null for everyone else. The token itself never comes back. |
lastStatus, lastError | The result of the last save or test, ok or error, and why it failed. |
lastUsedAt | When a note was last saved, or null. |
List integrations
GET /integrationsEvery provider, connected or not. Anyone in the workspace, and API keys with the read scope.
Connect OpenSync
PUT /integrations/opensyncAdmins. Connects the workspace to an OpenSync space, or updates the connection. Fishcamp checks the token with OpenSync first and saves nothing if that fails.
| Field | Type | Required | Description |
|---|---|---|---|
spaceId | string | Yes | The space ID, or the space link copied from the browser (…/spaces/<id>/…). |
token | string | To connect | The space token, osk_…. When updating with the same spaceId and baseUrl, leave it out to keep the stored one. Changing either needs the token again (422 otherwise). |
folder | string | No | Folder for notes inside the space: up to 120 characters, with letters, numbers, spaces, -, _, . and /, and no . or .. parts. Default: Fishcamp/Meeting notes. |
baseUrl | string | No | OpenSync's address: public https, without a path or query (/api at the end is accepted and dropped). Default: https://api.opensync.space. |
curl -X PUT "https://api.fishcamp.space/api/v1/integrations/opensync" \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "X-Workspace-Id: YOUR_WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{"spaceId": "https://opensync.space/spaces/space-123", "token": "osk_YOUR_SPACE_TOKEN"}'Returns 200 with the integration.
| Error | When |
|---|---|
422 integration_rejected | OpenSync refused: a wrong or revoked token, an unknown space or a rate limit. message says which. |
422 validation_error | A field is invalid, for example a token that doesn't start with osk_, an address that isn't public https, a folder with .., or a new space or address without the token. |
502 integration_unreachable | OpenSync didn't answer, or its address leads to a private network. |
Test the connection
POST /integrations/:provider/testAdmins. Asks OpenSync again with the stored token and returns the integration, with lastStatus set to ok or
error (the answer is 200 either way). Not connected: 404.
Disconnect
DELETE /integrations/:providerAdmins. Deletes the connection and the stored token. Returns 204, or 404 when it isn't connected. Notes
already saved in OpenSync stay there.
Transcript endpointsNew
List a channel's transcripts, read one with every line and its speaker, and choose where it goes, through the REST API.
Security and privacy
How Fishcamp protects sign-in, secrets, invites, guests, agents, audio and transcripts. Hashed tokens, deny-by-default rooms, no stored audio and HTTPS.