Flowyer

Connecting external AI assistants

How to connect ChatGPT, Claude, Gemini, Grok, DeepSeek or Cursor to Flowyer, and what an API key can and cannot do.

Developer API reference

What is this?

With a personal API key an external AI assistant can read and create records (matters, clients, tasks, time entries, costs and documents) in Flowyer on your behalf and, where you allow it, modify them. Every request runs with exactly your permissions, narrowed further by what you allow on the key; matters, clients and tasks a bot created carry a small marker in the lists showing which key created them, and for time entries, costs and documents the creating key is recorded but shown only to an office administrator, under "Records created through the API".

What a key can NOT do

Creating an API key

  1. An office administrator enables API access for the office under Settings > API keys (it is off by default).
  2. On the same page you create a key: give it a name (e.g. "ChatGPT") so you know later which bot each key identifies.
  3. Tick what the bot may do (read, create or modify) and set an expiry. A key's permissions cannot be changed later: if more is needed, create a new key.
  4. The key is shown only once: copy it into the assistant's settings. You can revoke it any time, with immediate effect.

Give every bot its own key. They can be revoked separately, and the matter, client and task lists show which one created a record.

Available permissions

Connecting

Always use the exact https host starting with www. (a redirect would drop the authorization header). For API-key connections, send the key as "Authorization: Bearer <key>"; MCP clients instead authenticate with OAuth, signing in through the browser, so no key needs to be entered.

Base URL
https://www.flowyer.com/api/agent
OpenAPI
https://www.flowyer.com/api/agent/openapi.json
MCP
https://mcp.flowyer.com/mcp

ChatGPT (Actions)

In a custom GPT, import the OpenAPI description below under Actions, choose API key authentication with the "Bearer" type and paste your Flowyer key.

https://www.flowyer.com/api/agent/openapi.json

Grok

Give Grok the address of the OpenAPI description and the key; the description tells it which operations exist and which parameters they take.

Claude Code

Claude Code connects to the MCP server; on first use it signs you in through the browser (OAuth), no key needed:

claude mcp add --transport http flowyer https://mcp.flowyer.com/mcp

Claude Desktop / Cursor / Gemini CLI / DeepSeek

Claude Desktop, Cursor, the Gemini CLI and DeepSeek-based MCP clients take the same MCP address in their configuration file; on first connection the client signs you in through the browser (OAuth), no key needs to be entered:

{
  "mcpServers": {
    "flowyer": {
      "url": "https://mcp.flowyer.com/mcp"
    }
  }
}

REST (curl)

Direct REST call examples:

curl -H "Authorization: Bearer flw_..." https://www.flowyer.com/api/agent/me
curl -H "Authorization: Bearer flw_..." "https://www.flowyer.com/api/agent/matters?q=2026/0025"
curl -X POST -H "Authorization: Bearer flw_..." -H "Content-Type: application/json" \
     -H "Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f" \
     -d '{"name":"Kovács Kft.","email":"info@kovacs.hu"}' https://www.flowyer.com/api/agent/clients

Rules

Safe retries (Idempotency-Key)

Every create accepts an Idempotency-Key header (or an idempotency_key field): a request repeated with the same value returns the same record instead of creating another, and different keys always create different records. Without a key, an identical create within 120 seconds returns the first record.

Errors

Every error has the same shape: a machine code (error), an English message (message) and the message in the office language (message_localized). The message says what to do next. Retrying an unchanged request makes no sense on 401, 403, 404 and 422, with two exceptions: on 404 upload_not_finished, finish the upload to upload_url first, then call complete again; on an expired OAuth access token (401 expired_key), refresh the token first.

{
  "error": "scope_missing",
  "message": "This API key does not have the \"clients:create\" permission. ...",
  "message_localized": "Ehhez az API-kulcshoz nem tartozik \"clients:create\" jogosultság. ...",
  "locale": "hu",
  "details": { "required_scope": "clients:create" }
}
HTTPerrorMeaning
400invalid_json, use_www_host, bad_requestMalformed request: invalid JSON body, wrong host (use the www. host) or an unreadable request.
401missing_key, invalid_key, revoked_key, expired_key, user_inactive, office_not_foundThe key is missing, invalid, revoked or expired, its owner is no longer active, or the office of the key cannot be found.
403scope_missing, module_forbidden, forbidden, office_api_disabled, licence_expired, office_archivedA permission is missing on the key or the user, or the office has not enabled the API.
404not_found, matter_not_visible, unknown_endpoint, upload_not_finished, replay_not_visibleThe record does not exist or the user may not see it; unknown endpoint; the uploaded file has not reached storage yet (upload_not_finished: upload it to upload_url, then call complete again); or a retried create whose record was created earlier but has since been deleted or hidden (replay_not_visible: nothing new was created, do not create it again).
405delete_not_allowed, update_not_allowed, method_not_allowedDeleting is not possible through the API; modifying only where the description offers a PATCH operation.
409client_exists, client_exists_generic, idempotency_key_reused, duplicate_in_progress, record_conflict, record_locked, duplicate_nameA client with that name already exists; a document with that name already exists in the folder (duplicate_name); the record changed since you read it (record_conflict: read it again and resend the change with the new updated_at); the record has been invoiced or locked (record_locked: make the change in Flowyer); the Idempotency-Key was used on another resource; or an identical request is being processed.
413request_too_large, file_too_largeThe request body is too large (request_too_large), or the file to upload exceeds the limit (file_too_large; details.max gives the limit in bytes).
422validation_failed, unknown_client, unknown_colleague, blocked_file_type, upload_token_invalid, folder_not_in_matter, document_name_too_longAn invalid or missing field (details.fields shows which); an invalid, used or expired upload token (upload_token_invalid: start the upload again); or a folder that does not belong to the matter (folder_not_in_matter).
429rate_limited, auth_rate_limitedToo many requests (300 per minute per key); the Retry-After header says when to retry.
500server_errorUnexpected error. The request was logged under its request_id; retry later, and if it repeats, quote that id to Flowyer support.
503office_maintenance, office_setup_incomplete, temporarily_unavailableThe office is temporarily unavailable (maintenance or setup in progress); the Retry-After header says when to retry.

Privacy

The assistant's provider (e.g. OpenAI, Anthropic, xAI) sees every piece of data the key returns. Only give a key to a bot whose data processing the office has accepted, and only with the permissions it really needs.