{"id":330525,"date":"2026-08-15T10:23:17","date_gmt":"2026-08-15T10:23:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/helloasso-checkout-button\/"},"modified":"2026-08-15T10:22:49","modified_gmt":"2026-08-15T10:22:49","slug":"brumisphere-checkout-button-helloasso","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/brumisphere-checkout-button-helloasso\/","author":23187528,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Brumisphere Checkout Button for HelloAsso","header_author":"Brumisph\u00e8re, Agence Webmarketing","header_description":"Add a HelloAsso Checkout payment button to WordPress using a shortcode.","assets_banners_color":"eed7e7","last_updated":"2026-08-15 10:22:49","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/brumisphere-checkout-button-helloasso\/","header_author_uri":"https:\/\/www.brumisphere.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":29,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"brumisphere","date":"2026-08-15 10:22:49"}},"upgrade_notice":{"1.0.0":"<p>Initial release. Confirm production credentials, production webhook signature configuration, and production-like UAT before production use.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3648425,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3648425,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3648425,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3648425,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[3148,617,177739,507,80],"plugin_category":[43,45],"plugin_contributors":[239430],"plugin_business_model":[],"class_list":["post-330525","plugin","type-plugin","status-publish","hentry","plugin_tags-checkout","plugin_tags-donation","plugin_tags-helloasso","plugin_tags-payment","plugin_tags-shortcode","plugin_category-customization","plugin_category-ecommerce","plugin_contributors-brumisphere","plugin_committers-brumisphere"],"banners":{"banner":"https:\/\/ps.w.org\/brumisphere-checkout-button-helloasso\/assets\/banner-772x250.png?rev=3648425","banner_2x":"https:\/\/ps.w.org\/brumisphere-checkout-button-helloasso\/assets\/banner-1544x500.png?rev=3648425","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/brumisphere-checkout-button-helloasso\/assets\/icon-128x128.png?rev=3648425","icon_2x":"https:\/\/ps.w.org\/brumisphere-checkout-button-helloasso\/assets\/icon-256x256.png?rev=3648425","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Brumisphere Checkout Button for HelloAsso adds a generic <code>[helloasso_checkout_button]<\/code> shortcode to WordPress. It creates HelloAsso checkout intents server-side only after the visitor clicks the button, stores payment records in separate sandbox and production tables, and updates payment state through HelloAsso webhooks.<\/p>\n\n<p>The plugin is published by Brumisph\u00e8re, Agence Webmarketing, and is designed as a business-agnostic HelloAsso checkout integration. It does not include booking, calendar, week selection, or custom business workflows.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Generic <code>[helloasso_checkout_button]<\/code> shortcode.<\/li>\n<li>Server-side checkout creation after an explicit visitor click.<\/li>\n<li>Transient-backed checkout configuration with nonce validation.<\/li>\n<li>Separate sandbox and production credentials.<\/li>\n<li>Separate physical payment tables for sandbox and production.<\/li>\n<li>HelloAsso OAuth and API v5 clients with tuned WordPress HTTP requests.<\/li>\n<li>Optional defensive cURL fallback for a specific Azure 404 HTML misroute, disabled by default and available through a developer filter after WordPress HTTP API is tried first.<\/li>\n<li>Environment-specific webhook endpoints.<\/li>\n<li>HMAC SHA-256 webhook validation when an environment Webhook Signature Key is configured.<\/li>\n<li>Controlled unsigned webhook fallback when a signature key is unavailable.<\/li>\n<li>Admin Payments screen for sandbox and production logs without changing the active checkout environment.<\/li>\n<li>Minimized webhook event storage; raw webhook payloads are not stored by default.<\/li>\n<li>Secure output escaping, settings sanitization, and admin capability checks.<\/li>\n<\/ul>\n\n<p>The front end never receives client secrets, access tokens, webhook signature keys, or Authorization headers.<\/p>\n\n<h3>Configuration<\/h3>\n\n<p>Settings are available under <strong>HelloAsso Checkout &gt; Settings<\/strong>.<\/p>\n\n<h4>General<\/h4>\n\n<ul>\n<li>Active checkout environment: <code>sandbox<\/code> or <code>production<\/code>.<\/li>\n<li>Debug logging.<\/li>\n<li>Allow unsigned webhooks when signature key is missing.<\/li>\n<li>Delete plugin data on uninstall.<\/li>\n<\/ul>\n\n<h4>Production credentials<\/h4>\n\n<ul>\n<li>Production Client ID.<\/li>\n<li>Production Client Secret.<\/li>\n<li>Production Organization Slug.<\/li>\n<li>Production Webhook Signature Key.<\/li>\n<\/ul>\n\n<h4>Sandbox credentials<\/h4>\n\n<ul>\n<li>Sandbox Client ID.<\/li>\n<li>Sandbox Client Secret.<\/li>\n<li>Sandbox Organization Slug.<\/li>\n<li>Sandbox Webhook Signature Key.<\/li>\n<\/ul>\n\n<h4>Checkout defaults<\/h4>\n\n<ul>\n<li>Default total amount in cents.<\/li>\n<li>Default initial amount in cents.<\/li>\n<li>Default item name.<\/li>\n<li>Default donation mode.<\/li>\n<li>Default SEPA setting.<\/li>\n<li>Default return, error, and back URLs.<\/li>\n<li>Optional default metadata JSON.<\/li>\n<\/ul>\n\n<h3>Shortcode<\/h3>\n\n<p>Basic usage:<\/p>\n\n<pre><code>[helloasso_checkout_button]\n<\/code><\/pre>\n\n<p>With an explicit amount and label:<\/p>\n\n<pre><code>[helloasso_checkout_button total_amount=\"2500\" item_name=\"Donation\"]\n<\/code><\/pre>\n\n<p>Supported attributes:<\/p>\n\n<ul>\n<li><code>total_amount<\/code> - total amount in cents. Recommended amount attribute.<\/li>\n<li><code>amount<\/code> - compatibility alias for <code>total_amount<\/code>; prefer <code>total_amount<\/code>.<\/li>\n<li><code>initial_amount<\/code> - initial amount in cents. Defaults to <code>total_amount<\/code>.<\/li>\n<li><code>item_name<\/code> - item label, up to 250 characters.<\/li>\n<li><code>contains_donation<\/code> - accepts <code>1<\/code>, <code>true<\/code>, <code>yes<\/code>, or <code>on<\/code>.<\/li>\n<li><code>enable_sepa<\/code> - accepts <code>1<\/code>, <code>true<\/code>, <code>yes<\/code>, or <code>on<\/code>.<\/li>\n<li><code>return_url<\/code> - valid URL after successful checkout.<\/li>\n<li><code>error_url<\/code> - valid URL after checkout error.<\/li>\n<li><code>back_url<\/code> - valid URL when the visitor goes back.<\/li>\n<li><code>metadata<\/code> - optional JSON object.<\/li>\n<li><code>lang<\/code> - optional language such as <code>fr<\/code>, <code>en<\/code>, or <code>es<\/code>.<\/li>\n<\/ul>\n\n<p>Shortcode attributes are sanitized and merged with configured defaults. The plugin stores checkout configuration server-side in a short-lived transient and renders only a generic button, public transient token, and nonce. The checkout creation response returns only the HelloAsso redirect URL, not the local <code>payment_uuid<\/code>.<\/p>\n\n<p>Checkout creation is rate limited before the transient token is consumed, before a local payment row is created, and before HelloAsso OAuth\/API calls run. Defaults are a 10-second cooldown and 5 attempts per 5-minute rolling window per hashed client identity. Excess attempts return HTTP <code>429 Too Many Requests<\/code>. If WordPress cannot persist the rate-limit counter, checkout creation fails closed with HTTP <code>503 Service Unavailable<\/code> and debug logs include <code>checkout_rate_limit_storage_failed<\/code>.<\/p>\n\n<p>If checkout creation fails and the plugin cannot persist the local payment row as <code>api_error<\/code>, debug logs include <code>checkout_payment_error_status_update_failed<\/code> without exposing the full payment UUID or payer data.<\/p>\n\n<p>Repeated renders of the same normalized shortcode configuration can reuse a render token for 5 minutes per hashed client and page context to reduce transient bloat. Once a token is consumed, the reuse index is invalidated so future renders receive a fresh token. A stale cached page or second tab can still submit an already consumed token and receive HTTP <code>410<\/code>; refresh the page and try again. If WordPress cannot store the render token, the shortcode shows a controlled temporary-unavailable message instead of emitting an invalid token. If only the reuse index cannot be stored, checkout continues with the valid token and debug logs include <code>checkout_render_token_reuse_index_failed<\/code>.<\/p>\n\n<h3>Webhooks<\/h3>\n\n<p>Preferred webhook endpoints:<\/p>\n\n<ul>\n<li><code>\/wp-json\/helloasso-checkout\/v1\/webhook\/sandbox<\/code><\/li>\n<li><code>\/wp-json\/helloasso-checkout\/v1\/webhook\/production<\/code><\/li>\n<\/ul>\n\n<p>Backward-compatible aliases are also registered:<\/p>\n\n<ul>\n<li><code>\/wp-json\/brumisphere-checkout-button-helloasso\/v1\/webhook\/sandbox<\/code><\/li>\n<li><code>\/wp-json\/brumisphere-checkout-button-helloasso\/v1\/webhook\/production<\/code><\/li>\n<\/ul>\n\n<p>When an environment Webhook Signature Key is configured, the plugin requires the <code>x-ha-signature<\/code> header and validates it with HMAC SHA-256 and <code>hash_equals()<\/code>. Invalid signatures are always rejected when a key is configured.<\/p>\n\n<p>If HelloAsso does not provide a Webhook Signature Key, administrators can explicitly enable <strong>Allow unsigned webhooks when signature key is missing<\/strong>. This fallback is disabled by default, shows admin warnings, logs bypass events only when Debug logging is active, and weakens webhook authenticity checks. It only applies while the matching environment key is missing, never creates new payments, and only updates an existing local payment matched by <code>payment_uuid<\/code> in the correct environment table.<\/p>\n\n<p>For production, use a Webhook Signature Key when available and keep unsigned webhook processing disabled unless a controlled operational exception is required.<\/p>\n\n<p>Webhook request bodies are limited to 262144 bytes by default and oversized requests return HTTP <code>413 Payload Too Large<\/code> before signature validation or JSON parsing. Developers can adjust this with the <code>hacb_max_webhook_body_bytes<\/code> filter.<\/p>\n\n<p>Signed webhook reconciliation uses <code>payment_uuid<\/code>, <code>checkout_id<\/code>, <code>order_id<\/code>, then <code>payment_id<\/code>. Unsigned fallback is stricter and only uses <code>payment_uuid<\/code>. If a webhook includes <code>payment_uuid<\/code> but no local payment row exists yet, the event is kept as <code>pending_payment_match<\/code> and returns HTTP <code>503 Service Unavailable<\/code> so the provider can retry delivery. If the local payment row is found but the database update fails, the event is kept as <code>retryable_update_failed<\/code> without <code>processed_at<\/code> and also returns HTTP <code>503<\/code>. A zero-row payment update is accepted only after rereading the row and verifying that the expected status is already stored; otherwise the event remains retryable. Events are claimed with a <code>processing<\/code> lease before payment updates run; fresh duplicate deliveries return <code>in_progress<\/code>, while stale processing rows can be retried. If a claim attempt fails while the latest stored event state is still retryable or stale, the endpoint returns HTTP <code>503<\/code> instead of treating it as a final duplicate. Critical webhook event transitions must persist before success is reported; if a transition such as <code>processed<\/code> cannot be stored, the endpoint returns HTTP <code>503<\/code>.<\/p>\n\n<h3>Payments<\/h3>\n\n<p>The <strong>HelloAsso Checkout &gt; Payments<\/strong> screen shows sandbox and production payment records. You do not need to change the active checkout environment to review both environments.<\/p>\n\n<p>Payment status is created as pending during checkout creation and updated later by webhook processing.<\/p>\n\n<p>Payment tables:<\/p>\n\n<ul>\n<li><code>{$wpdb-&gt;prefix}helloasso_checkout_sandbox_payments<\/code><\/li>\n<li><code>{$wpdb-&gt;prefix}helloasso_checkout_production_payments<\/code><\/li>\n<\/ul>\n\n<p>Webhook events are stored separately for idempotency and troubleshooting. Raw webhook payloads are processed in memory and discarded by default; the event table stores only a minimized, sanitized operational summary.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to the HelloAsso service to create checkout intents and receive payment status updates. A HelloAsso account and API credentials are required.<\/p>\n\n<p>After credentials have been configured, the plugin contacts HelloAsso only when a visitor explicitly clicks a rendered checkout button and when HelloAsso sends a webhook to the configured WordPress REST endpoint.<\/p>\n\n<p>For OAuth and checkout creation, the plugin sends the configured HelloAsso client ID, client secret, organization slug, checkout amount, item name, donation and SEPA flags, return\/error\/back URLs, optional language, optional custom metadata, the local payment UUID, and the current site host. The browser is redirected to the checkout URL returned by HelloAsso.<\/p>\n\n<p>The checkout button displays the HelloAsso logo from <code>https:\/\/api.helloasso.com\/v5\/img\/logo-ha.svg<\/code>.<\/p>\n\n<p>For webhooks, HelloAsso sends payment event data back to this WordPress site. The plugin processes the webhook body in memory, validates the configured signature when available, stores only minimized event data for idempotency\/troubleshooting, and updates the matching local payment record. Webhook payloads can include payment identifiers, status, payer name, payer email, amount, and metadata depending on the event sent by HelloAsso.<\/p>\n\n<p>Service endpoints used by the plugin:<\/p>\n\n<ul>\n<li>Production OAuth\/API: <code>https:\/\/api.helloasso.com<\/code><\/li>\n<li>Sandbox OAuth\/API: <code>https:\/\/api.helloasso-sandbox.com<\/code><\/li>\n<\/ul>\n\n<p>HelloAsso terms and privacy information are available from HelloAsso:<\/p>\n\n<ul>\n<li>Terms: https:\/\/info.helloasso.com\/cgu-associations<\/li>\n<li>Privacy: https:\/\/www.helloasso.com\/confidentialite<\/li>\n<\/ul>\n\n<h3>Security and Privacy<\/h3>\n\n<ul>\n<li>API client secrets stay in WordPress admin settings.<\/li>\n<li>Configured secrets are not rendered back into password field values.<\/li>\n<li>Empty secret fields preserve existing values; use the explicit clear checkbox to remove a stored secret.<\/li>\n<li>Access tokens are not printed in the front end.<\/li>\n<li>Webhook signature keys are never displayed in full.<\/li>\n<li>Authorization headers are not logged.<\/li>\n<li>Webhook payloads are not stored raw by default.<\/li>\n<li>Debug logs avoid full payer data and sensitive values.<\/li>\n<li>Admin screens require <code>manage_options<\/code>.<\/li>\n<li>Output is escaped and settings are sanitized.<\/li>\n<li>Checkout requests use nonce validation.<\/li>\n<li>Checkout creation is rate limited and does not store or log raw client IP addresses.<\/li>\n<li>Shortcode render tokens are reused over a short window to reduce transient bloat.<\/li>\n<li>Webhooks use HMAC SHA-256 validation when signature keys are configured.<\/li>\n<li>Oversized webhook bodies are rejected before signature validation, JSON parsing, or payload traversal.<\/li>\n<li>Webhook debug logs use presence fields and truncated hashes instead of full <code>payment_uuid<\/code> values or raw remote IP addresses.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>brumisphere-checkout-button-helloasso<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate <strong>Brumisphere Checkout Button for HelloAsso<\/strong> through the WordPress Plugins screen.<\/li>\n<li>Open <strong>HelloAsso Checkout &gt; Settings<\/strong>.<\/li>\n<li>Configure sandbox credentials first.<\/li>\n<li>Add <code>[helloasso_checkout_button]<\/code> to a page or post.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20does%20this%20plugin%20do%3F\"><h3>What does this plugin do?<\/h3><\/dt>\n<dd><p>It adds a generic HelloAsso checkout button to WordPress and handles server-side checkout creation, payment persistence, and webhook updates.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20helloasso%20account%3F\"><h3>Do I need a HelloAsso account?<\/h3><\/dt>\n<dd><p>Yes. You need a HelloAsso organization and API credentials for the environment you want to use.<\/p><\/dd>\n<dt id=\"can%20i%20use%20sandbox%20and%20production%3F\"><h3>Can I use Sandbox and Production?<\/h3><\/dt>\n<dd><p>Yes. Sandbox and production credentials can be configured at the same time. The active environment controls new checkouts only; the Payments screen can show both environments.<\/p><\/dd>\n<dt id=\"how%20do%20i%20display%20the%20checkout%20button%3F\"><h3>How do I display the checkout button?<\/h3><\/dt>\n<dd><p>Add <code>[helloasso_checkout_button]<\/code> to a post, page, or compatible editor block.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20expose%20api%20secrets%20on%20the%20frontend%20or%20admin%20screens%3F\"><h3>Does the plugin expose API secrets on the frontend or admin screens?<\/h3><\/dt>\n<dd><p>No. Client secrets, access tokens, webhook signature keys, and Authorization headers are never exposed to visitors. Configured admin secrets are not printed back into password field values; leave the field empty to keep an existing value, enter a new value to replace it, or use the explicit clear checkbox to remove it.<\/p><\/dd>\n<dt id=\"how%20are%20webhooks%20secured%3F\"><h3>How are webhooks secured?<\/h3><\/dt>\n<dd><p>When a Webhook Signature Key is configured for the environment, the plugin validates the <code>x-ha-signature<\/code> HMAC SHA-256 signature and rejects invalid signatures. Webhook bodies are also limited to 262144 bytes by default before signature validation or JSON parsing.<\/p><\/dd>\n<dt id=\"what%20if%20helloasso%20does%20not%20provide%20a%20webhook%20signature%20key%3F\"><h3>What if HelloAsso does not provide a Webhook Signature Key?<\/h3><\/dt>\n<dd><p>Use the unsigned webhook fallback only if necessary. It is disabled by default, visibly warned in admin, and only works when the environment key is missing. It cannot bypass an invalid signature when a key is configured.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20webhook%20arrives%20before%20the%20local%20payment%20row%20is%20available%3F\"><h3>What happens if a webhook arrives before the local payment row is available?<\/h3><\/dt>\n<dd><p>If the event includes <code>payment_uuid<\/code> but no local payment row is found yet, the event is stored as <code>pending_payment_match<\/code> and the endpoint returns HTTP <code>503 Service Unavailable<\/code> so delivery can be retried. Once the payment row exists, a later delivery can process the event and mark it <code>processed<\/code>; later deliveries are then treated as duplicates.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20webhook%20finds%20the%20payment%20row%20but%20the%20database%20update%20fails%3F\"><h3>What happens if a webhook finds the payment row but the database update fails?<\/h3><\/dt>\n<dd><p>The event is stored as <code>retryable_update_failed<\/code> without <code>processed_at<\/code> and the endpoint returns HTTP <code>503 Service Unavailable<\/code>. If WordPress reports zero affected payment rows, the plugin accepts that only when rereading the row confirms the expected status is already persisted. Debug logs can report <code>field_mismatch<\/code> with <code>mismatched_field<\/code> to identify the field without logging its value. A later delivery of the same <code>event_id<\/code> can retry the update. Once the update succeeds, the event is marked <code>processed<\/code> and later deliveries are treated as duplicates.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20store%20raw%20webhook%20payloads%3F\"><h3>Does the plugin store raw webhook payloads?<\/h3><\/dt>\n<dd><p>No. Raw payloads are not stored by default. The webhook event table stores only a minimized, sanitized summary for idempotency and troubleshooting.<\/p><\/dd>\n<dt id=\"where%20can%20i%20see%20payments%3F\"><h3>Where can I see payments?<\/h3><\/dt>\n<dd><p>Open <strong>HelloAsso Checkout &gt; Payments<\/strong> to view sandbox and production records.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20amount%2C%20item%2C%20and%20metadata%3F\"><h3>Can I customize amount, item, and metadata?<\/h3><\/dt>\n<dd><p>Yes. Use shortcode attributes or configure checkout defaults in Settings.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<p>Initial generic Brumisphere Checkout Button for HelloAsso implementation with Brumisph\u00e8re branding, settings, server-side checkout flow, sandbox\/production payment tables, OAuth\/API v5 clients, tuned HTTP requests, webhook processing, payment logs, minimized webhook event storage, documentation, and packaging assets.<\/p>","raw_excerpt":"Add a HelloAsso checkout button to WordPress with server-side creation, sandbox\/production settings, payment logs, and webhooks.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/330525","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=330525"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/brumisphere"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=330525"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=330525"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=330525"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=330525"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=330525"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=330525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}