Integration endpoints

Read a workspace's integrations, connect OpenSync with a space token, test the connection and disconnect it through the REST API.

Updated

New in November 2026

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"
}
FieldDescription
provideropensync, the only provider for now.
connectedWhether the workspace is connected. When it's false, the other fields are null.
settingsOpenSync's address, the space ID and the folder for notes.
tokenHintThe last four characters of the token, for admins only; null for everyone else. The token itself never comes back.
lastStatus, lastErrorThe result of the last save or test, ok or error, and why it failed.
lastUsedAtWhen a note was last saved, or null.

List integrations

GET /integrations

Every provider, connected or not. Anyone in the workspace, and API keys with the read scope.

Connect OpenSync

PUT /integrations/opensync

Admins. Connects the workspace to an OpenSync space, or updates the connection. Fishcamp checks the token with OpenSync first and saves nothing if that fails.

FieldTypeRequiredDescription
spaceIdstringYesThe space ID, or the space link copied from the browser (…/spaces/<id>/…).
tokenstringTo connectThe 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).
folderstringNoFolder for notes inside the space: up to 120 characters, with letters, numbers, spaces, -, _, . and /, and no . or .. parts. Default: Fishcamp/Meeting notes.
baseUrlstringNoOpenSync'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.

ErrorWhen
422 integration_rejectedOpenSync refused: a wrong or revoked token, an unknown space or a rate limit. message says which.
422 validation_errorA 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_unreachableOpenSync didn't answer, or its address leads to a private network.

Test the connection

POST /integrations/:provider/test

Admins. 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/:provider

Admins. Deletes the connection and the stored token. Returns 204, or 404 when it isn't connected. Notes already saved in OpenSync stay there.

On this page