Date: 2026-04-14 Status: Research Complete — Some hands-on items deferred (sandbox testing, webhook signature verification)
weclapp is a German cloud ERP (SaaS) for small and medium-sized businesses, founded in 2008, based in Marburg/Karlsruhe, certified ISO 27001 and GoBD-conform, with all data hosted in Frankfurt. weclapp SE was acquired by Exact in October 2022. It exposes a comprehensive REST API (v2 is the current major version, v1 still available) covering ~150 resources, including a first-class /purchaseInvoice endpoint suitable for AP automation.
The native API offers two distinct paths for AP invoice submission: (1) structured POST to /purchaseInvoice with full line-item, ledger-account, cost-center, and tax detail; or (2) document upload to /purchaseInvoice/startInvoiceDocumentProcessing/multipartUpload, which routes PDFs/images through Klippa-powered OCR and XML/ZUGFERD/FATTURAPA files through e-invoice detection — both produce a purchase invoice in INVOICE_RECEIVED status. PDF documents can also be attached to a structured invoice after creation via POST /document/upload.
Master data is well-covered natively: /party (suppliers and customers as boolean flags on a unified party entity), /ledgerAccount (full CRUD), /costCenter, /costType, /tax, /termOfPayment, /financialYear. Historical bookings are available via /accountingTransaction (read-only via GET; writeable only via the /accountingTransaction/batchBooking impersonal-booking action), and /purchaseOpenItem gives read access to outstanding payables. Webhooks support created / updated / deleted events on any entity, with a minimal payload {entityId, entityName, type} and a built-in retry ladder (1m → 5m → 30m → 5h → 1d → deactivation).
Maesn provides a weclapp connector but covers a narrower surface than the native API: customers, suppliers, and invoices are fully supported; bills, journal entries, ledger accounts, and purchase orders are flagged as "not supported by weclapp" in the Maesn dev docs (this phrasing is misleading — those resources do exist natively, they are just outside Maesn's connector scope). Make.com has two community apps; the richer "Maxmel Tech" variant exposes purchase invoice and supplier CRUD plus document upload. Zapier, Chift, Celigo, n8n, and Tray.io do not currently ship a weclapp connector.
| Capability | Available? | Method | Confidence | Notes |
|---|---|---|---|---|
| AP Invoice Submission (structured) | Yes, natively | POST /purchaseInvoice with full schema (supplierId, items, dates, costCenter, costType, taxes, ledger account per item) |
High | OpenAPI spec confirms POST/PUT/DELETE on the resource |
| AP Invoice Submission (document + OCR) | Yes, natively | POST /purchaseInvoice/startInvoiceDocumentProcessing/multipartUpload |
High | Spec quote: "supported file types are XML, PDF (with or without embedded XML) and images (PNG, JPEG, GIF, TIFF)". Async background job. OCR via Klippa requires admin consent in UI |
| AP Invoice Submission (e-invoice formats) | Yes | Same multipart endpoint; also documentType enum includes PURCHASE_INVOICE_ZUGFERD, PURCHASE_INVOICE_FATTURAPA |
High | Spec quote: "XML files and PDF files with embedded XML will be processed using e-invoice detection" |
| Attach PDF to existing invoice | Yes | POST /document/upload?entityName=PurchaseInvoice&entityId={id}&name=...&documentType=PURCHASE_INVOICE |
High | Generic document upload accepts any entity reference |
| AP Invoice Submission via Maesn | Limited | Maesn Invoices endpoint supports Read+Create; Bills is "on demand only" |
Medium | Bills/Invoices terminology overlap is unclear in Maesn docs; native API is the cleaner path |
| Suppliers (read/write) | Yes, natively | /party resource with supplier: true flag (full CRUD) |
High | Same entity also serves as customer (customer: true) |
| Ledger Accounts / Chart of Accounts | Yes, full CRUD | /ledgerAccount (GET, POST, PUT, DELETE) |
High | Schema: accountNumber, parentAccountId, type (CARRY_FORWARD/IMPERSONAL/PERSONAL_ACCOUNT), balanceSheetItem |
| Cost Centers (read/write) | Yes, full CRUD | /costCenter, /costCenterGroup |
High | Schema: costCenterNumber, costCenterType, description |
| Cost Types | Yes, full CRUD | /costType |
High | |
| Taxes | Yes, full CRUD; lookup helper | /tax, /tax/findPurchaseTax, /tax/findSalesTax |
High | findPurchaseTax accepts country code, taxRateType, partyType, date — useful for tax determination |
| Financial Year | Yes | /financialYear (CRUD); status enum CLOSED/CURRENT/PLANNED/PRELIMINARY_CLOSED |
High | |
| Historical Bookings (Read) | Yes | GET /accountingTransaction, GET /accountingTransaction/id/{id}, GET /accountingTransaction/count |
High | Bookings have transactionDetails (debit/credit, accountId, amount, taxId, costCenterId), bookingType (INCOMING_INVOICE, OUTGOING_INVOICE, IMPERSONAL, etc.) |
| Manual Journal Entry (Write) | Yes (constrained) | POST /accountingTransaction/batchBooking (creates "impersonal" type only) |
High | Spec: "Creates an accounting transaction of type 'impersonal'". No POST/PUT on the resource itself |
| Open Items (AP) | Yes, read-only | GET /purchaseOpenItem, POST /purchaseOpenItem/id/{id}/createPaymentApplication, POST /purchaseOpenItem/id/{id}/updatePaymentState |
High | Schema: amount, amountOpen, amountPaid, amountDiscount, cleared, openItemType (CREDITOR, etc.) |
| Bank Transactions (Read) | Yes, read+delete | GET /bankTransaction, DELETE /bankTransaction/id/{id} |
High | No POST — bank transactions are imported externally |
| Webhooks (set up) | Yes | POST /webhook with {entityName, atCreate, atUpdate, atDelete, url, requestMethod} |
High | Spec confirms full CRUD on /webhook |
| Webhook payload structure | Minimal | {"entityId": "...", "entityName": "...", "type": "CREATE|UPDATE|DELETE"} |
High | Quoted from doc.weclapp.com — consumer must GET the entity to retrieve content |
| Webhook retry policy | Built-in | 1m → 5m → 30m → 5h → 1d, then deactivated | High | Quoted from doc.weclapp.com |
| Webhook signature/HMAC verification | Not documented in public KB or OpenAPI | N/A | Low | Webhook schema has no secret field; no public docs found. Unresolved (see below) |
| PDF/Document Download | Yes | GET /purchaseInvoice/id/{id}/downloadLatestPurchaseInvoiceDocument, GET /document/id/{id}/download |
High | |
| Authentication | API token (header or HTTP Basic) | Header: AuthenticationToken: {token}, or HTTP Basic with username * |
High | Per-user token, regeneratable in-app, inherits the user's permissions |
| Rate Limit | No fixed limit; concurrent-request throttling | HTTP 429 if requests queue >30 seconds | High | Spec quote: "no fixed rate limits" — instead a parallel-request limit per tenant with a 30s queue |
| API Subscription Requirement | ERP Services tier or above | weclapp.com pricing | High | Starter (€39) does NOT include API access. Services starts at €86/user/month (monthly) or €95/user/month (annual) |
| Free Trial | 30 days, auto-cancel | weclapp.com pricing | High | Trial scope (which features) not explicitly itemised |
| Sandbox Environment | No dedicated sandbox; trial tenant or /system/createDemoTestSystem |
Trial signup or POST to system endpoint | Medium | Maesn confirms: "weclapp does not provide a dedicated sandbox" |
| Currency | Multi-currency | /currency, currencyConversionRate on records |
High | currencyConversionDate/Rate fields on baseRecordWithMoney |
| Custom Attributes | Yes | /customAttributeDefinition, attribute values on entities |
High | Filterable by customAttribute{id}-eq=... |
| Filtering / Querying | Rich | ?propertyName-{eq|ne|lt|gt|le|ge|null|notnull|like|notlike|ilike|notilike|in|notin}=value; or- prefix; filter=... expressions (beta) |
High | Filters can traverse references: customAttribute4587.entityReferences.entityId-eq=1234 |
"weclapp is the ERP-platform for teams. Whether CRM, merchandise management or accounting: With weclapp, teams jointly control all important business processes in just one software." — weclapp.com (search summary)
"All data is stored in Germany in accordance with the strict German data protection regulations. […] weclapp is a German company certified according to ISO 27001. weclapp is, among other things, ISO 27001-certified and GoBD-conform." — weclapp.com (search summary)
"In October 2022, weclapp was acquired by Exact, a leading provider of business and accounting software." — Crunchbase / search summary
Confidence: High
https://<TENANT>.weclapp.com/webapp/api/v2/"The base URL for the API is
https://<TENANT>.weclapp.com/webapp/api/v2/where<TENANT>.weclapp.comis the domain of the specific weclapp instance. So each weclapp instance has its own API endpoints which allow accessing data for that particular instance." — weclapp OpenAPI v2 spec, header description
| Operation | HTTP | URL pattern |
|---|---|---|
| List | GET | /<resource> |
| Count | GET | /<resource>/count |
| Get by id | GET | /<resource>/id/<id> |
| Create | POST | /<resource> |
| Update | PUT | /<resource>/id/<id> |
| Delete | DELETE | /<resource>/id/<id> |
| Action (resource-level) | POST | /<resource>/<action> |
| Action (instance-level) | POST | /<resource>/id/<id>/<action> |
Accept-Encoding: gzip); the API enforces gzip on responses if the header is missingThe OpenAPI v2 spec is ~46,500 lines and exposes ~150 distinct top-level resources. Functional groups directly relevant to AP automation:
/purchaseInvoice, /purchaseOrder, /purchaseOrderRequest, /purchaseRequisition, /purchaseOpenItem, /incomingGoods, /blanketPurchaseOrder/accountingTransaction, /ledgerAccount, /costCenter, /costCenterGroup, /costType, /tax, /taxDeterminationRule, /financialYear, /personalAccountingCode, /articleAccountingCode, /bankAccount, /bankTransaction, /cashAccount, /sepaDirectDebitMandate, /paymentRun, /paymentRunItem/party (customers + suppliers), /article, /articleCategory, /currency, /termOfPayment, /paymentMethod, /region, /legalForm/document, /webhook, /customAttributeDefinition, /job/status, /job/abort"weclapp" appears in Maesn's official integration list alongside DATEV, Xero, sevdesk, Xentral, Microsoft Business Central. — maesn.com/integrations
"Requires weclapp Personal Access Token and Tenant ID" — maesn.mintlify.app/integrations/weclapp
Capability map per Maesn dev docs (mintlify):
| Entity | Maesn weclapp coverage |
|---|---|
| Customers | Read, Create, Update fully supported. Webhook capable |
| Suppliers | Create, Read, Update; Delete on demand. Webhook |
| Invoices | Read, Create fully; Update/Delete on demand. Webhook |
| Sales Orders | Read fully; Create/Update/Delete "require direct engagement" |
| Credit Notes | Read fully; write on demand. Webhook |
| Payments | Read fully; Create on demand |
| Bills | "On demand only" — all operations |
| Purchase Orders | "Not supported by weclapp" |
| Journal Entries | "Not supported by weclapp" |
| Chart of Accounts / Ledger Accounts | "Not supported. Trial balance, fiscal years unavailable" |
| Cost Centers | Not explicitly listed |
| Tax Rates | On demand |
| Documents/Files | On demand |
"Weclapp webhooks support: CUSTOMER, SUPPLIER, INVOICE, CREDIT_NOTE, SALES_ORDER resources with CREATED, UPDATED, DELETED events" — maesn.mintlify.app/integrations/weclapp
Marketing-page vs dev-docs contradiction: The Maesn marketing page states it supports "invoices, bills, credit notes, customers, suppliers, contacts, payments, journal entries, purchase orders, sales orders, and more" for weclapp (maesn.com/integrations/weclapp), while the developer documentation explicitly marks bills, journal entries, purchase orders, and ledger accounts as not supported or on-demand. The dev docs should be treated as authoritative.
Misleading wording note: Maesn's "Not supported by weclapp" label for purchase orders, journal entries, and ledger accounts is inaccurate as a description of weclapp itself — these resources all exist in the weclapp v2 API (/purchaseOrder, /accountingTransaction, /ledgerAccount). The accurate reading is "not supported by Maesn's weclapp connector."
"weclapp is a community developed application... Make does not maintain or support this integration." — make.com weclapp app
Maxmel Tech variant (apps.make.com/weclapp-s3mgzy) — modules quoted from Make's app catalog:
Get a purchase invoice, Get a supplier, Get a party, Get a customer, Get a purchase order, Get a sales invoice, Get a sales order, Get a quotation, Get a ticketContact, Customer, Lead, Party, Purchase Invoice, Purchase Invoice from Purchase Order, Purchase Order, Quotation, Sales Invoice, Sales Invoice from Sales Order, Sales Order, Supplier, TicketCustomer, Lead, Party, Purchase Invoice, Purchase Order, Quotation, Sales Invoice, Sales Order, Supplier, Ticket StatusPurchase Invoices, Suppliers, Parties, ...Upload Document, Download Latest Sales Invoice PDF, Make an API RequestThe richer of the two community apps. No ledger accounts, journal entries, or cost centers modules.
#makeitfuture variant (apps.make.com/weclapp-z9gz53-5s74fk) — thinner: only customer/invoice CRUD, no purchase invoices or suppliers.
"Triggers: New/updated record (real-time), New/updated records (batch). Actions: Create record in weclapp, Get record by ID, Search object, Update object, plus custom actions." — workato.com/integrations/weclapp
Generic record-shape interface — no entity-specific (purchase invoice, supplier, ledger) pre-built operations quoted. Effectively a thin wrapper over the native API.
| Platform | Status | Source |
|---|---|---|
| Zapier | Explicit: "Weclapp has not yet built an integration on Zapier" | zapier.com/apps/weclapp/integrations |
| Chift | Not in supported connectors list (which includes Pennylane, Exact, Datev, Odoo, Xero, Sage, Twinfield, Netsuite, Dynamics 365 BC, Holded) | docs.chift.eu/connectors/connectors |
| Celigo | No native weclapp connector found in marketplace; would require Universal HTTP connector | celigo.com/integrations |
| n8n | No native node; community forum posts show users building via HTTP Request node | community.n8n.io |
| Tray.io | Not found in connector hub | tray.io/connectors |
Confidence: High (for absence findings — searched directly on each platform's connector hub)
"You can authorize against the API with an API token. The token is configurable in your weclapp account under My settings > API. […] Authenticating using a token is possible in two ways: the token can be sent using the AuthenticationToken header
AuthenticationToken: {api_token}[or] the standard HTTP Basic authentication can be used: the username needs to be"*"and the password is the token" — weclapp OpenAPI v2 spec, header description
"Dein API-Token ist benutzerspezifisch. Du findest ihn über deinen Benutzernamen > Meine Einstellungen." — doc.weclapp.com/knowledgebase/wo-finde-ich-den-weclapp-api-token
"weclapp übergibt über die API nur die Berechtigungen, die der Benutzer des API-Tokens besitzt." — doc.weclapp.com/knowledgebase/gibt-es-eine-api-zu-weclapp
"Du kannst einen API-Token neu erzeugen, wenn du den Eindruck hast, dass ein Unbefugter den Token bekommen hat." — same source
Analysis:
purchaseInvoice, party, ledgerAccount, costCenter, webhook).https://<TENANT>.weclapp.com/webapp/api/v2/ — the tenant subdomain is requiredAccept: application/jsonContent-Type: application/json (PUT/POST)Accept-Encoding: gzipUser-Agent: ... — spec requests this for client identificationapplication/json)"The weclapp API has no fixed rate limits, and we want to keep it that way. […] There is a limit on the number of parallel requests per tenant. Multiple parallel requests are allowed, even if you exceed the limit. Requests exceeding the limit are not rejected but wait until resources become available. […] The requests can currently wait in the queue for up to 30 seconds, after that the application will respond with a HTTP 429 Too Many Requests response." — OpenAPI v2 spec, header description
"We recommend using request timeouts of at least one minute to avoid aborting requests too early that would get a successful response." — same source
Operational implications:
>=60s request timeouts.filter=id in[...]); use webhooks instead of polling; cache rarely-changing data (e.g., custom attribute definitions).ERP Starter (€39/month/user, monthly-only): Contact Management, Quotations & invoices, Tasks & projects, Accounting & banking, Reporting, E-Invoicing. No API-access listed. — weclapp.com/en/pricing
ERP Services (€86 monthly / €95 annual): Starter features plus CRM, Tasks/calendar/campaigns, Offer & order, Project Management, Time tracking, "API-access" — same source
ERP Trade (€163 monthly / €179 annual): Services features plus Merchandise Management, Disposition & purchasing, Warehouse Management, Serial & batch number, Production, Store/Marketplace connections — same source
API access is gated to ERP Services tier and above (€86/user/month minimum). The Starter tier is not API-eligible. Customers without ERP Services would need to upgrade before any Orcha integration can function.
Conflicting price source flagged: A search snippet from Qualimero's 2026 pricing guide cites €64 / €84 / €159 for similar tiers. The page could not be fetched directly to verify. weclapp.com is the authoritative source — Qualimero may reflect promotional or older pricing.
"weclapp does not provide a dedicated sandbox. Developers typically use a free trial account or a partner demo instance for testing, which must be managed manually." — maesn.com weclapp API blog
30-day free trial: "Free for the first 30 days | Automatic cancellation" — weclapp.com/en/pricing
"Über das Dashboard kannst du Demodaten in deiner Testinstanz anlegen. Suche das Widget 'Dein Team in weclapp' und klicke auf den grünen Button 'Demodaten anlegen'." — doc.weclapp.com/knowledgebase/wie-kann-ich-in-der-testphase-demodaten-in-meiner-instanz-anlegen
Three substitutes for a real sandbox:
POST /system/createDemoTestSystem endpoint — exists in the OpenAPI spec but lacks any description text. It accepts {label: required, preset: required, all_users?: bool}. Likely provisions a parallel test instance from a named preset — semantics need to be verified hands-on.Confidence: Medium for sandbox alternatives — /system/createDemoTestSystem is documented as a path but its actual behavior, available presets, and pricing implications are not publicly described.
weclapp offers two distinct, complementary paths for AP invoice submission via the native API.
POST /purchaseInvoice"create a purchaseInvoice" —
POST /purchaseInvoice, accepts apurchaseInvoiceschema body — OpenAPI v2 spec, line 13252
Schema fields (from spec line 39073+):
| Field | Type | Notes |
|---|---|---|
supplierId |
string (party reference) | Required (inherited from basePurchaseRecord) |
invoiceDate |
timestamp | Required |
invoiceNumber |
string (≤255) | The supplier's invoice number |
internalInvoiceNumber |
string (≤255) | Required — weclapp's internal numbering |
dueDate |
timestamp | |
bookingDate |
timestamp | |
pricingDate |
timestamp | Required |
purchaseInvoiceType |
enum | Required — STANDARD_INVOICE, CREDIT_NOTE, ADVANCE_PAYMENT_INVOICE, PART_PAYMENT_INVOICE, PREPAYMENT_INVOICE, FINAL_INVOICE, CREDIT_ADVICE |
status |
enum (purchaseInvoiceStatusType) | Required — values: NEW, OCR_VERIFICATION, INVOICE_RECEIVED, INVOICE_VERIFICATION, INVOICE_CHECKED, ENTRY_COMPLETED, OPEN_ITEM_CREATED, DOCUMENT_CREATED, CANCELLED |
paymentStatus |
enum | Required — OPEN, PAID, CLEARED_WITH_CREDIT_NOTE, CREDIT_NOTE_CLEARED, NO_OPEN_ITEM, UNKNOWN |
costCenterId |
string | Header-level cost center |
costTypeId |
string | Header-level cost type |
purchaseInvoiceItems |
array | Line items (see below) |
purchaseOrders |
array of {id} | Optional link to existing purchase orders |
senderCountryCode, recipientCountryCode |
enum | Required |
vatRegistrationNumber |
string (≤1000) | |
recordCurrency |
reference | inherited; supports multi-currency with conversion rate |
createdViaOcr |
boolean (read-only) | Useful flag to distinguish OCR-created vs API-created invoices |
Line item schema (purchaseInvoiceItem, spec line 39278):
| Field | Type | Notes |
|---|---|---|
accountId |
string | Reference to /ledgerAccount |
costCenterId / costTypeId |
string | Per-line cost allocation |
costCenterItems |
array | Distribution percentage across multiple cost centers |
taxId |
string | Reference to /tax |
unitPrice, netAmount, grossAmount, unitId |
decimal/string | Inherited from baseRecordItemWithMoney |
purchaseInvoiceItemRelationships |
array | Links to incomingGoodsItemId / purchaseOrderItemId with quantity |
servicePeriodFromDate, servicePeriodToDate |
timestamp | For service invoices |
deliveryDate |
timestamp |
"This endpoint can be used to quickly turn invoice documents received from suppliers into weclapp purchase invoices. Supported file types are XML, PDF (with or without embedded XML) and images (PNG, JPEG, GIF, TIFF). The documents are uploaded via HTTP multipart request (multiple documents can be uploaded at the same time) and processing is started as a background job. For each document, the appropriate processing strategy is selected based on the file type:
- Image files and PDF files without embedded XML are processed using Optical Character Recognition (OCR). Note: This will only work if your weclapp admin has previously given consent to the use of our OCR provider Klippa App B.V. This can only be done in the weclapp UI.
- XML files and PDF files with embedded XML will be processed using e-invoice detection. If processing is successful, a purchase invoice with status
INVOICE_RECEIVEDwill be created, otherwise a validation error will be shown in the background job log." — OpenAPI v2 spec, line 13708
Endpoint: POST /purchaseInvoice/startInvoiceDocumentProcessing/multipartUpload
Request: multipart/form-data with one or more filename parts
Response: {result: <jobResult>} — async job; status retrieved via /job/status or webhooks
Practical implications:
INVOICE_RECEIVED status — a downstream user/process must verify and progress it through the workflow.Path A (structured POST): Orcha controls every field. Supplier can be matched/created via /party, accounts/cost centers assigned per-line, exact tax IDs applied. The invoice can be created in any status from NEW upward. Document file (PDF) can be attached afterward via POST /document/upload?entityName=PurchaseInvoice&entityId={id}.
Path B (multipart upload): weclapp's own OCR/e-invoice pipeline does the parsing. Less control — the resulting invoice's field accuracy depends on the OCR provider. May overwrite or ignore structured data Orcha already extracted. Useful as a fallback or for raw e-invoice files.
For Orcha's likely use case (we already extract structured data), Path A + post-hoc document attachment is the more deterministic option.
Several other endpoints can create purchase invoices from upstream documents:
POST /purchaseOrder/id/{id}/createPurchaseInvoice — derives an invoice from an existing PO (accepts invoiceDate, invoiceNumber, invoiceType, isGross, paymentAmount; optional customAttributes)POST /incomingGoods/id/{id}/createPurchaseInvoice — derives an invoice from a goods receipt (no body params)These are useful for closed-loop scenarios where the PO/goods receipt already exists and Orcha should reconcile against them.
POST /document/upload?entityName={...}&entityId={...}&name={...}&documentType={enum} — attach a file (PDF/PNG/JPEG/etc.) to any entity. documentType enum includes PURCHASE_INVOICE, PURCHASE_INVOICE_ZUGFERD, PURCHASE_INVOICE_FATTURAPA.GET /purchaseInvoice/id/{id}/downloadLatestPurchaseInvoiceDocument — retrieve the latest PDF/image attached to a purchase invoiceGET /document/id/{id}/download — download any document by IDPOST /document/id/{id}/upload — upload a new version of an existing documentcurrencyId and currencyConversionRate fields on the baseRecordWithMoney ancestor schema. /currency/companyCurrency returns the tenant's home currency.Document type enum confirms native handling of:
PURCHASE_INVOICE_ZUGFERD — German hybrid PDF/XMLPURCHASE_INVOICE_FATTURAPA — Italian e-invoicingSALES_INVOICE_XR — XRechnung (sales side)SALES_INVOICE_UBL — Universal Business Language (sales side)ZUGFERD_VALIDATION — validation document typeConfidence: High for all of section 4 — derived directly from OpenAPI spec.
/party)Party schema fields relevant to suppliers (spec line 36911+):
supplier: boolean(required) — flags a party as a suppliersupplierActive: boolean— supplier active flagsupplierNumber: stringsupplierCreditorAccountId→ reference to/ledgerAccountsupplierCreditorAccountingCodeId→ reference to/personalAccountingCodesupplierTermOfPaymentId→ reference to/termOfPaymentsupplierPaymentMethodId→ reference to/paymentMethodsupplierShipmentMethodId,supplierDefaultShippingCarrierIdsupplierMinimumPurchaseOrderAmountsupplierNonStandardTaxId→ reference to/taxsupplierMergeItemsForOcrInvoiceUpload: boolean— controls how OCR-uploaded invoices group line items per suppliersupplierOrderBlock: booleansupplierInternalNote: string— OpenAPI v2 spec line 36553+
Operations (/party):
GET /party — list with rich filtering (e.g., ?supplier-eq=true)GET /party/countGET /party/id/{id}POST /party — createPUT /party/id/{id} — update (supports ?ignoreMissingProperties=true for partial updates)DELETE /party/id/{id}A party can be both customer and supplier simultaneously — both flags can be true.
Confidence: High
/ledgerAccount)Full CRUD: GET, POST, PUT, DELETE.
Schema (spec line 35615):
accountNumber: string (required) — e.g., "70000"automatic: boolean (required) — system-managedbalanceSheetItem → enum referenceparentAccountId → self-reference for hierarchytype: enum (required) — CARRY_FORWARD_ACCOUNT, IMPERSONAL_ACCOUNT, PERSONAL_ACCOUNTdescription: stringConfidence: High (spec-confirmed)
/costCenter, /costCenterGroup)Full CRUD on both.
costCenter schema (spec line 32409):
costCenterNumber: string (required, ≤30)costCenterType → productionCostCenterType enum (required)costCenterGroupId → referencedescription: stringcostCenterWithDistributionPercentage is used on invoice line items to split costs across multiple cost centers with percentages.
/costType)Full CRUD. Schema is simple: just name: string (required, ≤256).
/tax)Schema fields (spec line 43425):
name: string(required)taxValue: decimal(required) — e.g., "19.00"taxType: enum(required)taxKey(read-only) — system-determinedaccountId,contraAccountId,defaultDiscountAccountId,defaultNominalAccountId,depositAccountId→ ledger account references
Lookup helpers:
GET /tax/findPurchaseTax?recipientCountryCode=DE&dispatchCountryCode=...&taxRateType=...&partyType=...&date=... — returns the appropriate tax for an AP invoice context. Highly useful for tax determination during invoice posting.GET /tax/findSalesTax?dispatchCountryCode=DE&... — sales-side equivalentCRUD also supported plus admin actions POST /tax/configurePurchaseTaxes (per country), /tax/configureSalesTaxes, /tax/resetSystemTaxes.
Confidence: High
| Resource | Operations | Notes |
|---|---|---|
/financialYear |
Full CRUD; POST /id/{id}/generatePeriods |
Status enum: CLOSED, CURRENT, PLANNED, PRELIMINARY_CLOSED |
/termOfPayment |
Full CRUD | |
/paymentMethod |
Full CRUD | |
/currency |
Full CRUD; GET /currency/companyCurrency |
|
/personalAccountingCode |
Full CRUD | German "Personenkonto" classification |
/articleAccountingCode |
Full CRUD | Per-article account mapping |
/article |
Full CRUD plus many actions (datasheet PDFs, labels, image upload, etc.) | |
/bankAccount |
Full CRUD | |
/bankTransaction |
GET, DELETE only | No POST — bank statements imported externally |
/sepaDirectDebitMandate |
Full CRUD | |
/customAttributeDefinition |
Full CRUD | Custom fields per resource type |
Filter operators (spec line 432):
eq,ne,lt,gt,le,ge,null,notnull,like,notlike,ilike,notilike,in,notin"or" condition: prefix property name with
or-. Group withor<groupname>-."Filter Expressions (beta): […] Multiple 'filter' parameters may be used if needed. Property references in filter expressions have exactly the same form and semantics as for the individual filter parameters." — OpenAPI v2 spec lines 357-500+
Filter examples from spec:
GET /party?customerSalesChannel-eq=NET1GET /party?createdDate-gt=1398436281262GET /party?customerNumber-in=["1006","1007"]GET /party?customAttribute4587.entityReferences.entityId-eq=1234GET /party?or-name-eq=charlie&or-name-eq=chaplin--data-urlencode 'filter=(lower(contacts.firstName + " " + contacts.lastName) = "Ertan Özdil") and (lastModifiedDate >= "2022-01-01T00:00:00Z")'Pagination: ?page=N&pageSize=M (or ?offset=...). Sort: ?sort=.... Sparse fieldsets: ?properties=.... Eager-load references: ?includeReferencedEntities=....
/accountingTransactionEndpoints:
GET /accountingTransaction (list, with full filtering)GET /accountingTransaction/countGET /accountingTransaction/id/{id}POST /accountingTransaction/batchBooking (write — see below)No PUT, DELETE, or direct POST on the resource itself. This means existing transactions cannot be modified or deleted via the API.
Schema (spec line 28674):
| Field | Notes |
|---|---|
transactionDate (required) |
When the transaction occurred |
transactionEstablishDate |
When recorded in the system |
currencyId (required) |
|
conversionRate, conversionRateDate |
For multi-currency |
transactionNumber, internalRecordNumber, externalRecordNumber |
Identifiers |
type |
bookingType enum: CARRY_FORWARD, INCOMING_INVOICE, OUTGOING_INVOICE, INCOMING_CREDIT_NOTE, OUTGOING_CREDIT_NOTE, INCOMING_PAYMENT, OUTGOING_PAYMENT, INCOMING_MANUAL_ENTRY, OUTGOING_MANUAL_ENTRY, IMPERSONAL, CREDIT_ADVICE |
status |
accountingTransactionStatus: DRAFT, ESTABLISHED, PREBATCHBOOKING |
transactionDetails |
Array of accountingTransactionDetail: {accountId (ledgerAccount, required), debitCredit (DEBIT/CREDIT, required), amount (required), taxId, costCenterId, description} |
reverseTransaction (required, bool) |
|
draft (bool) |
This means Orcha can fetch full historical journal data, including counter-account, debit/credit indicator, tax breakdown, and cost center per line. Use bookingType-in=["INCOMING_INVOICE", "INCOMING_CREDIT_NOTE", "INCOMING_PAYMENT"] to scope to AP-relevant entries.
/accountingTransaction/batchBooking"Creates an accounting transaction of type 'impersonal'" — OpenAPI v2 spec line 1892
Body schema:
{
"batchBooking": {
"batchBookingRecords": [
{
"amount": "...",
"debitAccountId": "...", // ledgerAccount
"creditAccountId": "...", // ledgerAccount
"description": "...",
"taxId": "..." // tax
},
...
],
"bookingText": "...",
"costCenterId": "...",
"currencyId": "...",
"externalRecordNumber": "...",
"transactionDate": <timestamp>
}
}
Constraints:
IMPERSONAL type transactions (general ledger postings, not invoice-linked)./purchaseInvoice endpoint instead — weclapp generates the underlying journal entry automatically when the purchase invoice progresses through its workflow./purchaseOpenItemOperations:
GET /purchaseOpenItem (list)GET /purchaseOpenItem/countGET /purchaseOpenItem/id/{id}POST /purchaseOpenItem/id/{id}/createPaymentApplication (apply a bank/cash transaction to clear the open item)POST /purchaseOpenItem/id/{id}/updatePaymentStateSchema (spec line 36078, via openItem ancestor):
amount, amountOpen, amountPaid, amountDiscount (decimals, all required)cleared: bool, clearanceDateopenItemNumber (required)openItemType enum: CREDITOR, DEBTOR, CREDIT_NOTE_CREDITOR, CREDIT_NOTE_DEBITOR, etc.paymentApplications (array, links to bank/cash transactions)purchaseInvoiceId (read-only) — links back to the source invoiceThis is the canonical view of unpaid AP — what's still owed to suppliers, what's been partially paid, what discounts apply.
/bankTransactionGET and DELETE only. No POST. Bank transactions are imported via separate channels (e.g., HBCI, file import) rather than via API write. This means Orcha cannot push bank statements via API; it can only read existing ones to match against open items via createPaymentApplication.
Confidence: High (all spec-confirmed)
"If a webhook is unreachable, the attempt is retried after 1, 5, 30 minutes, 5 hours and 1 day. After one day if the webhook remains unreachable, the webhook is deactivated. […] In the list of webhooks this is logged with an error message." — doc.weclapp.com webhook KB
Payload format:
{ "entityId": "{ID}", "entityName": "{Name}", "type": "{VALUE}" }with type values:
CREATE,UPDATE,DELETE— same source
Webhook setup:
POST /webhook with body {entityName, atCreate, atUpdate, atDelete, url, requestMethod, deactivatedDate?, errorMessage?}. Spec-confirmed schema (line 46463).Webhook entity coverage: The webhook resource accepts an arbitrary entityName (string) — not restricted to a fixed set. Per Maesn's documentation, common entities supported include CUSTOMER, SUPPLIER, INVOICE, CREDIT_NOTE, SALES_ORDER. Whether the full list of ~150 resources is webhook-eligible is not explicitly documented. Hands-on testing would be needed to confirm, e.g., webhook on purchaseInvoice updates.
Critical webhook design considerations:
{entityId, entityName, type}. Consumer must call GET /<entity>/id/{id} to retrieve the actual entity content. This adds a round trip per event.secret field. Requests appear to be plain HTTP POSTs. This is a significant gap for production use — Orcha would need to either: (a) verify by source IP allowlist (if weclapp publishes IP ranges); (b) include a secret token in the URL path/query; (c) call back into weclapp to re-fetch and verify; (d) ask weclapp support for the authoritative answer.lastModifiedDate filters.Standard REST behavior:
POST /purchaseInvoice returns 201 with the created entity (including assigned id and version)PUT /purchaseInvoice/id/{id} returns 200 with the updated entity (supports optimistic locking via version field)DELETE returns 204 No Content on successapplication/json) with validationErrors arraySpec quote on validation responses: "Two custom fields have been added to the response structure: 'location' and 'validationErrors'."
For long-running operations (e.g., the multipart invoice upload, mass operations):
GET /job/status?jobId=... — poll for completionPOST /job/abort — cancel a running jobThe OCR/e-invoice document upload returns a jobResult body — clients can either poll /job/status or wait for a webhook on the resulting purchaseInvoice creation.
Useful for tracking the lifecycle of a submitted invoice:
| Status | Meaning (inferred from name) |
|---|---|
NEW |
Just created, not yet submitted |
OCR_VERIFICATION |
OCR result needs human review |
INVOICE_RECEIVED |
Document received and parsed |
INVOICE_VERIFICATION |
In approval workflow |
INVOICE_CHECKED |
Approved |
ENTRY_COMPLETED |
Posted to ledger |
OPEN_ITEM_CREATED |
Open item generated |
DOCUMENT_CREATED |
Final document created |
CANCELLED |
Cancelled |
Confidence: High for documented status names; Medium for the exact transition rules (not fully spec-documented).
| Question | Why It Matters | What Was Tried | Next Step |
|---|---|---|---|
| Is there an HMAC signature or shared secret on webhook deliveries? | Without verification, any actor knowing the URL can spoof events. Production-grade integration needs this. | Read OpenAPI spec (no secret field on webhook schema), KB article, web search for "weclapp webhook HMAC signature" — no public docs. |
Email weclapp support (support@weclapp.com per spec contact) or open ticket asking specifically about webhook authentication mechanisms. Until answered, document a workaround (e.g., per-tenant secret embedded in callback URL path). |
| Which entity types are webhook-eligible? | Maesn lists 5 (CUSTOMER, SUPPLIER, INVOICE, CREDIT_NOTE, SALES_ORDER); the OpenAPI accepts arbitrary entityName strings. We don't know if e.g. purchaseInvoice, accountingTransaction, purchaseOpenItem events fire. |
Spec accepts free-form entityName; KB doesn't enumerate. |
Hands-on: in a trial tenant, register webhooks on purchaseInvoice, accountingTransaction, purchaseOpenItem and trigger CRUD; observe whether deliveries arrive. |
What are the available preset values for /system/createDemoTestSystem? |
Determines whether the endpoint is useful as a programmatic sandbox provisioner. | OpenAPI spec has no description text on this endpoint. | Hands-on: try common values (e.g., "DEMO", "EMPTY", "DEFAULT") and observe responses. Or contact weclapp support. |
| Is there a programmatic way to grant Klippa OCR consent for the multipart upload endpoint? | Currently the spec says "This can only be done in the weclapp UI" — meaning each Orcha customer must manually toggle a setting before Path B works. | Spec is explicit (line 13721) — no API call provided. | Confirm with weclapp support whether a future API exists, or document the manual onboarding step in customer setup instructions. |
| Are there fixed numeric rate limits anywhere (e.g., per-second hard cap)? | Spec says "no fixed rate limits" but mentions a parallel-request limit per tenant. The actual numeric ceiling is not published. | Spec quote (line 195+) only describes the dynamic throttle. | Hands-on stress test against trial; or contact weclapp support for guidance per tenant size. |
| Does Maesn's "Bills" endpoint actually work for weclapp purchase invoices, or is it only for sales-side bills? | Determines whether Maesn is a viable shortcut for Orcha's AP flow. | Maesn dev docs say "Bills: on demand only" — ambiguous. Marketing page lists bills as supported for weclapp. | Contact Maesn ("on demand" implies they will scope the integration if asked). Or skip Maesn for AP and use native API directly. |
| Token expiration / forced rotation policy | Affects credential lifecycle management in Orcha. | Searched KB, OpenAPI spec — no expiration documented. Tokens appear to persist until manually regenerated. | Confirm with weclapp support; treat tokens as long-lived but renewable. |
| Webhook behavior on entity cascade deletes | If a supplier is deleted, do invoice DELETE webhooks fire? | Not documented. | Hands-on test in trial tenant. |
A 30-day trial tenant + a freshly created API user provides the test environment. Key scenarios to verify, in order of priority:
POST /party to create a test supplier with supplier=true, customer=false, full address, supplierCreditorAccountId (link to an existing ledger account)GET /ledgerAccount?type-eq=IMPERSONAL_ACCOUNT&pageSize=10 to find expense accountsGET /tax/findPurchaseTax?recipientCountryCode=DE&dispatchCountryCode=DE&date=<now> to determine the right taxPOST /purchaseInvoice with: supplier from step 1, invoiceDate, internalInvoiceNumber, status=NEW, purchaseInvoiceType=STANDARD_INVOICE, paymentStatus=OPEN, grossPrices=false, items: [{accountId: from step 2, taxId: from step 3, unitPrice: "100.00", quantity: "1", title: "Test"}]id and versionPOST /document/upload?entityName=PurchaseInvoice&entityId={id}&name=test.pdf&documentType=PURCHASE_INVOICE with a sample PDF bodyGET /purchaseInvoice/id/{id}/downloadLatestPurchaseInvoiceDocument to verify retrievalGET /accountingTransaction?bookingType-eq=INCOMING_INVOICE&pageSize=5 to see if the journal entry was generatedPOST /purchaseInvoice/startInvoiceDocumentProcessing/multipartUpload with a sample PDF invoicejobResult ID, poll GET /job/status?jobId=... until completionGET /purchaseInvoice?status-eq=INVOICE_RECEIVED&createdViaOcr-eq=true&pageSize=5 to find the resultPOST /webhook with {entityName: "purchaseInvoice", atCreate: true, atUpdate: true, atDelete: false, url: "<your test endpoint>", requestMethod: "POST"}{entityId, entityName, type}X-Weclapp-Signature, Authorization, etc.) not documented elsewhereentityName: "accountingTransaction" and entityName: "purchaseOpenItem" to confirm webhook eligibility for these resourcesfilter=(invoiceDate >= "2026-01-01") and (supplier.supplierNumber-in["S001","S002"]) to confirm beta filter expressions work?or-status-eq=NEW&or-status-eq=INVOICE_RECEIVED&pageSize=20&page=1 for OR filtering with pagination?sort=-invoiceDate&pageSize=10GET /purchaseInvoice/count requestshttps://www.weclapp.com/api2/) — JavaScript-rendered RapiDoc; returns an empty shell. Workaround: fetch the underlying spec at https://www.weclapp.com/api/openapi_v2.yaml directly.oauth2 security scheme — none. weclapp is API-token-only. No third-party app delegated auth pattern./purchaseInvoice is fully writable from the start. There is no equivalent of "voucher creation restricted to sales types".POST /purchaseInvoice is fully supported with no type restriction beyond the purchaseInvoiceType enum (which includes STANDARD_INVOICE, CREDIT_NOTE, ADVANCE_PAYMENT_INVOICE, etc., all writable)./purchaseOrder, /accountingTransaction, /ledgerAccount). The accurate reading is "not supported by Maesn's connector for weclapp."preset values for /system/createDemoTestSystem — the OpenAPI spec lists no description and no enum constraints. Listed as unresolved.