# API Keys Source: https://docs.steuerboard.com/api-keys How to get your API Key All API endpoints require authentication using an API key. You must include your API key in the Authorization header of each request using the Bearer token format. ## Getting an API Key (takes under a minute) * Login into your account at app.steuerboard.com * Go to the API page: **Settings -> API** * Create a new API key **Don't have an account?** We offer a free plan for testing. Just mail us at [founders@steuerboard.com](mailto:founders@steuerboard.com) If you want to use our App in production, please take a look at our [Pricing page](https://steuerboard.com/pricing) to book a call with us. ## Types of keys There are two types of API keys: * Accountant keys * Client keys Client keys are restricted to client context and dont have access to some endpoints. **We highlight restricted endpoints in our API reference:** This endpoint is only available with an **Accountant API key**. # Create a client Source: https://docs.steuerboard.com/api-reference/adminclients/create-a-client https://api.steuerboard.com/v1/openapi post /admin/clients Creates a new client for the accountant and returns the created client. This endpoint only works with the **Accountant API key**. More information [here](/api-keys) # Get a client Source: https://docs.steuerboard.com/api-reference/adminclients/get-a-client https://api.steuerboard.com/v1/openapi get /admin/clients/{id} Returns a single client by ID. This endpoint only works with the **Accountant API key**. More information [here](/api-keys) # List clients Source: https://docs.steuerboard.com/api-reference/adminclients/list-clients https://api.steuerboard.com/v1/openapi get /admin/clients Returns a paginated list of clients. This endpoint only works with the **Accountant API key**. More information [here](/api-keys) # Update a client Source: https://docs.steuerboard.com/api-reference/adminclients/update-a-client https://api.steuerboard.com/v1/openapi patch /admin/clients/{id} Updates a client by ID. This endpoint only works with the **Accountant API key**. More information [here](/api-keys) # Delete an accountant user Source: https://docs.steuerboard.com/api-reference/adminusers/delete-an-accountant-user https://api.steuerboard.com/v1/openapi delete /admin/users/{id} Deletes an accountant user by ID. This endpoint only works with the **Accountant API key**. More information [here](/api-keys) # Get an accountant user Source: https://docs.steuerboard.com/api-reference/adminusers/get-an-accountant-user https://api.steuerboard.com/v1/openapi get /admin/users/{id} Returns a single accountant user by ID. This endpoint only works with the **Accountant API key**. More information [here](/api-keys) # Invite an accountant user Source: https://docs.steuerboard.com/api-reference/adminusers/invite-an-accountant-user https://api.steuerboard.com/v1/openapi post /admin/users Invites a new accountant user and returns the created record. This endpoint only works with the **Accountant API key**. More information [here](/api-keys) # List accountant users Source: https://docs.steuerboard.com/api-reference/adminusers/list-accountant-users https://api.steuerboard.com/v1/openapi get /admin/users Returns a paginated list of accountant users. This endpoint only works with the **Accountant API key**. More information [here](/api-keys) # Update an accountant user Source: https://docs.steuerboard.com/api-reference/adminusers/update-an-accountant-user https://api.steuerboard.com/v1/openapi patch /admin/users/{id} Updates an accountant user by ID. This endpoint only works with the **Accountant API key**. More information [here](/api-keys) # Me Source: https://docs.steuerboard.com/api-reference/auth/me https://api.steuerboard.com/v1/openapi get /me Returns information about the authenticated principal. # Delete a file Source: https://docs.steuerboard.com/api-reference/files/delete-a-file https://api.steuerboard.com/v1/openapi delete /files/{id} Deletes a file by ID. # Download file content Source: https://docs.steuerboard.com/api-reference/files/download-file-content https://api.steuerboard.com/v1/openapi get /files/{id}/content Returns a temporary presigned URL to download the file. The URL expires after 10 minutes. # Get a file Source: https://docs.steuerboard.com/api-reference/files/get-a-file https://api.steuerboard.com/v1/openapi get /files/{id} Returns a single file by ID. # List files Source: https://docs.steuerboard.com/api-reference/files/list-files https://api.steuerboard.com/v1/openapi get /files Returns a paginated list of files with optional workspace filters. # Update a file Source: https://docs.steuerboard.com/api-reference/files/update-a-file https://api.steuerboard.com/v1/openapi patch /files/{id} Updates a file by ID. # Upload a file Source: https://docs.steuerboard.com/api-reference/files/upload-a-file https://api.steuerboard.com/v1/openapi post /files Uploads a new file. Maximum file size is 500MB. # Health Check Source: https://docs.steuerboard.com/api-reference/health/health-check https://api.steuerboard.com/v1/openapi get /health Returns service health status for monitoring and container orchestration. # Ping Pong Source: https://docs.steuerboard.com/api-reference/health/ping-pong https://api.steuerboard.com/v1/openapi get /ping Returns a pong response for health checks. # Introduction Source: https://docs.steuerboard.com/api-reference/introduction Understand general concepts, response codes, and authentication strategies. ## Base URL The Steuerboard API is built on REST principles. We enforce HTTPS in every request to improve data security, integrity, and privacy. The API does not support HTTP. All requests contain the following base URL: ``` https://api.steuerboard.com/v1 ``` ## Authentication To authenticate you need to add an Authorization header with the contents of the header being Bearer sb\_xxxxxxxxx where sb\_xxxxxxxxx is your API Key. ``` Authorization: Bearer sb_xxxxxxxxx ``` **Helpful resources:** Read more about how to get your API Key **Don't have an account?** We offer a free plan for testing. Just mail us at [founders@steuerboard.com](mailto:founders@steuerboard.com) If you want to use our App in production, please take a look at our [Pricing page](https://steuerboard.com/pricing) to book a call with us. # Rate Limit Source: https://docs.steuerboard.com/api-reference/rate-limit Understand the rate limit for the Steuerboard API. The Steuerboard API has a rate limit of **60 requests per minute**. If you exceed the rate limit, you will receive a 429 response error. ## Response Headers The response headers describe your current rate limit following every request in conformance with the [sixth IETF standard draft](https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-ratelimit-headers-06): | Header name | Description | | ------------------- | ------------------------------------------------------------------- | | ratelimit-limit | Maximum number of requests allowed within a window. | | ratelimit-remaining | Number of requests remaining within a window. | | ratelimit-reset | Time at which the rate limit will reset. | | retry-after | How many seconds you should wait before making a follow-up request. | To prevent this, we recommend reducing the rate at which you request the API. This can be done by introducing a queue mechanism or reducing the number of concurrent requests per second. If you have specific requirements, contact support to request a rate increase. # Create a task Source: https://docs.steuerboard.com/api-reference/tasks/create-a-task https://api.steuerboard.com/v1/openapi post /tasks Creates a new task and returns the created task. # Delete a task Source: https://docs.steuerboard.com/api-reference/tasks/delete-a-task https://api.steuerboard.com/v1/openapi delete /tasks/{id} Deletes a task by ID. # Get a task Source: https://docs.steuerboard.com/api-reference/tasks/get-a-task https://api.steuerboard.com/v1/openapi get /tasks/{id} Returns a single task by ID. # List tasks Source: https://docs.steuerboard.com/api-reference/tasks/list-tasks https://api.steuerboard.com/v1/openapi get /tasks Returns a paginated list of tasks with optional client and workspace filters. # Update a task Source: https://docs.steuerboard.com/api-reference/tasks/update-a-task https://api.steuerboard.com/v1/openapi patch /tasks/{id} Updates a task by ID. # Delete a user Source: https://docs.steuerboard.com/api-reference/users/delete-a-user https://api.steuerboard.com/v1/openapi delete /users/{id} Deletes a client user from the client by ID. # Get a user Source: https://docs.steuerboard.com/api-reference/users/get-a-user https://api.steuerboard.com/v1/openapi get /users/{id} Returns a single client user by ID. # Invite a user Source: https://docs.steuerboard.com/api-reference/users/invite-a-user https://api.steuerboard.com/v1/openapi post /users Invites a new client user and returns the created record. # List users Source: https://docs.steuerboard.com/api-reference/users/list-users https://api.steuerboard.com/v1/openapi get /users Returns a paginated list of client users. # Update a user Source: https://docs.steuerboard.com/api-reference/users/update-a-user https://api.steuerboard.com/v1/openapi patch /users/{id} Updates a client user by ID. # Webhooks Source: https://docs.steuerboard.com/api-reference/webhooks Listen to events from the Steuerboard API. ## Overview Webhooks enable your application to set up event based actions. In this section, you’ll learn how to configure webhooks to receive updates from Steuerboard. ## Events * **File**: A file has been created, updated or deleted. * **File Comment**: A file comment has been created * **Task**: A task has been created, updated or deleted. * **Task Comment**: A task comment has been created * **Client**: A client has been created, updated or deleted. * **Workspace**: A workspace has been created, updated or deleted. ## Configuration To configure webhooks, you need to create an endpoint in your Settings. Visit your [Steuerboard Dashboard](https://app.steuerboard.com). **Don't have an account?** We offer a free plan for testing. Just mail us at [founders@steuerboard.com](mailto:founders@steuerboard.com) If you want to use our App in production, please take a look at our [Pricing page](https://steuerboard.com/pricing) to book a call with us. Go to **Settings -> API** and click on **"Create Webhook"**. Enter a valid URL and select the events you want to receive. ## Retries Webhooks are retried 7 times with an exponential backoff. If the webhook fails 7 times, the endpoint will be disabled. You can re-enable the endpoint at any time in your dashboard. ## Webhook Authentication Webhook authentication ensures that incoming webhook requests are securely verified before processing. This allows consumers to trust that webhook events originate from a secure and verified source. ### How It Works Each webhook request sent from the server includes an `X-Webhook-Signature` header containing a SHA-256 HMAC signature of the request payload. This signature is generated using a secret key known only to the server and your application. When the consumer receives a webhook, they can use the signature provided in the `X-Webhook-Signature` header to verify that the request has not been tampered with. This is done by computing their own HMAC signature using the shared secret key and comparing it to the signature included in the header. ### Verifying the Signature * Compute the HMAC SHA-256 signature using the payload and the shared secret key * Compare the computed signature to the `X-Webhook-Signature` header value * If they match, the request is verified as authentic. If they do not match, treat the request with caution or reject it By verifying webhook signatures, consumers can ensure that webhook events received are secure and have not been altered during transmission. ### Code Examples Here's how to verify webhook signatures in different programming languages: ```javascript handler.js theme={null} const crypto = require('crypto'); function verifyWebhookSignature(payload, signature, secret) { // Parse the signature header const elements = signature.split(','); const sigData = {}; for (const element of elements) { const [key, value] = element.split('='); sigData[key] = value; } // Extract timestamp and signature const timestamp = sigData.t; const expectedSignature = sigData.v1; if (!timestamp || !expectedSignature) { throw new Error('Invalid signature format'); } // Create the payload string that was signed const signedPayload = `${timestamp}.${payload}`; // Compute the HMAC const computedSignature = crypto .createHmac('sha256', secret) .update(signedPayload) .digest('hex'); // Compare signatures using a constant-time comparison return crypto.timingSafeEqual( Buffer.from(expectedSignature, 'hex'), Buffer.from(computedSignature, 'hex') ); } // Express.js example app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => { const signature = req.headers['x-webhook-signature']; const payload = req.body.toString(); const secret = process.env.WEBHOOK_SECRET; // Your webhook secret try { if (!verifyWebhookSignature(payload, signature, secret)) { return res.status(401).send('Invalid signature'); } // Process the webhook const data = JSON.parse(payload); console.log('Verified webhook:', data); res.status(200).send('OK'); } catch (error) { console.error('Webhook verification failed:', error); res.status(400).send('Bad request'); } }); ``` ```python handler.py theme={null} import hmac import hashlib import os import time def verify_webhook_signature(payload: str, signature: str, secret: str) -> bool: """Verify webhook signature""" # Parse the signature header sig_data = {} for element in signature.split(','): key, value = element.split('=', 1) sig_data[key] = value timestamp = sig_data.get('t') expected_signature = sig_data.get('v1') if not timestamp or not expected_signature: raise ValueError('Invalid signature format') # Create the payload string that was signed signed_payload = f"{timestamp}.{payload}" # Compute the HMAC computed_signature = hmac.new( secret.encode('utf-8'), signed_payload.encode('utf-8'), hashlib.sha256 ).hexdigest() # Compare signatures using a constant-time comparison return hmac.compare_digest(expected_signature, computed_signature) # Flask example from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/webhook', methods=['POST']) def handle_webhook(): signature = request.headers.get('X-Webhook-Signature') payload = request.get_data(as_text=True) secret = os.environ.get('WEBHOOK_SECRET') # Your webhook secret try: if not verify_webhook_signature(payload, signature, secret): return jsonify({'error': 'Invalid signature'}), 401 # Process the webhook data = request.get_json() print(f'Verified webhook: {data}') return jsonify({'status': 'success'}), 200 except Exception as e: print(f'Webhook verification failed: {e}') return jsonify({'error': 'Bad request'}), 400 ``` ```go handler.go theme={null} package main import ( "crypto/hmac" "crypto/sha256" "crypto/subtle" "encoding/hex" "fmt" "io" "net/http" "os" "strings" ) func verifyWebhookSignature(payload, signature, secret string) (bool, error) { // Parse the signature header sigData := make(map[string]string) for _, element := range strings.Split(signature, ",") { parts := strings.SplitN(element, "=", 2) if len(parts) == 2 { sigData[parts[0]] = parts[1] } } timestamp, ok := sigData["t"] if !ok { return false, fmt.Errorf("missing timestamp in signature") } expectedSignature, ok := sigData["v1"] if !ok { return false, fmt.Errorf("missing signature in header") } // Create the payload string that was signed signedPayload := fmt.Sprintf("%s.%s", timestamp, payload) // Compute the HMAC mac := hmac.New(sha256.New, []byte(secret)) mac.Write([]byte(signedPayload)) computedSignature := hex.EncodeToString(mac.Sum(nil)) // Compare signatures using constant-time comparison return subtle.ConstantTimeCompare( []byte(expectedSignature), []byte(computedSignature), ) == 1, nil } func webhookHandler(w http.ResponseWriter, r *http.Request) { signature := r.Header.Get("X-Webhook-Signature") // Read the body body, err := io.ReadAll(r.Body) if err != nil { http.Error(w, "Failed to read request body", http.StatusBadRequest) return } payload := string(body) secret := os.Getenv("WEBHOOK_SECRET") // Your webhook secret valid, err := verifyWebhookSignature(payload, signature, secret) if err != nil { http.Error(w, "Bad request", http.StatusBadRequest) return } if !valid { http.Error(w, "Invalid signature", http.StatusUnauthorized) return } // Process the webhook fmt.Printf("Verified webhook: %s\n", payload) w.WriteHeader(http.StatusOK) } ``` ### Signature Format The `X-Webhook-Signature` header contains multiple components separated by commas: * `t=`: Unix timestamp when the signature was generated * `v1=`: HMAC-SHA256 signature in hexadecimal format * `alg=`: The algorithm used (always `hmac-sha256`) Example: `t=1640995200,v1=a1b2c3d4...,alg=hmac-sha256` # Client changes Source: https://docs.steuerboard.com/api-reference/webhooks/client-changes https://api.steuerboard.com/v1/openapi webhook webhooks/clientChanges # File changes Source: https://docs.steuerboard.com/api-reference/webhooks/file-changes https://api.steuerboard.com/v1/openapi webhook webhooks/fileChanges # File comment created Source: https://docs.steuerboard.com/api-reference/webhooks/file-comment-created https://api.steuerboard.com/v1/openapi webhook webhooks/fileCommentCreated # Task changes Source: https://docs.steuerboard.com/api-reference/webhooks/task-changes https://api.steuerboard.com/v1/openapi webhook webhooks/taskChanges # Task comment created Source: https://docs.steuerboard.com/api-reference/webhooks/task-comment-created https://api.steuerboard.com/v1/openapi webhook webhooks/taskCommentCreated # Workspace changes Source: https://docs.steuerboard.com/api-reference/webhooks/workspace-changes https://api.steuerboard.com/v1/openapi webhook webhooks/workspaceChanges # Create a workspace member Source: https://docs.steuerboard.com/api-reference/workspacemembers/create-a-workspace-member https://api.steuerboard.com/v1/openapi post /workspaces/{id}/members Creates a new workspace member. # List workspace members Source: https://docs.steuerboard.com/api-reference/workspacemembers/list-workspace-members https://api.steuerboard.com/v1/openapi get /workspaces/{id}/members Returns workspace members for a workspace. # Remove a workspace member Source: https://docs.steuerboard.com/api-reference/workspacemembers/remove-a-workspace-member https://api.steuerboard.com/v1/openapi delete /workspaces/{id}/members Removes a workspace member from a workspace. # Create a workspace Source: https://docs.steuerboard.com/api-reference/workspaces/create-a-workspace https://api.steuerboard.com/v1/openapi post /workspaces Creates a new workspace and returns the created workspace. # Get a workspace Source: https://docs.steuerboard.com/api-reference/workspaces/get-a-workspace https://api.steuerboard.com/v1/openapi get /workspaces/{id} Returns a single workspace by ID. # List workspaces Source: https://docs.steuerboard.com/api-reference/workspaces/list-workspaces https://api.steuerboard.com/v1/openapi get /workspaces Returns a paginated list of workspaces. # Update a workspace Source: https://docs.steuerboard.com/api-reference/workspaces/update-a-workspace https://api.steuerboard.com/v1/openapi patch /workspaces/{id} Updates a workspace by ID. # Introduction Source: https://docs.steuerboard.com/index Welcome to the Steuerboard Documentation ## Getting started Start building awesome workflows with the Steuerboard API. **Don't have an account?** We offer a free plan for testing. Just mail us at [founders@steuerboard.com](mailto:founders@steuerboard.com) If you want to use our App in production, please take a look at our [Pricing page](https://steuerboard.com/pricing) to book a call with us. Read more about how to get your API Key Read more about how to use our API Read more about how to build with Integrations # MCP server Source: https://docs.steuerboard.com/integrations/mcp Integrate the Steuerboard API into your AI assistant The Model Context Protocol (MCP) server provides a standardized interface that allows any compatible AI model or agent to access your Steuerboard data in a simple and secure way. Connect to our MCP server natively in Claude, Cursor, and other clients or use the mcp-remote module for backwards compatibility with clients that do not support remote MCP. The Steuerboard MCP server has tools available for finding, creating, and updating objects in Steuerboard like clients, workspaces, tasks, files and more — with more functionality on the way, and feedback on its functionality is welcomed. **Repository**: [steuerboard/steuerboard-mcp-typescript](https://github.com/steuerboard/steuerboard-mcp-typescript) ## Installation Navigate to [Integrations](https://app.langdock.com/integrations) in the sidebar Click on the "Add Integration" button and enter following details: * Type: **Connect remote MCP** * Name: **Steuerboard** Enter the following details: * Server URL: [https://mcp.steuerboard.com/mcp](https://mcp.steuerboard.com/mcp) * Authentication method: **API Key** Create a new connection and enter your **Steuerboard API Key**. *Don't have one? [Get your API Key](/api-keys)* Test the connection and save the integration **Team, Enterprise (Claude.ai)** Navigate to Settings in the sidebar Scroll to Integrations at the bottom and click Add more Enter the following details: * Integration name: Steuerboard * Integration URL: [https://mcp.steuerboard.com/mcp](https://mcp.steuerboard.com/mcp) Make sure to enable the tools in any new chats *One-click installation for Claude Desktop users* Download the [DXT File ⬇️](https://mcp.steuerboard.com/mcp-server.dxt). Open Claude Desktop and go to **Settings -> Extensions**. Drag the DXT file into the Extensions page to install the MCP server. The DXT file contains all necessary configuration for the MCP server and will be automatically installed when dragged into the Extensions page. *Use the Claude Code CLI to add the MCP server:* ```bash theme={null} claude mcp add --transport http Steuerboard https://mcp.steuerboard.com/mcp --header "authorization: ..." ``` ## Manual Installation *Start the MCP server manually using npx:* ```bash theme={null} npx @steuerboard/mcp start --bearer-auth ... ``` For a full list of server arguments: ```bash theme={null} npx @steuerboard/mcp --help ``` **Don't have an account?** We offer a free plan for testing. Just mail us at [founders@steuerboard.com](mailto:founders@steuerboard.com) If you want to use our App in production, please take a look at our [Pricing page](https://steuerboard.com/pricing) to book a call with us. # n8n Source: https://docs.steuerboard.com/integrations/n8n Use the Steuerboard API in your n8n workflows with official triggers and actions ## Overview n8n is a workflow automation tool to connect services and build automations without writing code. The official Steuerboard nodes for n8n provide actions and triggers for your account data (clients, workspaces, files, and tasks) so you can interact with, route, and process data inside your workflows. * Repository: [steuerboard/n8n-nodes-steuerboard](https://github.com/steuerboard/n8n-nodes-steuerboard) ## Prerequisites * A Steuerboard API key * n8n with Community Nodes enabled **Don't have an account?** We offer a free plan for testing. Just mail us at [founders@steuerboard.com](mailto:founders@steuerboard.com) If you want to use our App in production, please take a look at our [Pricing page](https://steuerboard.com/pricing) to book a call with us. ## Installation 1. In n8n, go to Settings → Community Nodes → Install. 2. Enter the Node name: `Steuerboard` and confirm. 3. Restart n8n if prompted. ## Authentication 1. In n8n, open Credentials → New → search for “Steuerboard”. 2. Paste your API key into the API Key field. 3. Save the credentials and select them in your Steuerboard nodes. ## Troubleshooting * 401 Unauthorized: Check that your credentials are set and selected in the node. * 429 Too Many Requests: You have hit a rate limit. Add a Wait node or lower concurrency. * 5xx Server Error: Retry with a Wait/Retry pattern. If persistent, contact support. ## Links * API docs home: [docs.steuerboard.com](https://docs.steuerboard.com) * n8n nodes repository: [steuerboard/n8n-nodes-steuerboard](https://github.com/steuerboard/n8n-nodes-steuerboard)