# 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)