# case.closed Source: https://docs.prets.io/api-reference/caseclosed https://api.prets.io/v1/openapi.json webhook case.closed Case state crossed into closed. Prets sends this as an HTTPS POST to the endpoint registered via `POST /v1/events/destinations`. Each delivery carries `Authorization: Bearer {bearerSecret}` and uses `eventId` as the idempotency key. Return any 2xx within 30s to acknowledge; non-2xx responses are retried with backoff for up to 24h. # case.created Source: https://docs.prets.io/api-reference/casecreated https://api.prets.io/v1/openapi.json webhook case.created A Case became fetchable. Appearance fact: a re-shown Case repeats this type for the same caseId. Prets sends this as an HTTPS POST to the endpoint registered via `POST /v1/events/destinations`. Each delivery carries `Authorization: Bearer {bearerSecret}` and uses `eventId` as the idempotency key. Return any 2xx within 30s to acknowledge; non-2xx responses are retried with backoff for up to 24h. # case.message.replied Source: https://docs.prets.io/api-reference/casemessagereplied https://api.prets.io/v1/openapi.json webhook case.message.replied A Case message was added, except the opening request which case.created already covers. Prets sends this as an HTTPS POST to the endpoint registered via `POST /v1/events/destinations`. Each delivery carries `Authorization: Bearer {bearerSecret}` and uses `eventId` as the idempotency key. Return any 2xx within 30s to acknowledge; non-2xx responses are retried with backoff for up to 24h. # case.updated Source: https://docs.prets.io/api-reference/caseupdated https://api.prets.io/v1/openapi.json webhook case.updated A fetchable Case changed in a way GET /v1/cases/{caseId} would show, including reopen. Prets sends this as an HTTPS POST to the endpoint registered via `POST /v1/events/destinations`. Each delivery carries `Authorization: Bearer {bearerSecret}` and uses `eventId` as the idempotency key. Return any 2xx within 30s to acknowledge; non-2xx responses are retried with backoff for up to 24h. # Close a case from the merchant review stage Source: https://docs.prets.io/api-reference/close-a-case-from-the-merchant-review-stage https://api.prets.io/v1/openapi.json post /v1/cases/{caseId}/close # Create a case for a quote Source: https://docs.prets.io/api-reference/create-a-case-for-a-quote https://api.prets.io/v1/openapi.json post /v1/quotes/{quoteId}/cases # Create a quote Source: https://docs.prets.io/api-reference/create-a-quote https://api.prets.io/v1/openapi.json post /v1/quotes # Create a session URL for an existing quote Source: https://docs.prets.io/api-reference/create-a-session-url-for-an-existing-quote https://api.prets.io/v1/openapi.json post /v1/quotes/{quoteId}/sessions # Create an event destination Source: https://docs.prets.io/api-reference/create-an-event-destination https://api.prets.io/v1/openapi.json post /v1/events/destinations # Delete an event destination Source: https://docs.prets.io/api-reference/delete-an-event-destination https://api.prets.io/v1/openapi.json delete /v1/events/destinations/{destinationId} # Get a case Source: https://docs.prets.io/api-reference/get-a-case https://api.prets.io/v1/openapi.json get /v1/cases/{caseId} # Get a quote Source: https://docs.prets.io/api-reference/get-a-quote https://api.prets.io/v1/openapi.json get /v1/quotes/{quoteId} # Get an event destination Source: https://docs.prets.io/api-reference/get-an-event-destination https://api.prets.io/v1/openapi.json get /v1/events/destinations/{destinationId} # List case messages Source: https://docs.prets.io/api-reference/list-case-messages https://api.prets.io/v1/openapi.json get /v1/cases/{caseId}/messages # List cases Source: https://docs.prets.io/api-reference/list-cases https://api.prets.io/v1/openapi.json get /v1/cases # List quotes Source: https://docs.prets.io/api-reference/list-quotes https://api.prets.io/v1/openapi.json get /v1/quotes # List the organization’s event destinations Source: https://docs.prets.io/api-reference/list-the-organization’s-event-destinations https://api.prets.io/v1/openapi.json get /v1/events/destinations # Monthly payment preview Source: https://docs.prets.io/api-reference/monthly-payment-preview https://api.prets.io/v1/openapi.json post /v1/quotes/cost/preview # Post a merchant message on a case Source: https://docs.prets.io/api-reference/post-a-merchant-message-on-a-case https://api.prets.io/v1/openapi.json post /v1/cases/{caseId}/messages # quote.created Source: https://docs.prets.io/api-reference/quotecreated https://api.prets.io/v1/openapi.json webhook quote.created A new Quote was created. The quote may not yet have a financing decision. Prets sends this as an HTTPS POST to the endpoint registered via `POST /v1/events/destinations`. Each delivery carries `Authorization: Bearer {bearerSecret}` and uses `eventId` as the idempotency key. Return any 2xx within 30s to acknowledge; non-2xx responses are retried with backoff for up to 24h. # quote.financing.canceled Source: https://docs.prets.io/api-reference/quotefinancingcanceled https://api.prets.io/v1/openapi.json webhook quote.financing.canceled The customer canceled financing for the Quote, or declined the offer. Prets sends this as an HTTPS POST to the endpoint registered via `POST /v1/events/destinations`. Each delivery carries `Authorization: Bearer {bearerSecret}` and uses `eventId` as the idempotency key. Return any 2xx within 30s to acknowledge; non-2xx responses are retried with backoff for up to 24h. # quote.financing.completed Source: https://docs.prets.io/api-reference/quotefinancingcompleted https://api.prets.io/v1/openapi.json webhook quote.financing.completed Financing has been completed and disbursed for the Quote. Prets sends this as an HTTPS POST to the endpoint registered via `POST /v1/events/destinations`. Each delivery carries `Authorization: Bearer {bearerSecret}` and uses `eventId` as the idempotency key. Return any 2xx within 30s to acknowledge; non-2xx responses are retried with backoff for up to 24h. # quote.financing.offer_received Source: https://docs.prets.io/api-reference/quotefinancingoffer_received https://api.prets.io/v1/openapi.json webhook quote.financing.offer_received A lender returned a financing offer for the Quote. Prets sends this as an HTTPS POST to the endpoint registered via `POST /v1/events/destinations`. Each delivery carries `Authorization: Bearer {bearerSecret}` and uses `eventId` as the idempotency key. Return any 2xx within 30s to acknowledge; non-2xx responses are retried with backoff for up to 24h. # quote.financing.rejected Source: https://docs.prets.io/api-reference/quotefinancingrejected https://api.prets.io/v1/openapi.json webhook quote.financing.rejected The lender rejected financing for the Quote. Prets sends this as an HTTPS POST to the endpoint registered via `POST /v1/events/destinations`. Each delivery carries `Authorization: Bearer {bearerSecret}` and uses `eventId` as the idempotency key. Return any 2xx within 30s to acknowledge; non-2xx responses are retried with backoff for up to 24h. # quote.financing.updated Source: https://docs.prets.io/api-reference/quotefinancingupdated https://api.prets.io/v1/openapi.json webhook quote.financing.updated The Quote financing status or sub-status changed without reaching a more specific lifecycle event. Prets sends this as an HTTPS POST to the endpoint registered via `POST /v1/events/destinations`. Each delivery carries `Authorization: Bearer {bearerSecret}` and uses `eventId` as the idempotency key. Return any 2xx within 30s to acknowledge; non-2xx responses are retried with backoff for up to 24h. # quote.superseded Source: https://docs.prets.io/api-reference/quotesuperseded https://api.prets.io/v1/openapi.json webhook quote.superseded A Quote was replaced by a newer revision; the previous quote is no longer billable. Prets sends this as an HTTPS POST to the endpoint registered via `POST /v1/events/destinations`. Each delivery carries `Authorization: Bearer {bearerSecret}` and uses `eventId` as the idempotency key. Return any 2xx within 30s to acknowledge; non-2xx responses are retried with backoff for up to 24h. # quote.updated Source: https://docs.prets.io/api-reference/quoteupdated https://api.prets.io/v1/openapi.json webhook quote.updated A Quote field changed in a way that does not match a more specific lifecycle event. Prets sends this as an HTTPS POST to the endpoint registered via `POST /v1/events/destinations`. Each delivery carries `Authorization: Bearer {bearerSecret}` and uses `eventId` as the idempotency key. Return any 2xx within 30s to acknowledge; non-2xx responses are retried with backoff for up to 24h. # Rotate an event destination bearer secret Source: https://docs.prets.io/api-reference/rotate-an-event-destination-bearer-secret https://api.prets.io/v1/openapi.json post /v1/events/destinations/{destinationId}/bearer-secret # Update an event destination Source: https://docs.prets.io/api-reference/update-an-event-destination https://api.prets.io/v1/openapi.json patch /v1/events/destinations/{destinationId} # Upload a quote attachment Source: https://docs.prets.io/api-reference/upload-a-quote-attachment https://api.prets.io/v1/openapi.json post /v1/quotes/{quoteId}/attachments # API Changelog Source: https://docs.prets.io/api/changelog Changes to the public Prets API, updated weekly. **🧾 Quotes** * `POST /v1/quotes` and `GET /v1/quotes/{quoteId}`: Dutch `address` objects accept optional `municipality` (gemeente), distinct from city. **(Additive)** **🧾 Quotes** * `POST /v1/quotes` and `GET /v1/quotes/{quoteId}`: added optional `intakeNote` β€” merchant context for Prets at quote handover. **(Additive)** **πŸ”— Correlation claims** * `POST /v1/correlation-claims/resolve`: a matched response now includes a `correlationClaim` object with `id` (the canonical Prets correlation claim identifier) and `uuid` (its lowercase UUID encoding). **(Additive)** * `POST /v1/correlation-claims/resolve`: the top-level `correlationClaimId` field on a matched response is now deprecated in favor of `correlationClaim.id`. It is still returned for now. **(Deprecation)** **πŸ”— Correlation claims** * Added `POST /v1/correlation-claims/resolve`. It matches a consumer by `email` and/or install address (`postalCode` plus `houseNumber`) and returns `{ data: { matched: true, correlationClaimId } }` when a match is found, or `{ data: { matched: false } }` when none is. The `correlationClaimId` is a stable identifier for use in partner intake integrations. Returns `401` when unauthenticated and `403` when the calling organization is not permitted to resolve correlation claims. **(Additive)** **🧾 Quotes** * `POST /v1/quotes` and `GET /v1/quotes/{quoteId}`: added a new `subsidy` line item type. It carries a negative `totalInclTax` (a reduction applied to the quote total) and a required `incentiveCodes` array, whose codes must match incentive codes declared on the work line items. **(Additive)** * `POST /v1/quotes` and `GET /v1/quotes/{quoteId}`: added `links.portalQuote`, a deeplink to the quote in the merchant portal. Present only for organization API keys. **(Additive)** * `POST /v1/quotes`: Dutch postal codes with a lowercase letter suffix (for example `8101xp`) are now accepted and normalized to the `1234 AB` format. Requests that previously failed validation now succeed. **(Additive)** **🧾 Quotes** * `GET /v1/quotes/{quoteId}` and `POST /v1/quotes`: the `financing` object is now always present and richer. Added `phase`, `method` (array of `loan` / `own_funds` / `subsidy`), and `waitingOn`. **(Breaking)** * `financing.subStatus` is now required and uses a `type` discriminator with `none`, `on_hold`, and `canceled` arms (the previous `extra_info_needed` arm was removed). **(Breaking)** * `financing.status` values changed: `financing_completed` β†’ `completed`, and `cancelled_by_customer` was split into `canceled_by_consumer` and `offer_canceled`. Added `additional_documents_required` and `invoice_pending`. **(Breaking)** * New `on_hold` reasons: `installation_blocked`, `general_question`, and `unknown`. **(Additive)** *** **πŸ”” Events** * The `quote.financing.cancelled` webhook event was renamed to `quote.financing.canceled`. **(Breaking)** *** **⚠️ Errors** * All endpoints now return a standardized error envelope: `{ error: { type, code, message, param?, requestId } }`. The `message` field is unchanged; `type`, `code`, `param`, and `requestId` are new. **(Additive)** **🧾 Quotes** * `POST /v1/quotes`: `lineItems[].incentiveCodes` and `terms` no longer accept values containing a semicolon (`;`). Requests that include a semicolon in these fields now fail validation. **(Breaking)** # Changelog Source: https://docs.prets.io/changelog What's new in the Prets platform, updated weekly. **πŸ’Ά Financing** * Loan options now show lender ratings and highlights next to each offer. * After you pick a loan, you skip the details step when your contact information is already complete. * The loan snapshot now includes longer 15-year Warmtefonds options. *** **⚑ Reliability** * Opening a financing option no longer gets stuck showing it as unavailable while totals are still loading. * Headers and help links load more smoothly as you move through the financing flow. *** **πŸ‘₯ Accounts** * New team members linked to your merchant organization now get portal access more reliably. **πŸ’Ά Financing** * You can now see exactly how your quote becomes a loan amount, with clear choices at each step. * Choose whether to finance the full quote or only the amount left after subsidies. * Add a down payment or a buffer for unexpected installation costs, and watch the loan amount update. * The financing steps are easier to use on a phone. *** **🧾 Quotes** * Notes for Prets when creating a quote are simpler: one field, saved with the quote and shown on the overview. *** **πŸ›Ÿ Support** * Your dashboard now shows open support cases that need your action, with a direct link to review them. *** **⚑ Reliability** * Filtering completed applications now includes all finished financing statuses. * Quotes no longer disappear from your list when an address has an unusual postal code. **πŸ’Ά Financing progress** * When a quote is canceled or declined, the progress journey now only marks the stages that were actually reached. * After an offer is canceled, the journey correctly shows that an offer had already been received. *** **πŸ“Ž Documents** * Uploading quote documents now shows clear progress while the file is being added. * Fixed an issue where a newly uploaded document could briefly disappear from the list. * Attaching files while creating a quote is more reliable. *** **πŸ“± Checkout** * An invalid phone number during financing checkout now shows a clear field error instead of a generic failure. **πŸ“€ Applications export** * You can now download your applications as a spreadsheet directly from the applications page, matching your current search filters and sort order. * The file opens cleanly in Excel and includes each application's key details. *** **πŸ–₯️ Screen-sharing support** * Screen-sharing support sessions now open with a refreshed, cleaner start screen. * Invitation links now take you straight into the session and connect more reliably. *** **πŸ›Ÿ Support requests** * When you raise a support request, you can now choose from clearer categories, including general questions, document requests, and compliance. *** **⚑ Reliability** * Financing status updates now reflect your most recent quote. **πŸ›Ÿ Merchant Support** * Support cases are now available to every merchant, giving you one place to raise and follow up on requests with Prets instead of scattered chats and emails. * Your dashboard now highlights what needs your attention, with cases awaiting your response, quotes on hold, and new customers each opening a ready-filtered list. * Case filters now stay put as you move around the portal, and each case shows its full subject and details. *** **πŸ”§ Installation** * When a deal is won, an installation task is now created for you automatically, so you get a clear signal that it's time to plan the install. *** **πŸ’Ά Financing** * After submitting a financing request, you now see a clear confirmation and a link to your application instead of a greyed-out button. *** **⚑ Reliability** * Signing in and loading the portal is faster and steadier. * Fixed a rare issue that could clear your first name when your profile synced. **🧾 Quotes** * Screen-sharing support sessions now appear in your quote activity timeline, so you can see when one took place. *** **πŸ’Ά Financing** * Fixed an issue where the financing options could stop updating when filtering by lender. *** **⚑ Reliability & Fixes** * Creating a quote is more resilient: retried or duplicate submissions no longer cause errors. * Quotes with lowercase Dutch postal codes (for example "8101xp") are now accepted instead of being rejected. * Cleaned up duplicate page headings in the portal for a tidier layout. **🧾 Quotes** * Your quote list now remembers your filters and sorting as you move around the portal. * The quote activity timeline now shows stage changes and more detail, so progress is easier to follow. * Closely-timed updates are combined into the furthest-along status, so the timeline stays clean. *** **πŸ’Ά Financing** * Financing progress now follows a clearer, more detailed journey, with stages like documents needed, under review, and awaiting invoice. * When financing is paused, you can now see why it's on hold and who needs to act next. *** **πŸ‘₯ Accounts & Team** * Inviting teammates is more reliable: the invitation now sends without needing to press Enter. * The portal now waits until your organization is ready before loading, preventing errors right after signing in. **πŸ”‘ Sign-in & Getting Started** * Signing in is smoother: the page no longer briefly bounces around while your session loads. * Getting started is simpler: choose your battery and solar options with easy toggle cards instead of filling in technical details. * There are fewer fields to complete when you first set things up. *** **πŸ”’ Security & Privacy** * Hardened the sign-in service so stray scanning traffic no longer causes errors. * Applied security and stability updates to the sign-in experience. **πŸ‘₯ Accounts & Team** * You can now manage your team directly in the portal: invite members, change roles, and remove people. * Pending invitations can be resent or revoked at any time. * Team member details are now visible only to people with permission to manage the team. * Signing up is simpler: first name is now optional and required fields are clearly marked. *** **🧾 Quotes** * The quote activity timeline now shows a clear title for each entry. * Quote lists now show loading placeholders instead of a brief empty state while data loads. **πŸ”” Event Webhooks** * You can now subscribe to real-time quote and financing events and have them delivered to your own systems. * A new event destinations area lets you choose where events are sent and manage them yourself. * You can rotate the secret that secures your webhook deliveries at any time. *** **πŸ’Ά Financing** * Submitting a financing plan now automatically starts the loan request and application. * Financing progress now follows the lender's application stages, so the status you see stays accurate. *** **🧾 Quotes** * Quote line items now include a total-excluding-tax field. * Fixed the down payment field on the financing options page, and stopped showing financing options when a provider is unavailable. *** **⚑ Reliability & Sign-in** * Sign-in now happens directly on the site for a smoother, faster experience. * Financing indications stay available even when an outside provider is temporarily unreachable. **🧾 Quotes** * Document upload now has its own step in the new quote flow, with drag-and-drop and clear file details. * You can now write a note and send it together with a quote. * Cost previews now show representative examples, making indicative pricing easier to understand. * Quote pages now include an activity timeline so you can follow what happened and when. * Fixed an error that could block submitting a quote in some cases. *** **⚑ Speed & Reliability** * The portal loads faster. * Financing widgets and previews now load reliably, even for visitors using ad blockers, and render more sharply. *** **πŸ”’ Security & Privacy** * Applied a security update to keep accounts protected. * Strengthened how personal data is handled across the platform. # Compliance in Practice Source: https://docs.prets.io/compliance/operations How compliance works in day-to-day operations ## Provider-owned decisions Funding decisions are never influenced by Prets. Providers: * define criteria; * perform checks; * approve or reject applications; * issue contracts. Prets only ensures applications are complete, structured, and clearly submitted. ## Traceability and auditability Every step in the Prets flow is traceable. This includes: * customer inputs; * calculation assumptions; * documents submitted; * timestamps and confirmations. This supports audits, complaints handling, and internal reviews β€” without additional work for merchants. ## Human support, without advice When customers struggle, help is available. Prets allows for human-in-the-loop support that is: * procedural; * technical; * explanatory. Support staff do not provide advice or steer decisions. This is especially important for less digital-savvy or vulnerable customers. ## Designed to keep merchants safe Prets helps merchants: * avoid regulated advice activities; * reduce manual explanations that cross boundaries; * rely on a consistent, compliant process. Compliance is handled once β€” centrally β€” and applied consistently across all customers. ## Calm, consistent, defensible Prets is built to stand up to scrutiny. Not through legal language, but through: * clear boundaries; * neutral presentation; * customer-led decisions; * provider-owned outcomes. This makes Prets safe to scale β€” commercially and operationally. # Principles Source: https://docs.prets.io/compliance/overview How Prets is designed for regulated environments Energy upgrades sit at the intersection of sales, public schemes, and regulated finance. Prets is designed for this reality. Not by adding legal layers, but by structuring the process so roles never blur. ## Built for regulated environments Prets operates in markets where: * financing is regulated; * public subsidies apply; * consumer protection matters. The platform is built to support merchants without pulling them into activities they should not perform. Compliance is not an add-on. It is built into how Prets behaves. ## Clear role separation Every party keeps its responsibility. * **Merchants** sell energy upgrades. * **Customers** make choices and provide information. * **Funding providers** assess, approve, and contract. * **Prets** supports understanding and completion. Prets never acts as a lender, advisor, or decision-maker. ## Neutral by design Prets is structurally neutral. * No option is preselected. * No recommendation logic is applied. * No suitability judgments are made. All available payment options are shown side by side, using the same assumptions and inputs. Customers choose consciously. ## Customer control at every step Customers remain in control throughout the flow. They: * see all inputs used in calculations; * can adjust assumptions themselves; * explicitly confirm each next step; * decide whether to proceed or stop. Nothing is locked in without confirmation. # FAQs Source: https://docs.prets.io/faqs Common questions for teams evaluating or integrating Prets Prets is an embedded insight and application layer for energy upgrades. It helps homeowners understand whether an upgrade makes financial sense and how it can be paid for β€” directly inside your existing sales flow. Prets focuses on: * cost and payback of the upgrade; * affordability over time; * completing applications for financing or public schemes. Prets lives between your offer and the final decision. A typical flow: 1. You sell the energy upgrade. 2. Prets shows cost, impact, and payment scenarios. 3. The customer decides how to proceed. 4. Prets helps complete applications and documents. 5. You receive a confirmed, reliable order. The product sale stays yours. Prets supports the decision and the process. Compliance is handled by design. Prets: * keeps product sales and financing clearly separated; * ensures customers make their own choices; * avoids recommendations or suitability judgments; * prevents merchants from being pulled into regulated activities. This allows you to scale without increasing regulatory risk. You receive: * clear status updates (started, submitted, completed); * insight into where customers drop off; * signals on recurring friction points. This helps improve both sales performance and operations. Prets integrates into: * your website or checkout; * digital offers; * existing sales tooling via API. Most merchants start with a lightweight embed and expand over time. # Welcome Source: https://docs.prets.io/index Embedded insight and application layer for energy upgrades Prets lives inside merchant sales flows. It supports understanding, comparison, and completion of applications β€” so homeowners can move from offer to action, and merchants can close more projects. Prets is not a bank, lender, advisor, seller, or decision-maker. Learn how Prets fits into your systems and customer journey. See how compliance is built into the platform by design. Common questions for teams evaluating or integrating Prets. Technical API documentation for quotes and integration endpoints. # Next Steps Source: https://docs.prets.io/integration/compliance How compliance is built into the integration flow ## Compliance, built into the flow Prets does not rely on policy documents to stay compliant. Compliance is enforced through design: * customers make all choices themselves; * no option is preselected; * no advice or suitability logic is applied; * decisions stay with providers; * every step is traceable. This keeps your organisation outside regulated activities by construction. ## What comes next When you move forward, documentation covers: * security and authentication; * API and webhook reference; * test and production environments; * onboarding and rollout support. Most teams start with an embed. Integration deepens as volume grows. Technical API documentation for integration endpoints. See how Prets fits into your setup. # Data & Events Source: https://docs.prets.io/integration/data-and-events How data moves through Prets and what events you can act on ## How data moves Prets only uses data required to support the flow. ### Data into Prets Typically: * offer and upgrade details; * property or household inputs; * customer-provided information; * applicable subsidies or schemes. You control what is shared and when. ### Data back to you You receive: * clear status updates; * completion and drop-off signals; * structured application data where applicable. No hidden reuse. No resale. No surprises. ## Events you can act on Prets exposes clear moments in the journey, such as: * a customer starting the flow; * viewing comparisons; * beginning an application; * submitting documents; * completing the application; * receiving a provider decision. These signals let you follow up intelligently β€” without guessing. # Loan Indication Widget Source: https://docs.prets.io/integration/loan-indication-widget Show indicative financing costs inline β€” as a screenshot or an embedded live widget Call [`POST /v1/quotes/cost/preview`](/api/post-v1-quotes-cost-preview) with a quote total to get indicative monthly payments and widget URLs. See the API reference for the full request and response schema. Every successful response includes `links.loanIndicationWidget` with two ready-to-use URLs: **Example response:** `acme` represents your organisation slug. ```json theme={null} { "links": { "loanIndicationWidget": { "png": "https://acme.app.prets.io/widgets/financing-snapshot/png?amount=12500", "url": "https://acme.app.prets.io/widgets/financing-snapshot?amount=12500" } } } ``` Both URLs have the `amount` query parameter set to the `totalInclTax` from the request β€” the exact total the customer is financing. They are ready to use as-is. Do not hardcode a fixed amount; always use the value returned by the API. The links use the 15-year default. Append `preferred-loan-term` to show the customer's chosen term β€” see [Loan term](#loan-term). When you render representative examples from `data.representativeExamples` (in custom UI or alongside a widget), display the mandatory `text_warning` from `data.content` prominently β€” for example *"Let op! Geld lenen kost geld"*. | Option | What it is | Best for | | - | - | - | | **Screenshot** | Static PNG image rendered on-demand by Prets | Email quotes, PDF attachments, CMS pages | | **Financing Snapshot** | Live embedded widget showing 3 financing cards at a fixed amount | Web pages where you want to show financing options without interaction | | **Financing Explorer** | Live embedded widget with interactive loan amount, down payment, and duration controls | Web pages where customers should explore different financing scenarios before clicking through to onboarding | | **Offer Comparison** | Live table of three indicative offers (two market options plus SVn when a postal code is known) | Product pages and quote flows that should compare lenders at a fixed amount | | **Warmtefonds loan banner** | Strip for the non-zero Nationaal Warmtefonds offer. Amount from `data-amount` (defaults to € 10.000). Term defaults to 15 years. The info icon does nothing | A fixed financing line on a page. Open your own dialog on click | | **Credit table** | The table for that dialog: same non-zero Warmtefonds offer. Amount from `data-amount` (defaults to € 10.000). Term defaults to 15 years | Inside a dialog you build yourself | ## Screenshot Use `links.loanIndicationWidget.png` directly in an `` tag: **Example:** Replace the `src` with the URL returned for your quote. ```html theme={null} Indicatieve financieringskosten ``` The image is rendered on-demand by Prets. You do not need to generate or host it yourself. ## Financing Snapshot Drop a single ` ``` The script injects an iframe that displays 3 financing cards for the given amount. The iframe resizes automatically to fit its content. Set `data-amount` to the `totalInclTax` from the quote. ## Financing Explorer The Financing Explorer adds interactive controls so customers can adjust the loan amount, down payment, and loan duration before clicking through to onboarding. **Example:** Replace `acme` with your organisation slug and set `data-amount` to the financed total. ```html theme={null} ``` Set `data-amount` to the `totalInclTax` from the quote. ## Loan term Widgets open on 15 years by default. To show the term the customer chose, set `data-preferred-loan-term` in months: ```html theme={null} ``` On a widget or screenshot URL, use `preferred-loan-term`: `https://acme.app.prets.io/widgets/financing-snapshot/png?amount=12500&preferred-loan-term=120`. | Widget | Accepted values | Sets | | - | - | - | | Screenshot and Financing Snapshot | `84`, `120`, `180`, `240` | The term of all three cards | | Financing Explorer | `84`, `120`, `180`, `240` | The preselected term | | Offer Comparison | `84`, `120`, `180` | The preselected term | | Warmtefonds loan banner and Credit table | `84`, `120`, `180`, `240` | The term of the non-zero Nationaal Warmtefonds offer. Default `180` | If a lender does not offer that term for the amount, its card shows the lender's longest shorter term, never a longer one β€” Lender & Spender, for example, offers at most 10 years below € 10.000. Other values are ignored. ## Offer Comparison Offer Comparison shows three indicative rows at a fixed amount: the two lowest-rate market offers, plus a local SVn row. Pass a Dutch postal code to get a real SVn offer where one exists β€” without it, the third row states that SVn is always checked locally. **Example:** Replace `acme` with your organisation slug and supply values from your quote. ```html theme={null} ``` | Attribute | Query parameter | What it sets | | - | - | - | | `data-amount` | `amount` | Financed total the rows are calculated from | | `data-product-label` | `product_label` | Heading above the rows | | `data-postal-code` | `postal_code` | Postcode used to look up a real SVn offer | | `data-line-items` | `line_items` | Encoded quote line items β€” overrides `amount` and `product_label` | | `data-preferred-loan-term` | `preferred-loan-term` | Preselected loan term in months β€” see [Loan term](#loan-term) | Every widget also accepts these as a query string on the iframe URL directly: `/widgets/offer-comparison?amount=12500&product_label=Warmtepomp&postal_code=3811LM`. ## Warmtefonds loan banner A fixed strip for the non-zero Nationaal Warmtefonds offer. The monthly figure and the rate come from the catalog. Amount defaults to € 10.000 and the term defaults to 15 years. The info icon does nothing β€” open your own dialog and embed the [credit table](#credit-table) inside it. **Example:** Replace `acme` with your organisation slug. `data-amount` defaults to € 10.000 when you omit it. ```html theme={null} ``` The same URL works as an iframe: `/widgets/warmtefonds-loan-banner?amount=4049&preferred-loan-term=120`. It shows Nationaal Warmtefonds only. ## Credit table The credit table is the content for the dialog you open from the banner. Prets does not build the click or the dialog. It shows the same non-zero Nationaal Warmtefonds offer: Kosten verduurzaming, Financierder, Looptijd, Rente, Totaal leenbedrag, and Maandbedrag. The rate is the catalog rate, not a fixed percentage. Looptijd is the resolved term. **Example:** Replace `acme` with your organisation slug. `data-amount` defaults to € 10.000 when you omit it. ```html theme={null} ``` The same URL works as an iframe: `/widgets/credit-table?amount=4049&preferred-loan-term=120`. ## Line items When you already hold quote line items, send those instead of a flat amount and label: the widget derives both from the items, so your heading and total cannot drift apart. Use the same array you would post to `POST /v1/quotes`, encoded as one base64url JSON token. **Example encoding:** Replace `items` with the line items from your quote. ```js theme={null} const items = [{ type: 'heat_pump', totalInclTax: 4049 }] const token = btoa(JSON.stringify(items)) .replace(/\+/g, '-') .replace(/\//g, '_') .replace(/=+$/, '') ``` **Example embed:** Replace `acme` with your organisation slug and `data-line-items` with your encoded token. ```html theme={null} ``` That token renders **Warmtepomp** and **€ 4.049** β€” the amount is the sum of `totalInclTax`, the heading comes from the work-item types. Each item needs a `type` and a `totalInclTax`. Work types are `heat_pump`, `pv`, `battery`, `wall_insulation`, `sloped_roof_insulation`, `flat_roof_insulation`, `floor_insulation` and `windows`. A `subsidy` item takes a negative `totalInclTax` plus at least one `incentiveCodes` value; subsidies lower the total but stay out of the heading. A valid `line_items` overrides `data-amount` and `data-product-label`, so do not expect a leftover flat amount to win. If the token is malformed, or the items total zero or less, the widget falls back to those flat fields. ## AFM banner The financing snapshot, financing explorer, offer comparison, and the snapshot PNG include the mandatory *Let op! Geld lenen kost geld* warning **by default**. The Warmtefonds loan banner and the credit table always include the warning and have no toggle. Turn the banner off only when the host page already shows the warning itself (snapshot, explorer, offer comparison, and snapshot PNG only): **Example:** Replace `acme` with your organisation slug and set the financed total. ```html theme={null} ``` `data-show-afm` defaults to on. `?show_afm=false` is the equivalent on the widget URL for the snapshot, explorer, offer comparison, and the snapshot image. ## Keeping the amount and term in sync The financed total and the loan term drive every monthly figure the widget shows, so both have to match what the customer chose. * Use `data-line-items` when you have quote line items, and the `amount` from `links.loanIndicationWidget` otherwise. Never hardcode either. * When the quote total changes, re-encode the token or call `POST /v1/quotes/cost/preview` again and use the new links. * Pass the customer's chosen term as `preferred-loan-term`, including on the screenshot URL in the quote. * Pass the same `data-amount` (or `amount` query param) on the Warmtefonds banner and the credit table so the strip and the dialog stay in sync. * Pass `preferred-loan-term` on the banner or the credit table when the customer chose a term. # Overview Source: https://docs.prets.io/integration/overview How Prets fits into your systems and customer journey This section explains how Prets fits into your systems and customer journey, in the same practical terms you use to run your business. It is written for teams who need to understand not just what Prets does, but how it behaves once embedded: * **CTOs and engineers** responsible for integration * **Operations and compliance teams** responsible for execution * **Product owners** accountable for conversion and customer experience This is not API documentation. It is the operating model. ## Where Prets fits in practice Energy upgrades are sold by you β€” but decided over time by the customer. Prets sits after the offer, before the final commitment. That is the moment where customers slow down: * they want to understand the total investment; * they compare ways to pay; * they hesitate on forms, documents, and next steps. Prets supports this phase without taking ownership away from anyone. You remain the merchant. Funding providers remain the decision-makers. Customers remain in control. Prets simply makes the process understandable and finishable. ## How Prets integrates Prets is designed to fit into existing setups β€” not to replace them. Most merchants start small, then deepen integration as volume grows. **The fastest way to get live.** Prets runs directly inside your website, offer environment, or checkout using an embedded component. From the customer's perspective, nothing feels external. From your perspective, there is no new frontend to maintain. Used when you want to: * add payback and affordability insight after the offer; * let customers compare payment options calmly; * allow applications to start and finish without redirects. **For teams that want full control over the experience.** You design the journey. Prets provides the logic behind it: calculations, comparisons, application steps, and status handling. Typically used by: * utilities or large installers; * platforms with their own CRM or sales tooling; * teams operating across products, regions, or providers. **Most long-term customers end up here.** Customer-facing steps run in embedded flows. Data, status, and reporting are handled through APIs. This keeps the customer journey simple while giving your teams operational control. # Quote amounts Source: https://docs.prets.io/integration/quote-amounts Loan limits for the customer, and a quote you can still correct when a measure drops When you submit a customer's offer, in the portal or through the API, how you split it into lines decides how much Prets can do with it afterwards. Put each measure on its own line with its price including and excluding VAT, link labor billed apart to the measure it belongs to, and name a subsidy on the measure it covers. Prets can then tell your customer exactly which loan amount and duration restrictions apply to their job. It also helps you when plans change. If the customer drops a measure between the quote and the actual invoice, the financeable loan goes down. Because each line already carries its own price and its own labor, Prets can take exactly those lines off without coming back to you with more questions. ## Prices The measures in one offer often carry different VAT rates, so give every line its price both including and excluding VAT. That pair is what Prets uses to take a dropped line off the financeable loan. Some merchants are also billed as a percentage of the quote. For them, the excluding amount on a dropped line is what lets Prets correct the invoice sent at the end of the month. Without it, Prets has to go back and forth with you to get that invoice right. Send `totalInclTax` and `totalExclTax` on the quote and on every priced line. There is no VAT-rate field. The including amount alone cannot show whether a line is 0%, 9%, or 21%. On a 0% line, both amounts are the same positive price. An excluding amount of 0 is dropped. Currency is euros. These are the Dutch rates for these measures, in force on 2 October 2026. The general rate is 21%. Solar panels meant for a home are 0%, and so is installation of those panels. Insulation materials are 21%. Labor that applies that insulation, on a home first occupied more than two years before the work, is 9%. Setting insulating glass is that same 9%. A heat pump stays 21% on the unit and on a separate installation line. The quote totals are the sums of the priced lines. They are not a substitute for the pair on each line. ## Installation lines You can drop individual lines in the middle of an application instead of withdrawing the whole quote. When labor is billed on its own line, tell Prets which measure it belongs to. If that measure drops, its labor comes off with it, instead of staying behind as an orphan line for work nobody is doing. Labor included in the measure price stays on that measure line. When labor is billed apart, send an `installation` line and set `belongsTo` to its measure. `belongsTo` names the measure. It does not set the rate. The installation line carries its own amounts. ## A mixed quote The example below puts three measures with different VAT on one quote, with the insulation labor on its own line. If the customer drops the insulation, the materials and the labor come off together, and the solar panels and heat pump stay exactly as quoted. Solar panels for a modest roof, cavity-wall insulation on a terraced home, and a heat pump. Amounts are rounded so each rate lands on a whole euro. The installation line is the 9% labor. | type | belongsTo | totalExclTax | totalInclTax | | - | - | - | - | | `pv` | | 4800 | 4800 | | `cavity_wall_insulation` | | 400 | 484 | | `installation` | `cavity_wall_insulation` | 800 | 872 | | `heat_pump` | | 8500 | 10285 | | Quote | | 14500 | 16441 | ## Subsidy Record a subsidy such as ISDE only if it applies to the job, you already know the amount, and you have told your customer about it. Prets then knows about the subsidy without it lowering the amount the loan is based on. Name ISDE on the heat pump it covers, and add one extra line with a negative amount for the known subsidy. That line does not reduce the quote totals. The totals including and excluding VAT stay the gross of the other lines, and the customer's loan amount and duration limits are based on those gross totals. With the subsidy amount known and the totals still gross, your customer can make an informed decision: also bridge the subsidy until it is paid out, or pay that amount from their savings. If the heat pump later drops, you remove the pump and its ISDE line together, and the limits follow what is left. Put `incentiveCodes` on the measure line or lines the ISDE covers, and add one `type` `subsidy` line for that amount. Its `totalInclTax` is negative. A subsidy line has no excluding amount. | type | incentiveCodes | totalExclTax | totalInclTax | | - | - | - | - | | `heat_pump` | `ISDE-2024-WP` | 8500 | 10285 | | `subsidy` | `ISDE-2024-WP` | | -2000 | | Quote | | 8500 | 10285 | # Responsibilities Source: https://docs.prets.io/integration/responsibilities Who is responsible for what β€” operationally and from a compliance perspective Clear roles are essential β€” operationally and from a compliance perspective. ## You (merchant / installer) You stay responsible for the commercial side: * selling the energy upgrade; * defining scope and pricing; * owning the customer relationship; * deciding where Prets appears in your flow. You are never required to: * assess financing suitability; * explain financial products; * collect or approve regulated decisions. ## The homeowner The customer actively drives the process. They: * enter information; * explore scenarios; * choose whether and how to proceed; * submit applications deliberately. Nothing is hidden. Nothing is locked in without confirmation. ## Prets Prets supports the decision and the process. It: * explains cost, impact, and payback in plain terms; * shows payment options side by side; * guides customers through required steps and documents; * monitors progress and highlights where people get stuck. Prets never: * recommends options; * defaults customers into financing; * approves or rejects applications. ## Funding providers Providers remain fully responsible for: * acceptance criteria; * checks and approvals; * contracts and final outcomes. Prets only facilitates a cleaner, more complete application. # Creating a Quote Source: https://docs.prets.io/portal/create-quote How to submit a quote on behalf of a customer via the Prets portal The Prets portal create quote tool offers a way to submit financing quote requests on behalf of customers. You fill in the customer's details and the items on their offer; Prets handles the rest. In order to access the form, you need to login and check if the correct organization is selected in the header. If you have access to multiple organizations, you can use the dropdown menu in the header to switch between organizations. The form is split into three steps: customer details, the quote itself, and a review before submission. ## Step 1 β€” Customer details Fill in the personal and address details of the customer you are submitting the request for. | Field | Required | Notes | | - | - | - | | First name | No | | | Last name | Yes | | | Email address | Yes | Must be a valid email | | Phone number | Yes | Dutch numbers only β€” enter without the leading `+31` | | Postal code | Yes | Dutch format: `1234 AB` | | House number | Yes | Digits only | | Addition | No | e.g. `A`, `bis` | Click **Volgende: Offerte β†’** to proceed. The form validates all fields before advancing. ## Step 2 β€” Quote line items Add one or more line items that make up the customer's offer. Each line item represents a quote component to be financed. For each line item, fill in: | Field | Required | Notes | | - | - | - | | Category | Yes | See the supported types below | | Total price incl. VAT | Yes | The full customer-facing price in euros | | Quote reference | No | Your internal reference number, e.g. `OFF-2026-00123` | **Supported categories:** * Solar panels (Zonnepanelen) * Battery storage (Batterij) * Heat pump (Warmtepomp) * Wall insulation (Gevelisolatie) * Sloped roof insulation (Dakisolatie β€” schuin) * Flat roof insulation (Dakisolatie β€” plat) * Floor insulation (Vloerisolatie) * Windows / Glazing (Ramen/Glas) Use **+ Offertepost toevoegen** to add additional line items if the customer's offer covers multiple categories. The running total is shown at the bottom of the step. Click **Volgende: Controleren β†’** to proceed. All line items must have a category and a price greater than zero before you can advance. ## Step 3 β€” Review and submit The review step shows a summary of everything you have entered: customer details, each line item with its category and price, and the total. Check the details are correct, then click **Aanvraag indienen** to submit. You cannot edit fields on the review step. Use **← Terug** to go back and make corrections. Once submitted, a confirmation banner appears. You can start a new request immediately with **Nieuwe aanvraag** β€” the form resets to a blank state. ## What happens after submission Prets receives the quote and routes it into the financing process. The customer should receive a confirmation email in their inbox (or spam folder). You do not need to take any further action in the portal after submission. ## Next Steps After submitting a quote, you can upload supporting documents like customer offers or invoices. See [Uploading Documents](/portal/upload-documents) for detailed guidance on accepted file formats and document types. # Uploading Documents Source: https://docs.prets.io/portal/upload-documents How to attach supporting documents to quotes After submitting a quote, you can upload supporting documents to provide additional context and documentation for the financing request. These attachments help ensure all necessary information is available for processing. ## How to Upload You can upload documents in two ways: 1. **From the confirmation screen** β€” Immediately after submitting a quote, use the upload section on the confirmation page 2. **From the quotes table** β€” Navigate to the quotes list, find your quote, and click the arrow (β†’) button on the right to access the quote details page where you can upload documents ## Document Types When uploading, you can categorize your document by type. This helps organize attachments and ensures the right documents are available during processing: | Type | When to Use | Examples | | - | - | - | | **Quote Copy** | Upload the original quote document that was presented to the customer | Customer-facing quote PDF, signed quote document | | **NWF Installer Declarations** | Upload NWF (Nationaal Warmtefonds) installer declaration forms required for Dutch subsidy applications | Completed NWF declaration PDFs, installer certification forms | | **Invoice** | Upload final invoices or billing documents | Final invoice after installation, payment receipts | Document type is optional but recommended. It makes it easier to find specific documents later and helps streamline the processing workflow. ## File Formats and Size Limits **Accepted formats:** PDF, JPEG, PNG, WebP **Maximum file size:** 25MB per file Files larger than 25MB will be rejected. If you have a large file, consider compressing the PDF, reducing image resolution, or splitting multi-document files into separate uploads. ## What Happens After Upload Once uploaded, documents are securely stored and associated with the quote. The Prets team will review these documents as part of the financing process. You do not need to take any further action after uploading. # User Management Source: https://docs.prets.io/portal/user-management How to invite users and manage roles in the Prets portal Organization admins can invite team members and external advisors to the portal. This guide covers how to create users and what each role can do. ## How to Invite Users Only **Admin** users can invite new members. To invite someone: 1. Click the organization name in the header and select **Beheer organisatie** (Manage organization) 2. Go to the **Leden** (Members) tab in the left sidebar 3. Click **Uitnodigen** (Invite) 4. Enter the email address and select a role 5. Click **Uitnodiging verzenden** (Send invitation) The invited user will receive an email to complete their account setup. ## Roles and Permissions ### Member For internal operational staff who work with quotes on a daily basis. **Examples:** Sales representatives, back-office employees, customer service staff ### Admin For organization owners and managers who need to control team access. **Examples:** Business owners, operations managers, team leads Only assign Admin to trusted users who need member management access. ### Advisor For external partners who submit quotes but shouldn't access full organization data. **Examples:** Independent energy advisors, partner consultants, freelance sales agents Use Advisor for external partners to keep your organization data secure while allowing them to submit quotes. ## Permission Comparison | Permission | Member | Admin | Advisor | | - | :-: | :-: | :-: | | Create quotes | βœ“ | βœ“ | βœ“ | | Manage quotes | βœ“ | βœ“ | βœ— | | View all quotes | βœ“ | βœ“ | βœ— | | Invite users | βœ— | βœ“ | βœ— | ## Best Practices * Use **Admin** only for users who need member management * Use **Member** for internal staff working with quotes * Use **Advisor** for external partners with limited access * Have at least two Admins for continuity * Review and remove inactive users regularly