{"id":460,"date":"2025-03-20T17:26:54","date_gmt":"2025-03-20T17:26:54","guid":{"rendered":"http:\/\/documentation.wpgetpaid.com\/?post_type=gd_place&#038;p=460"},"modified":"2025-03-26T15:12:38","modified_gmt":"2025-03-26T15:12:38","slug":"creating-a-payment-gateway","status":"publish","type":"gd_place","link":"https:\/\/wpgetpaid.com\/documentation\/article\/developers-developers\/creating-a-payment-gateway\/","title":{"rendered":"Creating a Payment Gateway"},"content":{"rendered":"\n<p>Developers can extend the <a href=\"https:\/\/github.com\/AyeCode\/invoicing\/blob\/efc4748b97fe7c9a0157f5b89168cce90c0c664f\/includes\/gateways\/class-getpaid-payment-gateway.php#L14\">GetPaid_Payment_Gateway<\/a> PHP class to create their own custom payment gateways. This class will take care of registering the payment gateway and provide a way of adding the admin settings fields and frontend payment fields.<\/p>\n\n\n\n<p><strong>GetPaid supports 4 different types of payment gateways:-<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Redirect <\/strong>&#8211; When a customer clicks on the pay now button, this payment gateway redirects them to the payment processor&#8217;s website. For example, PayPal.<\/li>\n\n\n\n<li><strong>iFrame based<\/strong> &#8211; The payment fields (e.g credit card forms) are loaded within the payment form in an iframe. For example, Square and Stripe.<\/li>\n\n\n\n<li><strong>Embedded <\/strong>&#8211; The payment fields (e.g credit card forms) are added directly\u00a0to the payment form. For example,\u00a0Authorize.net AIM. These types of gateways may require the website to be <a href=\"https:\/\/digitalguardian.com\/blog\/what-pci-compliance\">PCI compliant<\/a>.<\/li>\n\n\n\n<li><strong>Offline <\/strong>&#8211; Money is collected offline and the invoice is manually marked as paid. For example, Bank Transfer.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Creating a simple payment gateway<\/h2>\n\n\n\n<p>Start by creating a PHP class that extends the&nbsp;<strong>GetPaid_Payment_Gateway <\/strong>class as shown&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">&lt;?php\n\/**\n * Custom payment gateway\n *\n *\/\n\ndefined( &#039;ABSPATH&#039; ) || exit;\n\n\/**\n * Custom Payment Gateway class.\n *\n *\/\nclass My_Custom_Gateway extends GetPaid_Payment_Gateway {\n\n}<\/code><\/pre>\n\n\n\n<p>Next, use the <a href=\"https:\/\/github.com\/AyeCode\/invoicing\/blob\/3b6696a4eef1c13723491664b7653e97b929731e\/includes\/class-wpinv.php#L316\">getpaid_default_gateways<\/a> filter hook to register the payment gateway as shown below.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">\/**\n * Registers the gateway.\n *\/\nfunction register_my_custom_gateway( $gateways ){\n    $gateways[&#039;custom&#039;] = &#039;My_Custom_Gateway&#039;;\n    return $gateways;\n}\nadd_filter( &#039;getpaid_default_gateways&#039;, &#039;register_my_custom_gateway&#039; );<\/code><\/pre>\n\n\n\n<p><strong>That&#8217;s all.<\/strong><\/p>\n\n\n\n<p>However, before the gateway can be used to process payments and subscriptions, you need to implement a few required methods.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Required Methods<\/h3>\n\n\n\n<p>Most methods will be inherited from the GetPaid_Payment_Gateway class, but some are required in your custom gateway.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">__construct()<\/h4>\n\n\n\n<p>This is where you set a unique id for the gateway and give it a name and description. In addition, you can also set the features that your gateway supports and add some hooks that are unique to the gateway.<\/p>\n\n\n\n<p>Some of the properties that you can set here include:-<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><div><strong>checkout_button_text <\/strong>&#8211; The label to show on a payment form&#8217;s submit-button when this gateway is selected. If not set, the label set when editing a payment form will be used instead.<\/div><\/li>\n\n\n\n<li><div><div><strong>id<\/strong> &#8211; A unique id for your payment gateway.<\/div><\/div><\/li>\n\n\n\n<li><div><div><strong>order <\/strong>&#8211; The default priority of your payment gateway. Gateways with a lower priority appear first on payment forms.\u00a0This can be changed by site admins.<\/div><\/div><\/li>\n\n\n\n<li><div><strong>title <\/strong>&#8211; The (frontend) name of the payment gateway. This is what customers will see. This can be changed by site admins.<\/div><\/li>\n\n\n\n<li><div><div><strong>description <\/strong>&#8211; The description of the payment gateway, shown on the frontend.\u00a0This can be changed by site admins.<\/div><\/div><\/li>\n\n\n\n<li><div><div><strong>method_title <\/strong>&#8211; The actual name of the payment gateway, shown on the settings page.<\/div><\/div><\/li>\n\n\n\n<li><div><div><strong>countries <\/strong>&#8211; An array of countries that this payment gateway is allowed for. Do not set if the gateway is usable worldwide.<\/div><\/div><\/li>\n\n\n\n<li><div><div><strong>currencies <\/strong>&#8211; An array of currencies that this payment gateway is allowed for. Do not set if the gateway should be usable with any currency.<\/div><\/div><\/li>\n\n\n\n<li><div><div><strong>exclude_currencies <\/strong>&#8211;\u00a0\u00a0An array of currencies that this payment gateway is NOT allowed for. Do not set if the gateway should be usable with any currency.<\/div><\/div><\/li>\n\n\n\n<li><div><div><strong>max_amount <\/strong>&#8211; The maximum amount that this gateway can process in a single invoice.<\/div><\/div><\/li>\n\n\n\n<li><div><div><strong>view_transaction_url <\/strong>&#8211; The remote URL to view a transaction. &#8216;%s&#8217; will be replaced by the transaction ID of an invoice.<\/div><\/div><\/li>\n\n\n\n<li><div><div><strong>view_subscription_url <\/strong>&#8211; The remote URL to view a subscription.\u00a0&#8216;%s&#8217; will be replaced by the remote subscription ID of a subscription.<\/div><\/div><\/li>\n\n\n\n<li><div><div><strong>supports <\/strong>&#8211; An array of features that this payment gateway supports. This includes sandbox, subscription, tokens and addons.<\/div><\/div><br><\/li>\n<\/ul>\n\n\n\n<div>Before registering hooks for a gateway, it might be a good idea to first check if the gateway is enabled by calling the&nbsp;$this-&gt;enabled&nbsp;property.<\/div>\n\n\n\n<div><strong>Example:-<\/strong><\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">\/**\n * Class constructor.\n *\/\npublic function __construct() {\n  $this-&gt;id           = &#039;custom&#039;;\n  $this-&gt;title        = __( &#039;Custom&#039;, &#039;my-domain&#039; ); \/\/ Frontend name\n  $this-&gt;method_title = __( &#039;Custom Gateway&#039;, &#039;my-domain&#039; ); \/\/ Admin name\n  $this-&gt;description  = __( &#039;Pay using my custom payment gateway&#039;, &#039;my-domain&#039; );\n  $this-&gt;supports     = array( &#039;subscription&#039;, &#039;sandbox&#039;, &#039;tokens&#039;, &#039;addons&#039; );\n\n  \/\/ Add code that should always run whether or not the gateway is enabled (active).\n\n  \/\/ Call the parent constructor.\n  parent::__construct();\n\n  \/\/ Add code that should only run when the gateway is enabled (active).\n  if ( $this-&gt;enabled ) {\n\n  }\n\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-blockstrap-blockstrap-widget-heading mb-3\">admin_settings( $admin_settings )<\/h4>\n\n\n\n<p>When you register a payment gateway, GetPaid will automatically add settings that allow admins to enable\/disable the payment gateway, change the name and description shown on payment forms, and if the gateway supports sandbox mode, enable\/disable sandbox.<\/p>\n\n\n\n<p>You can add an admin_settings() method to your gateway&#8217;s class if you need to add more settings.<\/p>\n\n\n\n<p>The example code below allows you to add an &#8220;API Key&#8221; settings field to your gateway&#8217;s settings page.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">public function admin_settings( $admin_settings ) {\n\n   $admin_settings[&#039;custom_api_key&#039;] = array(\n       &#039;id&#039;   =&gt; &#039;custom_api_key&#039;,\n       &#039;name&#039; =&gt; __( &#039;API Key&#039;, &#039;my-domain&#039; ),\n       &#039;desc&#039; =&gt; __( &#039;Enter the API Key used to process payments.&#039;, &#039;my-domain&#039; ),\n       &#039;type&#039; =&gt; &#039;text&#039;,\n   );\n\n   return $admin_settings;\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">payment_fields(\u00a0$invoice_id,\u00a0$form\u00a0)<\/h4>\n\n\n\n<p>If you&#8217;re creating an embedded or iframe-based payment gateway, you can extend the payment_fields() method to display the iframe or credit card form.<\/p>\n\n\n\n<p>This method is passed an invoice id (or 0 if there is no invoice yet) and <a href=\"https:\/\/github.com\/AyeCode\/invoicing\/blob\/21456171ff93bd1dc9e65e6b9eaa6fc72d70b31c\/includes\/payments\/class-getpaid-payment-form.php#L10\">a payment form object<\/a>.<\/p>\n\n\n\n<p>You can then display your own payment fields or call the<a href=\"https:\/\/github.com\/AyeCode\/invoicing\/blob\/efc4748b97fe7c9a0157f5b89168cce90c0c664f\/includes\/gateways\/class-getpaid-payment-gateway.php#L474\"> get_cc_form()<\/a> method to display a pre-built credit card form. The example below shows how to display a quick credit card input form.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">public function payment_fields( $invoice_id, $form ) {\n   echo $this-&gt;get_cc_form()\n}<\/code><\/pre>\n\n\n\n<p>Some payment gateways allow you to tokenize a credit card so that you can use the token for future payments. If yours supports it, ensure to register support for\u00a0tokens then replace the above code with this one instead.<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">public function payment_fields( $invoice_id, $form ) {\n\n    \/\/ Let the user select a pre-saved payment token...\n    echo $this-&gt;saved_payment_methods();\n\n    \/\/ ... or provide new credit card details.\n    echo $this-&gt;new_payment_method_entry( $this-&gt;get_cc_form( true ) );\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">process_payment( $invoice,\u00a0$submission_data,\u00a0$submission )<\/h4>\n\n\n\n<div>This is the most important method as it allows you to process the payment, and maybe mark the invoice as paid. The method is passed <a href=\"https:\/\/github.com\/AyeCode\/invoicing\/blob\/8255061cd2b0c96628efcd07fb6eebd3afbf3d06\/includes\/class-wpinv-invoice.php#L14\">an invoice object<\/a>, an array of submitted data, and <a href=\"https:\/\/github.com\/AyeCode\/invoicing\/blob\/776791abcd5a7b0e32b505816873caff25e96914\/includes\/payments\/class-getpaid-payment-form-submission.php#L10\">the submission object<\/a>.<\/div>\n\n\n\n<div>Here, you can retrieve saved gateway settings such as an API key:-<\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">$api_key = wpinv_get_option(\u00a0&#039;custom_api_key&#039;\u00a0);<\/code><\/pre>\n\n\n\n<div>You can also fetch the submitted credit card fields:-<\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">$cc_number = $submission_data[&#039;custom&#039;][&#039;cc_number&#039;];<\/code><\/pre>\n\n\n\n<div>If there is an error (for example when an API has not been set), use <a href=\"https:\/\/github.com\/AyeCode\/invoicing\/blob\/43660e1ba369973efc0eabe25644516337cc3ac7\/includes\/error-functions.php#L79\">wpinv_set_error()<\/a>&nbsp;to set the error then redirect the user back to the checkout.<\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">if\u00a0(\u00a0empty( $cc_number\u00a0)\u00a0{\n\u00a0\u00a0\u00a0\u00a0wpinv_set_error(\u00a0&#039;missing_cc&#039;,\u00a0__( &#039;Please provide a valid credit card number&#039;, &#039;my-domain&#039; )\u00a0);\n\u00a0\u00a0\u00a0\u00a0wpinv_send_back_to_checkout(\u00a0$invoice\u00a0);\n}<\/code><\/pre>\n\n\n\n<div>The invoice object allows you to retrieve several details about the transaction including:-<\/div>\n\n\n\n<div><strong>The currency code.<\/strong><\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">$currency = $invoice-&gt;get_currency();<\/code><\/pre>\n\n\n\n<div><strong>The invoice number.<\/strong><\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">$invoice_number = $invoice-&gt;get_number();<\/code><\/pre>\n\n\n\n<div><strong>The invoice totals.<\/strong><\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">$invoice_total  = $invoice-&gt;get_total();\n$total_discount = $invoice-&gt;get_total_discount();\n$total_tax      = $invoice-&gt;$invoice-&gt;get_total_tax();\n$subtotal       = $invoice-&gt;get_subtotal();<\/code><\/pre>\n\n\n\n<div><strong>And the customer details.<\/strong><\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">$first_name  = $invoice-&gt;get_first_name();\n$last_name   = $invoice-&gt;get_last_name();\n$address     = $invoice-&gt;get_address();\n$city        = $invoice-&gt;get_city();\n$state       = $invoice-&gt;get_state();\n$zip         = $invoice-&gt;get_zip();\n$country     = $invoice-&gt;get_country();\n$customer_id = $invoice-&gt;get_customer_id();<\/code><\/pre>\n\n\n\n<div>Depending on the payment gateway you&#8217;re building, you might either:-<\/div>\n\n\n\n<div><strong>Process the payment immediately, mark the invoice as paid, then redirect to the success page, &#8230;<\/strong><\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">\/\/ Process the payment here.\n\n\/\/\u00a0If successfuly, mark\u00a0the invoice as paid...\n$invoice-&gt;mark_paid();\n\n\/\/\u00a0... then send\u00a0to\u00a0the\u00a0success\u00a0page.\nwpinv_send_to_success_page(\u00a0array(\u00a0&#039;invoice_key&#039;\u00a0=&gt;\u00a0$invoice-&gt;get_key()\u00a0)\u00a0);<\/code><\/pre>\n\n\n\n<div><strong>&#8230; put the invoice on hold then redirect to the receipt page where you&#8217;ll then display offline payment instructions&#8230;<\/strong><\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">\/\/ Mark the invoice as held...\n$invoice-&gt;set_status(\u00a0&#039;wpi-onhold&#039;\u00a0);\n\n\/\/ Add note.\n$invoice-&gt;add_note( __(\u00a0&#039;Mark the invoice as paid when you receive offline payment&#039;,\u00a0&#039;my-domain&#039;\u00a0), false, false, true );\n\n\/\/\u00a0... then save it...\n$invoice-&gt;save();\n\n\/\/\u00a0... and redirect to the receipt page.\nwpinv_send_to_success_page(\u00a0array(\u00a0&#039;invoice_key&#039;\u00a0=&gt;\u00a0$invoice-&gt;get_key()\u00a0)\u00a0);<\/code><\/pre>\n\n\n\n<div><strong>or redirect it to your payment processor.<\/strong><\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">wp_redirect(\u00a0&#039;https:\/\/my-payment-processor.com\/process&#039;\u00a0);<\/code><\/pre>\n\n\n\n<div>\n<h4>verify_ipn()<\/h4>\n<\/div>\n\n\n\n<p>This method is called when we receive an IPN request for your gateway. You can use it to process the request and process the invoice\/subscription as needed.<\/p>\n\n\n\n<p>Here are a few snippets that might be useful when it comes to IPNs:-<\/p>\n\n\n\n<p><strong>Getting an invoice object<\/strong>:-<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">$invoice\u00a0=\u00a0new\u00a0WPInv_Invoice(\u00a0$_POST[&#039;invoice_id&#039;]\u00a0);\n\nif ( $invoice-&gt;exists() ) {\n    \/\/ Process IPN.\n}<\/code><\/pre>\n\n\n\n<p><strong>Getting your gateway&#8217;s IPN URL:<\/strong>&#8211;<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">$ipn_url = wpinv_get_ipn_url(\u00a0$this-&gt;id\u00a0);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Working with subscriptions<\/h3>\n\n\n\n<p>If your payment gateway supports subscriptions, add it to the list of supported features. You can then use the following code snippets to work with subscriptions.<\/p>\n\n\n\n<p><strong>Checking if an invoice has an associated subscription<\/strong>:-<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">if\u00a0(\u00a0$invoice-&gt;is_recurring()\u00a0&amp;&amp;\u00a0$subscription\u00a0=\u00a0wpinv_get_subscription(\u00a0$invoice\u00a0)\u00a0)\u00a0{\n  \n    $period\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0=\u00a0$subscription-&gt;get_period();\n\u00a0\u00a0\u00a0\u00a0$interval\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0=\u00a0(int)\u00a0$subscription-&gt;get_frequency();\n\u00a0\u00a0\u00a0\u00a0$max_bill_times\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0=\u00a0(int)\u00a0$subscription-&gt;get_bill_times();\n\u00a0\u00a0\u00a0\u00a0$initial_amount\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0=\u00a0(float)\u00a0wpinv_sanitize_amount(\u00a0$invoice-&gt;get_initial_total(),\u00a02\u00a0);\n\u00a0\u00a0\u00a0\u00a0$recurring_amount\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0=\u00a0(float)\u00a0wpinv_sanitize_amount(\u00a0$invoice-&gt;get_recurring_total(),\u00a02\u00a0);\n\u00a0\u00a0\u00a0\u00a0$subscription_item\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0=\u00a0$invoice-&gt;get_recurring(\u00a0true\u00a0);\n\n    \/\/ Process the subscription here.\n}<\/code><\/pre>\n\n\n\n<p><strong>Activating an invoice&#8217;s subscription<\/strong>:-<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">$duration\u00a0=\u00a0strtotime(\u00a0$subscription-&gt;get_expiration()\u00a0)\u00a0-\u00a0strtotime(\u00a0$subscription-&gt;get_date_created()\u00a0);\n$expiry\u00a0\u00a0\u00a0=\u00a0date(\u00a0&#039;Y-m-d\u00a0H:i:s&#039;,\u00a0(\u00a0current_time(\u00a0&#039;timestamp&#039;\u00a0)\u00a0+\u00a0$duration\u00a0)\u00a0);\n\n$subscription-&gt;set_next_renewal_date(\u00a0$expiry\u00a0);\n$subscription-&gt;set_date_created(\u00a0current_time(\u00a0&#039;mysql&#039;\u00a0)\u00a0);\n$subscription-&gt;set_profile_id(\u00a0\/*THE REMOTE ID OF THE SUBSCRIPTION*\/\u00a0);\n$subscription-&gt;activate();<\/code><\/pre>\n\n\n\n<p><strong>Renewing an invoice&#8217;s subscription<\/strong>:-<\/p>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\">\/\/\u00a0If\u00a0this\u00a0is\u00a0the\u00a0last\u00a0renewal,\u00a0complete\u00a0the\u00a0subscription.\nif\u00a0(\u00a0$subscription-&gt;is_last_renewal()\u00a0)\u00a0{\n\u00a0\u00a0\u00a0\u00a0return $subscription-&gt;complete();\n}\n\n\/\/\u00a0Renew\u00a0the\u00a0subscription.\n$subscription-&gt;add_payment(\n\u00a0\u00a0\u00a0array(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#039;transaction_id&#039;\u00a0=&gt;\u00a0\/*THE REMOTE ID OF THE RENEWAL PAYMENT*\/,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#039;gateway&#039;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0=&gt;\u00a0$this-&gt;id\n\u00a0\u00a0\u00a0)\n);\n\n$subscription-&gt;renew();<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Developers can extend the GetPaid_Payment_Gateway PHP class to create their own custom payment gateways. This class will take care of registering the payment gateway and provide a way of adding the admin settings fields and frontend payment fields. GetPaid supports 4 different types of payment gateways:- Creating a simple payment gateway Start by creating a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"article\/tags":[],"article\/categories":[217,209],"class_list":["post-460","gd_place","type-gd_place","status-publish","hentry","gd_placecategory-developers-developers","gd_placecategory-developers"],"_links":{"self":[{"href":"https:\/\/wpgetpaid.com\/documentation\/wp-json\/wp\/v2\/article\/460","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wpgetpaid.com\/documentation\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/wpgetpaid.com\/documentation\/wp-json\/wp\/v2\/types\/gd_place"}],"author":[{"embeddable":true,"href":"https:\/\/wpgetpaid.com\/documentation\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wpgetpaid.com\/documentation\/wp-json\/wp\/v2\/comments?post=460"}],"version-history":[{"count":0,"href":"https:\/\/wpgetpaid.com\/documentation\/wp-json\/wp\/v2\/article\/460\/revisions"}],"wp:attachment":[{"href":"https:\/\/wpgetpaid.com\/documentation\/wp-json\/wp\/v2\/media?parent=460"}],"wp:term":[{"taxonomy":"gd_place_tags","embeddable":true,"href":"https:\/\/wpgetpaid.com\/documentation\/wp-json\/wp\/v2\/article\/tags?post=460"},{"taxonomy":"gd_placecategory","embeddable":true,"href":"https:\/\/wpgetpaid.com\/documentation\/wp-json\/wp\/v2\/article\/categories?post=460"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}