Appearance
Organization
Get information about an organization and update its settings.
List Organizations
GET
/organizations
Get all organizations the current user has access to.
Example response
json
// HTTP 200 OK
[
{
"id": 124,
"name": "Acme Inc",
"slug": "acme-inc",
"owner": {
"id": 1234,
"firstname": "Alice",
"lastname": "Cooper",
"fullName": "Alice Cooper",
"email": "alice.cooper@acme.com"
},
"logo": {
"uuid": "6aa451d3-54f2-4f69-a8cb-6f5591f14c8f",
"name": "logo.png",
"url": "https://api.blond.swiss/image/6aa451d3-54f2-4f69-a8cb-6f5591f14c8f/logo.png?h=100&w=100&signature=..."
},
"is_on_trial": true,
"trial_ends_at": "2022-12-15T08:08:06.000000Z",
"subscription": null,
"role_in_organization": "admin",
"created_at": "2022-09-16T07:08:06.000000Z"
}
]Get Organization
GET
/organizations/{organizationId}
Get detailed information about a specific organization.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
organizationId | Integer | Yes | The organization's ID |
Example response
json
// HTTP 200 OK
{
"id": 124,
"type": "independent",
"managed_by_id": null,
"managed_by": null,
"managing": [],
"owner": {
"id": 1234,
"firstname": "Alice",
"lastname": "Cooper",
"fullName": "Alice Cooper",
"email": "alice.cooper@acme.com"
},
"name": "Acme Inc",
"legal_form": "gmbh",
"vat_idn": "CHE-123.456.789",
"slug": "acme-inc",
"users": [
{
"id": 1234,
"firstname": "Alice",
"lastname": "Cooper",
"email": "alice.cooper@acme.com"
}
],
"archived_users": [],
"country": {
"id": 1,
"name": "Schweiz",
"code": "CH",
"currency_code": "CHF",
"default_vat_rate": 7.7
},
"is_on_trial": true,
"trial_ends_at": "2022-12-15T08:08:06.000000Z",
"subscription": null,
"ai_token_addon": null,
"ai_token_packages": [
{ "package": "5x", "weekly_tokens": 5000000, "available": true },
{ "package": "20x", "weekly_tokens": 20000000, "available": true }
],
"has_payment_method": false,
"billing_portal_url": "https://api.blond.swiss/organization/124/billing-portal?signature=...",
"billing_portal_plan_url": "https://api.blond.swiss/organization/124/billing-portal?signature=...",
"pm_type": null,
"pm_last_four": null,
"invoices": [],
"billing_name": "Acme Inc",
"billing_address": "Hardturmstrasse 123",
"billing_address_line_2": null,
"billing_city": "Zürich",
"billing_zip": "8005",
"billing_state": null,
"billing_country": "CH",
"phone_number": "+41 43 999 12 23",
"extra_billing_information": null,
"invitations": [],
"role_in_organization": "admin",
"member": {
"id": 185,
"role_name": "admin",
"created_at": "2022-09-16T07:08:06.000000Z"
},
"logo": {
"uuid": "6aa451d3-54f2-4f69-a8cb-6f5591f14c8f",
"name": "logo.png",
"url": "https://api.blond.swiss/image/6aa451d3-54f2-4f69-a8cb-6f5591f14c8f/logo.png?h=100&w=100&signature=..."
},
"max_dunning_level": 3,
"current_fiscal_year": {
"id": 1,
"name": "2024",
"start_date": "2024-01-01",
"end_date": "2024-12-31"
},
"oldest_open_fiscal_year": {
"id": 1,
"name": "2024",
"start_date": "2024-01-01",
"end_date": "2024-12-31"
},
"default_vat_rate": {
"id": 1,
"name": "Standard",
"rate": 7.7,
"is_default": true
},
"show_acquisition_tax": false,
"settings": {
"offeredIncomeETA": 6,
"monthlyIncomeGoal": 0,
"monthlyFixedExpenses": 0,
"averageInternalRate": 80,
"invoiceDefaultDueInDays": 30,
"autoSendInvoiceReminders": false,
"liableForVat": true,
"showNonVatLiableNote": true,
"documentNumberStart": 1,
"documentNumberFill": 5,
"documentNumberResetYearly": false,
"documentPrefixInvoice": "R-",
"documentPrefixOffer": "O-",
"documentPrefixExpense": "A-",
"invoiceTotalRound": 0.05,
"invoiceQrBillType": "QR",
"invoiceQrBillPrintable": false,
"invoiceFromOfferText": "Gemäss Offerte {number} erlauben wir uns diesen Betrag in Rechnung zu stellen.",
"invoiceFromOfferMultipleText": "Gemäss Offerte {number} erlauben wir uns diesen Teilbetrag in Rechnung zu stellen.",
"billingItemDescriptionTemplate": "{description} ({amount} Std.)",
"documentFontSize": 8,
"documentThemePrimary": "#000000",
"documentThemeHeadingColor": "#000000",
"documentThemeFontColor": "#212529",
"documentThemeBorderColor": "#212529",
"documentTableStyle": "classic",
"documentLogoShow": true,
"documentLogoSize": "normal",
"documentLogoAlignment": "left",
"documentFontFamily": "Inter",
"documentAddressAlignment": "left",
"documentPageCounter": null,
"documentFooterText": null,
"documentFooterTextAlignment": "left",
"documentMargin": {
"topCover": 50,
"topLogo": 25,
"top": 25,
"right": 25,
"bottom": 25,
"left": 25
},
"mailFromName": "",
"mailFromAddress": "",
"mailThemePrimaryColor": "#ffbb00",
"mailThemeFontColor": "#505362",
"mailThemeHeadingColor": "#10121e",
"mailThemeLogoWidth": 100,
"mailThemeCorners": "rounded",
"accountingEnabled": false,
"agentReconcileAfterImport": false,
"accountingDebtorAccount": "1100",
"accountingCreditorAccount": "2000",
"accountingRevenueAccount": "3400",
"accountingExpenseAccount": "4400",
"accountingVatAccount": "2200",
"accountingInputTaxAccount": "1170",
"accountingInputTaxOperationsAccount": "1171",
"accountingReverseTaxAccount": "2200",
"accountingNetTaxRate2Accounts": []
},
"mail_preview_url": "https://api.blond.swiss/mail/preview?organization=124",
"invoices_count": 1,
"offers_count": 1,
"projects_count": 1,
"companies_count": 1,
"products_count": 3,
"rates_count": 9,
"tags_count": 0,
"expenses_count": 0,
"times_count": 2,
"accounts_count": 15,
"bank_accounts_count": 1,
"unreconciled_bank_transactions_count": 0,
"expense_payment_methods_count": 2,
"qr_bill_enabled": true,
"agent_provider_profile": "openai",
"agent_provider_profile_inherited": null,
"agent_provider_profile_inherits": false,
"expense_parser_quota": 30,
"free_expense_parser_quota": 30,
"addons": [],
"created_at": "2022-09-16T07:08:06.000000Z"
}agent_provider_profile names the AI provider Agent Blond runs on for this organization: openai or mistral_eu. Blond sets it; organizations with the beta add-on can switch it themselves with Switch AI Provider. A client organization managed by an accountant follows the accountant's provider unless it picked one of its own: agent_provider_profile_inherited is the accountant's provider (null for organizations without an accountant), and agent_provider_profile_inherits is true while the client follows it.
AI tokens vs. credits
The ai_token_addon and ai_token_packages fields carry raw token values (e.g. weekly_tokens). The Blond app displays these as AI credits, where 10'000 tokens = 1 credit.
The subscription object
subscription is null when the organization has no subscription. When present it has the following shape:
json
{
"name": "default",
"stripe_status": "active",
"collection_method": "charge_automatically",
"is_invoice_billed": false,
"stripe_plan": "Ultimate",
"stripe_price": "price_...",
"quantity": 3,
"ends_at": null,
"billing_period": "yearly",
"promotion_discount": null,
"is_legacy": false
}| Field | Type | Description |
|---|---|---|
collection_method | String | How Stripe collects payment: charge_automatically (card) or send_invoice (paid via a Swiss QR-bill invoice). |
is_invoice_billed | Boolean | true when collection_method is send_invoice. These organizations manage plan and payment-method changes through support; self-serve changes are rejected. |
Update Organization
patch
/organizations/{organizationId}
Update organization details and settings.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
organizationId | Integer | Yes | The organization's ID |
Request body
| Attribute | Type | Required | Description |
|---|---|---|---|
name | String | No | Organization name (3-50 characters) |
legal_form | String | No | Legal form (see Legal Forms section) |
vat_idn | String | No | VAT identification number: a Swiss UID (e.g. CHE-123.456.789, optional MWST/TVA/IVA suffix), a Liechtenstein commercial register number (e.g. FL-0002.123.456-7) or a five-digit Liechtenstein VAT number |
billing_name | String | No | Billing name (max 255) |
billing_address | String | No | Billing address (max 255) |
billing_address_line_2 | String | No | Additional billing address line (max 255) |
billing_city | String | No | Billing city (max 255) |
billing_country | String | No | Billing country code (2 characters) |
billing_state | String | No | Billing state/province (max 255) |
billing_zip | String | No | Billing ZIP code (max 25) |
country_id | Integer | No | Country ID (must exist in countries) |
extra_billing_information | String | No | Extra billing information (max 1000) |
phone_number | String | No | Phone number (max 30) |
settings | Object | No | Organization settings object |
Legal Forms
Valid values for legal_form:
| Value | Description |
|---|---|
sole_proprietorship | Einzelfirma |
simple_partnership | Einfache Gesellschaft |
general_partnership | Kollektivgesellschaft |
limited_partnership | Kommanditgesellschaft |
plc | Aktiengesellschaft (SA/AG) |
llc | Gesellschaft mit beschränkter Haftung (Sàrl/GmbH) |
association | Verein |
foundation | Stiftung |
Organization Settings
| Setting | Type | Description |
|---|---|---|
monthlyIncomeGoal | Number | Monthly income goal (min: 0) |
monthlyFixedExpenses | Number | Monthly fixed expenses (min: 0) |
averageInternalRate | Number | Average internal hourly rate (min: 1) |
liableForVat | Boolean | Whether organization is liable for VAT |
showNonVatLiableNote | Boolean | Show note for non-VAT liable organizations |
customerPortalEnabled | Boolean | Enable customer portal |
customerPortalShowSections | Array | Sections to show (invoices, offers, credits) - min 1 |
customerPortalShowClosedDocuments | Boolean | Show closed documents in customer portal |
invoiceDefaultDueInDays | Number | Default invoice due days (0-365) |
invoiceTotalRound | Number | Invoice total rounding (0.01 or 0.05) |
invoiceHeader | String | Invoice header text |
invoiceFooter | String | Invoice footer text |
invoiceMailMessage | String | Default invoice email message |
invoiceNotifyCustomerPaid | Boolean | Notify customer when invoice is paid |
invoiceNotifyCustomerPaidText | String | Text for paid invoice notification (max 1000) |
invoiceQrBillType | String | QR bill type (QRR, SCOR, NON) |
invoiceQrBillIban | String | QR bill IBAN (21 alphanumeric, starts with CH/LI) |
invoiceQrBillCIN | Number | QR bill customer identification number (0-999999) |
invoiceQrBillPrintable | Boolean | Make QR bill printable |
billingItemNameTemplate | String | Template for billing item names (max 255) |
billingItemDescriptionTemplate | String | Template for billing item descriptions (max 255) |
expensePaymentIban | String | IBAN for expense payments (starts with CH/LI) |
autoSendInvoiceReminders | Boolean | Automatically send invoice reminders |
documentFontSize | Number | Document font size in points (4-20) |
documentThemePrimary | String | Primary theme color (hex color) |
documentThemeHeadingColor | String | Heading color (hex color) |
documentThemeFontColor | String | Font color (hex color) |
documentThemeBorderColor | String | Border color (hex color) |
documentThemeHighContrast | Boolean | Use high contrast theme |
documentTableStyle | String | Table style (classic, elegant) |
documentCustomCSS | String | Custom CSS for documents (HTML tags stripped) |
documentFontFamily | String | Document font family (max 255) |
documentLogoAlignment | String | Logo alignment (left, center, right) |
documentLogoShow | Boolean | Show logo on documents |
documentLogoSize | String | Logo size (extra-small, small, normal, large, extra-large) |
documentAddressAlignment | String | Address alignment (left, right) |
documentPageCounter | String | Page counter position (left, center, right) |
documentFooterText | String | Footer text shown on sales document PDFs (sanitized HTML, max 500 visible characters, supports {organization.*} merge tags) |
documentFooterTextAlignment | String | Footer text alignment (left, center, right), default left |
documentMargin | Object | Document margins (6 required fields: topCover, topLogo, top, right, bottom, left - each 0-100) |
documentNumberStart | Number | Starting document number (min: 1) |
documentNumberFill | Number | Document number padding (0-6) |
documentNumberResetYearly | Boolean | Reset document numbers yearly |
documentPrefixInvoice | String | Invoice document prefix (1-25 characters) |
documentPrefixOffer | String | Offer document prefix (1-25 characters) |
documentPrefixExpense | String | Expense document prefix (1-25 characters) |
mailFromName | String | Email sender name (max 255) |
mailFromAddress | String | Email sender address (valid email, max 255) |
mailThemePrimaryColor | String | Email theme primary color (hex color) |
mailThemeFontColor | String | Email theme font color (hex color) |
mailThemeHeadingColor | String | Email theme heading color (hex color) |
mailThemeLogoWidth | Number | Email logo width in pixels (50-400) |
mailThemeCorners | String | Email theme corner style (rounded, sharp) |
offerHeader | String | Offer header text |
offerFooter | String | Offer footer text |
offerMailMessage | String | Default offer email message |
offerSummaryPosition | String | Offer summary position (top, bottom) |
terms | String | Terms and conditions |
invoiceFromOfferText | String | Text when creating invoice from offer |
invoiceFromOfferMultipeText | String | Text when creating multiple invoices from offer |
orderConfirmationHeader | String | Order confirmation header |
orderConfirmationFooter | String | Order confirmation footer |
accountingEnabled | Boolean | Enable accounting features |
agentReconcileAfterImport | Boolean | Let Agent Blond stage match proposals for the open transactions of every bank statement upload (default false; requires the AI opt-in) |
immutableJournal | Boolean | Make older manual bookings immutable (default false). While true, manual bookings created before today (Europe/Zurich) can't be deleted or edited in place, they have to be reversed. Once enabled it can't be disabled (422) |
accountingDebtorAccount | String | Debtor account number (max 10) |
accountingCreditorAccount | String | Creditor account number (max 10) |
accountingRevenueAccount | String | Revenue account number (max 10) |
accountingExpenseAccount | String | Expense account number (max 10) |
accountingVatAccount | String | VAT account number (max 10) |
accountingReverseTaxAccount | String | Reverse tax account number (max 10) |
accountingUnclearAmountsAccount | String | Unclear amounts account number (max 10) |
accountingFinancialIncomeAccount | String | Account for currency gains (max 10, default 6950) |
accountingFinancialExpensesAccount | String | Account for currency losses (max 10, default 6900) |
accountingNetTaxRate2Accounts | Array | Net tax rate 2 accounts (account numbers must exist) |
Example request
json
{
"name": "Acme Corporation",
"billing_address": "Hardturmstrasse 456",
"settings": {
"monthlyIncomeGoal": 50000,
"liableForVat": true,
"invoiceDefaultDueInDays": 14,
"documentThemePrimary": "#ff0000"
}
}Switch AI Provider
put
/organizations/{organizationId}/agent-provider-profile
Switch the AI provider Agent Blond runs on. Calling this endpoint accepts the new provider's data processing terms for the whole organization, so only call it after an admin agreed to them. New conversations run on the new provider; existing conversations keep the provider they started with.
Only available to organizations with the beta add-on (their own or their accountant's), and only to members who may edit the organization. Otherwise the endpoint answers 403.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
organizationId | Integer | Yes | The organization's ID |
Request body
| Attribute | Type | Required | Description |
|---|---|---|---|
agent_provider_profile | String | Yes | openai or mistral_eu. A client organization of an accountant may send null to follow the accountant's provider. |
Example request
json
{
"agent_provider_profile": "mistral_eu"
}Responds with the updated organization (see Get Organization); settings.aiAgentOptInConfirmedAt holds the time of the consent.
Get Organization Settings
GET
/organizations/{organizationId}/settings
Get organization settings only.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
organizationId | Integer | Yes | The organization's ID |