SILENT KILLERPanel

Current Path: > home > codekrsu > > ameliagraphics.com > wp-content > plugins > pinterest-for-woocommerce > src > > > API


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: /home/codekrsu//ameliagraphics.com/wp-content/plugins/pinterest-for-woocommerce/src///API

NameTypeSizeLast ModifiedActions
APIV5.php File 36061 bytes December 04 2024 18:47:06.
AdvertiserConnect.php File 5964 bytes August 26 2024 16:35:44.
Advertisers.php File 1565 bytes August 26 2024 16:35:44.
Auth.php File 6514 bytes May 29 2025 17:27:42.
AuthDisconnect.php File 845 bytes August 26 2024 16:35:44.
Base.php File 21978 bytes December 04 2024 18:47:06.
Businesses.php File 1406 bytes October 26 2021 02:03:16.
DomainVerification.php File 4152 bytes August 26 2024 16:35:44.
FeedIssues.php File 4263 bytes August 26 2024 16:35:44.
FeedState.php File 15909 bytes August 26 2024 16:35:44.
Health.php File 862 bytes August 26 2024 16:35:44.
Settings.php File 2228 bytes August 26 2024 16:35:44.
SyncSettings.php File 756 bytes April 11 2023 17:48:48.
Tags.php File 2073 bytes August 26 2024 16:35:44.
TokenExchangeV3ToV5.php File 3066 bytes August 26 2024 16:35:44.
UserInteraction.php File 3382 bytes May 29 2025 17:27:42.
VendorAPI.php File 2843 bytes May 24 2022 15:05:20.

Reading File: /home/codekrsu//ameliagraphics.com/wp-content/plugins/pinterest-for-woocommerce/src///API/APIV5.php

<?php
/**
 * Pinterest API V5 class
 *
 * @class       Pinterest_For_Woocommerce_API
 * @version     1.4.2
 * @package     Pinterest_For_WordPress/Classes/
 */

namespace Automattic\WooCommerce\Pinterest\API;

use Automattic\WooCommerce\Pinterest\PinterestApiException;
use Exception;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * API V5 Methods
 */
class APIV5 extends Base {

	const API_DOMAIN = 'https://api.pinterest.com/v5';

	/**
	 * Prepare request
	 *
	 * @param string $endpoint        the endpoint to perform the request on.
	 * @param string $method          eg, POST, GET, PUT etc.
	 * @param array  $payload         Payload to be sent on the request's body.
	 * @param string $api             The specific Endpoints subset.
	 *
	 * @return array
	 */
	public static function prepare_request( $endpoint, $method = 'POST', $payload = array(), $api = '' ) {

		return array(
			'url'         => static::API_DOMAIN . "/{$endpoint}",
			'method'      => $method,
			'args'        => ! empty( $payload ) ? wp_json_encode( $payload ) : array(),
			'headers'     => array(
				'Pinterest-Woocommerce-Version' => PINTEREST_FOR_WOOCOMMERCE_VERSION,
				'Content-Type'                  => 'application/json',
			),
			'data_format' => 'body',
		);
	}

	/**
	 * Returns basic user information.
	 *
	 * @since 1.4.0
	 *
	 * @return mixed|array {
	 *      User account object.
	 *
	 *      @type string $account_type   Type of account. Enum: "PINNER" "BUSINESS".
	 *      @type string $profile_image
	 *      @type string $website_url
	 *      @type string $username
	 *      @type string $business_name
	 *      @type int $board_count      User account board count.
	 *      @type int $pin_count        User account pin count. This includes both created and saved pins.
	 *      @type int $follower_count   User account follower count.
	 *      @type int $following_count  User account following count.
	 *      @type int $monthly_views    User account monthly views.
	 * }
	 * @throws PinterestApiException Throws 403 and 500 exceptions.
	 */
	public static function get_account_info() {
		return self::make_request( 'user_account', 'GET' );
	}

	/**
	 * Pull ads supported countries information from the API.
	 *
	 * @since 1.4.0
	 *
	 * @return array {
	 *      Ad Accounts countries
	 *
	 *      @type array[] $items {
	 *          @type string $code Country ID from ISO 3166-1 alpha-2.
	 *          @type string $currency Country currency.
	 *          @type int $index Country index
	 *          @type string $name Country name.
	 *      }
	 * }
	 * @throws PinterestApiException If API request ends up other than 2xx status.
	 */
	public static function get_list_of_ads_supported_countries(): array {
		$request_url = 'resources/ad_account_countries';
		return self::make_request( $request_url, 'GET', array(), '', 2 * DAY_IN_SECONDS );
	}

	/**
	 * Returns the list of the user's websites.
	 *
	 * @since 1.4.0
	 *
	 * @return array {
	 *     User account websites.
	 *
	 *     @type array[]  $items {
	 *         @type string $website     Website with path or domain only
	 *         @type string $status      Status of the verification process
	 *         @type string $verified_at UTC timestamp when the verification happened - sometimes missing
	 *     }
	 *     @type string $bookmark
	 * }
	 * @throws PinterestApiException Throws 403 and 500 exceptions.
	 */
	public static function get_user_websites() {
		return self::make_request( 'user_account/websites', 'GET' );
	}

	/**
	 * Returns the list of linked businesses.
	 *
	 * @since 1.4.0
	 *
	 * @return mixed|array[] {
	 *      Linked businesses list.
	 *
	 *      @type string $username
	 *      @type string $image_small_url
	 *      @type string $image_medium_url
	 *      @type string $image_large_url
	 *      @type string $image_xlarge_url
	 * }
	 * @throws PinterestApiException Throws 500 exception in case of unexpected error.
	 */
	public static function get_linked_businesses() {
		return self::make_request( 'user_account/businesses', 'GET' );
	}

	/**
	 * Get the advertiser object from the Pinterest API for the given User ID.
	 *
	 * @since 1.4.0
	 *
	 * @param string $pinterest_user The Pinterest User ID.
	 *
	 * @return mixed
	 */
	public static function get_advertisers( $pinterest_user = null ) {
		return self::make_request( 'ad_accounts', 'GET' );
	}

	/**
	 * Get the advertiser's tracking tags.
	 *
	 * @param string $ad_account_id the advertiser_id to request the tags for.
	 *
	 * @return array {
	 *      Tag objects list.
	 *
	 *      @type array[] $items {
	 *         Tag object.
	 *
	 *          @type string    $ad_account_id          Ad account ID.
	 *          @type string    $code_snippet           Tag code snippet.
	 *          @type ?string   $enhanced_match_status  The enhanced match status of the tag.
	 *          @type string    $id                     Tag ID.
	 *          @type ?int      $last_fired_time_ms     Time for the last event fired.
	 *
	 *          @type string    $name                   Conversion tag name.
	 *          @type string    $status                 Entity status.
	 *          @type string    $version                Version number.
	 *          @type array     $configs {
	 *              Tag Enhanced Match configuration.
	 *
	 *              @type ?bool $aem_enabled        Whether Automatic Enhanced Match email is enabled.
	 *              @type ?int  $md_frequency       Metadata ingestion frequency.
	 *              @type ?bool $aem_fnln_enabled   Whether Automatic Enhanced Match first name and last name is enabled.
	 *              @type ?bool $aem_ph_enabled     Whether Automatic Enhanced Match phone is enabled.
	 *              @type ?bool $aem_ge_enabled     Whether Automatic Enhanced Match gender is enabled.
	 *              @type ?bool $aem_db_enabled     Whether Automatic Enhanced Match birthdate is enabled.
	 *              @type ?bool $aem_loc_enabled    Whether Automatic Enhanced Match location is enabled.
	 *          }
	 *      }
	 * }
	 *
	 * @throws PinterestApiException|Exception Throws 500 exception.
	 */
	public static function get_advertiser_tags( $ad_account_id ) {
		return self::make_request( "ad_accounts/{$ad_account_id}/conversion_tags", 'GET' );
	}

	/**
	 * Get the advertiser's tracking tag config and details.
	 *
	 * @link https://developers.pinterest.com/docs/api/v5/#operation/conversion_tags/get
	 *
	 * @since 1.4.0
	 *
	 * @param string $ad_account_id         Ad account ID.
	 * @param string $conversion_tag_id     Conversion tag ID.
	 *
	 * @return mixed|array {
	 *      Tag object.
	 *
	 *      @type string    $ad_account_id          Ad account ID.
	 *      @type string    $code_snippet           Tag code snippet.
	 *      @type string    $enhanced_match_status  Enum: "UNKNOWN" "NOT_VALIDATED" "VALIDATING_IN_PROGRESS" "VALIDATION_COMPLETE" null
	 *                                              The enhanced match status of the tag
	 *      @type string    $id                     Tag ID.
	 *      @type int       $last_fired_time_ms     Time for the last event fired.
	 *      @type string    $name                   Conversion tag name.
	 *      @type string    $status                 Enum: "ACTIVE" "PAUSED" "ARCHIVED"
	 *                                              Entity status
	 *      @type string    $version                Version number.
	 *      @type array     $configs {
	 *          Tag Enhanced Match configuration.
	 *
	 *          @type bool    $aem_enabled         Whether Automatic Enhanced Match email is enabled.
	 *          @type int     $md_frequency        Metadata ingestion frequency.
	 *          @type bool    $aem_fnln_enabled    Whether Automatic Enhanced Match name is enabled.
	 *          @type bool    $aem_ph_enabled      Whether Automatic Enhanced Match phone is enabled.
	 *          @type bool    $aem_ge_enabled      Whether Automatic Enhanced Match gender is enabled.
	 *          @type bool    $aem_db_enabled      Whether Automatic Enhanced Match birthdate is enabled.
	 *          @type bool    $aem_loc_enabled     Whether Automatic Enhanced Match location is enabled.
	 *      }
	 * }
	 * @throws PinterestApiException Throws 500 exception in case of unexpected error.
	 */
	public static function get_advertiser_tag( $ad_account_id, $conversion_tag_id ) {
		return self::make_request( "ad_accounts/{$ad_account_id}/conversion_tags/{$conversion_tag_id}", 'GET' );
	}

	/**
	 * Create a tag for the given advertiser.
	 *
	 * @link https://developers.pinterest.com/docs/api/v5/#operation/conversion_tags/create
	 *
	 * @since 1.4.0
	 *
	 * @param string $ad_account_id the advertiser_id to create a tag for.
	 *
	 * @return array {
	 *      Tag object.
	 *
	 *      @type string    $ad_account_id         Ad account ID.
	 *      @type string    $code_snippet          Tag code snippet.
	 *      @type ?string   $enhanced_match_status The enhanced match status of the tag.
	 *      @type string    $id                    Tag ID.
	 *      @type ?int      $last_fired_time_ms    Time for the last event fired.
	 *      @type string    $name                  Conversion tag name.
	 *      @type string    $status                Entity status.
	 *      @type string    $version               Version number.
	 *      @type array     $configs {
	 *          Tag configuration.
	 *
	 *          @type ?bool $aem_enabled        Whether Automatic Enhanced Match email is enabled.
	 *          @type ?int  $md_frequency       Metadata ingestion frequency.
	 *          @type ?bool $aem_fnln_enabled   Whether Automatic Enhanced Match name is enabled.
	 *          @type ?bool $aem_ph_enabled     Whether Automatic Enhanced Match phone is enabled.
	 *          @type ?bool $aem_ge_enabled     Whether Automatic Enhanced Match gender is enabled.
	 *          @type ?bool $aem_db_enabled     Whether Automatic Enhanced Match birthdate is enabled.
	 *          @type ?bool $aem_loc_enabled    Whether Automatic Enhanced Match location is enabled.
	 *      }
	 * }
	 * @throws PinterestApiException|Exception Throws 500 exception.
	 */
	public static function create_tag( $ad_account_id ) {
		$tag_name = self::get_tag_name();
		return self::make_request(
			"ad_accounts/{$ad_account_id}/conversion_tags",
			'POST',
			array(
				'name'             => $tag_name,
				'aem_enabled'      => true,
				'md_frequency'     => 1,
				'aem_fnln_enabled' => true,
				'aem_ph_enabled'   => true,
				'aem_ge_enabled'   => true,
				'aem_db_enabled'   => true,
				'ae_loc_enabled'   => true,
			)
		);
	}

	/**
	 * Returns Pinterest user verification code for website verification.
	 *
	 * @since 1.4.0
	 *
	 * @return array {
	 *      Data needed to verify a website.
	 *
	 *      @type string $verification_code Code to check against the user claiming the website.
	 *      @type string $dns_txt_record    DNS TXT record to check against for the website to be claimed.
	 *      @type string $metatag           META tag the verification process searches for the website to be claimed.
	 *      @type string $filename          File expected to find on the website being claimed.
	 *      @type string $file_content      A full html file to upload to the website in order for it to be claimed.
	 * }
	 * @throws PinterestApiException If the request fails with 403 or 500 status.
	 */
	public static function domain_verification_data(): array {
		return self::make_request( 'user_account/websites/verification', 'GET' );
	}

	/**
	 * Sends domain verification request to Pinterest.
	 *
	 * @since 1.4.0
	 *
	 * @param string $domain Domain to verify.
	 * @return array {
	 *      Data returned by Pinterest after the verification request.
	 *
	 *      @type string $website       Website with path or domain only.
	 *      @type string $status        Status of the verification process.
	 *      @type string $verified_at   UTC timestamp when the verification happened - sometimes missing.
	 * }
	 * @throws PinterestApiException If the request fails with 2xx status.
	 */
	public static function domain_metatag_verification_request( string $domain ): array {
		return self::make_request(
			'user_account/websites',
			'POST',
			array(
				'website'             => $domain,
				'verification_method' => 'METATAG',
			)
		);
	}

	/**
	 * Retrieves Commerce Integration.
	 *
	 * @param string $external_business_id WooCommerce's External Business ID (an autogenerated identifier of a customer).
	 * @return array {
	 *       Integration data returned by Pinterest.
	 *
	 *       @type string $id                           ID of the integration (string all digits).
	 *       @type string $external_business_id         External business ID for the integration.
	 *       @type string $connected_merchant_id        Connected merchant ID for the integration.
	 *       @type string $connected_user_id            Connected user ID for the integration.
	 *       @type string $connected_advertiser_id      Connected advertiser ID for the integration.
	 *       @type string $connected_lba_id             Connected LBA ID for the integration.
	 *       @type string $connected_tag_id             Connected tag ID for the integration.
	 *       @type int    $partner_access_token_expiry  Partner access token expiry for the integration.
	 *       @type int    $partner_refresh_token_expiry Partner refresh token expiry for the integration.
	 *       @type string $scopes                       Scopes for the integration.
	 *       @type int    $created_timestamp            Created timestamp for the integration.
	 *       @type int    $updated_timestamp            Updated timestamp for the integration.
	 *       @type string $additional_id_1              Additional ID 1 for the integration.
	 *       @type string $partner_metadata             Partner metadata for the integration.
	 *  }
	 * @throws PinterestApiException If the request fails with other than 200 status.
	 * @link https://developers.pinterest.com/docs/api/v5/integrations_commerce-get
	 * @since 1.4.11
	 */
	public static function get_commerce_integration( string $external_business_id ): array {
		return self::make_request(
			"integrations/commerce/{$external_business_id}",
			'GET',
		);
	}

	/**
	 * Create commerce integration.
	 *
	 * @param array $integration_data {
	 *      Commerce integration data.
	 *
	 *      @type string $external_business_id External business ID for the integration.
	 *      @type string $external_business_id External business ID for the integration.
	 *      @type string $connected_merchant_id Connected merchant ID for the integration.
	 *      @type string $connected_user_id Connected user ID for the integration.
	 *      @type string $connected_advertiser_id Connected advertiser ID for the integration.
	 *      @type string $connected_lba_id Connected LBA ID for the integration.
	 *      @type string $connected_tag_id Connected tag ID for the integration.
	 *      @type int    $partner_access_token_expiry Partner access token expiry for the integration.
	 *      @type int    $partner_refresh_token_expiry Partner refresh token expiry for the integration.
	 *      @type string $scopes Scopes for the integration.
	 *      @type int    $created_timestamp Created timestamp for the integration.
	 *      @type int    $updated_timestamp Updated timestamp for the integration.
	 *      @type string $additional_id_1 Additional ID 1 for the integration.
	 * }
	 *
	 * @return array {
	 *      Integration data returned by Pinterest.
	 *
	 *      @type string $id ID of the integration (string all digits).
	 *      @type string $external_business_id External business ID for the integration.
	 *      @type string $connected_merchant_id Connected merchant ID for the integration.
	 *      @type string $connected_user_id Connected user ID for the integration.
	 *      @type string $connected_advertiser_id Connected advertiser ID for the integration.
	 *      @type string $connected_lba_id Connected LBA ID for the integration.
	 *      @type string $connected_tag_id Connected tag ID for the integration.
	 *      @type int    $partner_access_token_expiry Partner access token expiry for the integration.
	 *      @type int    $partner_refresh_token_expiry Partner refresh token expiry for the integration.
	 *      @type string $scopes Scopes for the integration.
	 *      @type int    $created_timestamp Created timestamp for the integration.
	 *      @type int    $updated_timestamp Updated timestamp for the integration.
	 *      @type string $additional_id_1 Additional ID 1 for the integration.
	 *      @type string $partner_metadata Partner metadata for the integration.
	 * }
	 * @throws PinterestApiException If the request fails with other than 200 status.
	 * @link https://developers.pinterest.com/docs/api/v5/#operation/integrations_commerce/post
	 * @since 1.4.0
	 */
	public static function create_commerce_integration( array $integration_data ): array {
		return self::make_request(
			'integrations/commerce',
			'POST',
			$integration_data
		);
	}

	/**
	 * Updates WC integration parameters with Pinterest.
	 *
	 * @since 1.4.0
	 *
	 * @link https://developers.pinterest.com/docs/api/v5/#operation/integrations_commerce/patch
	 *
	 * @param string $external_business_id External business ID for the integration.
	 * @param array  $data {
	 *      Integration data to update with Pinterest.
	 *
	 *      @type string    $external_business_id           External business ID for the integration.
	 *      @type string    $connected_merchant_id          Connected merchant ID for the integration.
	 *      @type string    $connected_advertiser_id        Connected advertiser ID for the integration.
	 *      @type string    $connected_lba_id               Connected LBA ID for the integration.
	 *      @type string    $connected_tag_id               Connected tag ID for the integration.
	 *      @type string    $partner_access_token           Partner access token for the integration.
	 *      @type string    $partner_refresh_token          Partner refresh token for the integration.
	 *      @type string    $partner_primary_email          Partner primary email for the integration.
	 *      @type int       $partner_access_token_expiry    Partner access token expiry for the integration.
	 *      @type int       $partner_refresh_token_expiry   Partner refresh token expiry for the integration.
	 *      @type string    $scopes                         Scopes for the integration.
	 *      @type string    $additional_id_1                Additional ID 1 for the integration.
	 *      @type string    $partner_metadata               Partner metadata for the integration.
	 * }
	 *
	 * @return array {
	 *      Integration data returned by Pinterest.
	 *
	 *      @type string    $id                             ID of the integration (string all digits).
	 *      @type string    $external_business_id           External business ID for the integration.
	 *      @type string    $connected_merchant_id          Connected merchant ID for the integration.
	 *      @type string    $connected_user_id              Connected user ID for the integration.
	 *      @type string    $connected_advertiser_id        Connected advertiser ID for the integration.
	 *      @type string    $connected_lba_id               Connected LBA ID for the integration.
	 *      @type string    $connected_tag_id               Connected tag ID for the integration.
	 *      @type int       $partner_access_token_expiry    Partner access token expiry for the integration.
	 *      @type int       $partner_refresh_token_expiry   Partner refresh token expiry for the integration.
	 *      @type string    $scopes                         Scopes for the integration.
	 *      @type int       $created_timestamp              Created timestamp for the integration.
	 *      @type int       $updated_timestamp              Updated timestamp for the integration.
	 *      @type string    $additional_id_1                Additional ID 1 for the integration.
	 *      @type string    $partner_metadata               Partner metadata for the integration.
	 * }
	 * @throws PinterestApiException In case of 404, 409 and 500 errors from Pinterest.
	 */
	public static function update_commerce_integration( string $external_business_id, array $data ): array {
		return self::make_request(
			"integrations/commerce/{$external_business_id}",
			'PATCH',
			$data
		);
	}

	/**
	 * Delete commerce integration.
	 *
	 * @since 1.4.0
	 *
	 * @link https://developers.pinterest.com/docs/api/v5/#operation/integrations_commerce/del
	 *
	 * @param string $external_business_id External Business ID.
	 * @return array
	 * @throws PinterestApiException If the request fails with other than 204 status.
	 */
	public static function delete_commerce_integration( string $external_business_id ) {
		return self::make_request(
			"integrations/commerce/{$external_business_id}",
			'DELETE'
		);
	}

	/**
	 * Sends create feed request to Pinterest API.
	 *
	 * @since 1.4.0
	 *
	 * @link https://developers.pinterest.com/docs/api/v5/#operation/feeds/create
	 *
	 * @param array  $data {
	 *      Feed data.
	 *
	 *      @type string $name                 A human-friendly name associated to a given feed. This value is currently nullable due to historical reasons. It is expected to become non-nullable in the future.
	 *      @type string $format               The file format of a feed: TSV, CSV, XML.
	 *      @type string $location             The URL where a feed is available for download. This URL is what Pinterest will use to download a feed for processing.
	 *      @type string $catalog_type         Type of the catalog entity: RETAIL, HOTEL.
	 *      @type string $default_currency     Currency Codes from ISO 4217.
	 *      @type string $default_locale       The locale used within a feed for product descriptions.
	 *      @type string $default_country      Country ID from ISO 3166-1 alpha-2.
	 *      @type string $default_availability Default availability for products in a feed.
	 *      @type array[] $credentials {
	 *          Use this if your feed file requires username and password.
	 *
	 *          @type string $username  The required password for downloading a feed.
	 *          @type string $password  The required username for downloading a feed.
	 *      }
	 *      @type array[] $preferred_processing_schedule {
	 *          Optional daily processing schedule. Use this to configure the preferred time for processing a feed (otherwise random).
	 *
	 *          @type string $time      A time in format HH:MM with leading 0 (zero).
	 *          @type string $timezone  The timezone considered for the processing schedule time.
	 *      }
	 * }
	 * @param string $ad_account_id Pinterest Ad Account ID.
	 *
	 * @return array
	 *
	 * @throws PinterestApiException If the request fail with other than 201 status.
	 */
	public static function create_feed( array $data, string $ad_account_id ): array {
		return self::make_request(
			"catalogs/feeds?ad_account_id={$ad_account_id}",
			'POST',
			$data
		);
	}

	/**
	 * Sends delete feed request to Pinterest API.
	 *
	 * @param string $feed_id       Feed ID.
	 * @param string $ad_account_id Pinterest Ad Account ID.
	 *
	 * @return array
	 * @throws PinterestApiException If the request fails with other than 204 status.
	 */
	public static function delete_feed( string $feed_id, string $ad_account_id ) {
		return self::make_request(
			"catalogs/feeds/{$feed_id}?ad_account_id={$ad_account_id}",
			'DELETE'
		);
	}

	/**
	 * Sends update feed request to Pinterest API.
	 *
	 * @since 1.4.0
	 *
	 * @link https://developers.pinterest.com/docs/api/v5/#operation/feeds/update
	 *
	 * @param string $feed_id       Feed ID.
	 * @param array  $data          Feed data.
	 * @param string $ad_account_id Pinterest Ad Account ID.
	 *
	 * @return array
	 * @throws PinterestApiException If the request fails with other than 200 status.
	 */
	public static function update_feed( string $feed_id, array $data, string $ad_account_id ): array {
		return self::make_request(
			"catalogs/feeds/{$feed_id}?ad_account_id={$ad_account_id}",
			'PATCH',
			$data
		);
	}

	/**
	 * Get merchant's feeds.
	 *
	 * @since 1.4.0
	 *
	 * @param string $ad_account_id Pinterest Ad Account ID.
	 *
	 * @return array {
	 *      List of feeds.
	 *
	 *      @type array[] $items {              Feeds.
	 *          @type string $id                Feed ID.
	 *          @type string $name              A human-friendly name associated to a given feed. This value is currently nullable due to historical reasons. It is expected to become non-nullable in the future.
	 *          @type string $status            ACTIVE, INACTIVE. Status for catalogs entities. Present in catalogs_feed values. When a feed is deleted, the response will inform DELETED as status.
	 *          @type string $format            The file format of a feed: TSV, CSV, XML.
	 *          @type string $location          The URL where a feed is available for download. This URL is what Pinterest will use to download a feed for processing.
	 *          @type string $created_at
	 *          @type string $updated_at
	 *          @type string $catalog_type      Type of the catalog entity: RETAIL, HOTEL.
	 *          @type array[] $credentials {
	 *              Use this if your feed file requires username and password.
	 *
	 *              @type string $username  The required password for downloading a feed.
	 *              @type string $password  The required username for downloading a feed.
	 *          }
	 *          @type array[] $preferred_processing_schedule {
	 *              Optional daily processing schedule. Use this to configure the preferred time for processing a feed (otherwise random).
	 *
	 *              @type string $time      A time in format HH:MM with leading 0 (zero).
	 *              @type string $timezone  The timezone considered for the processing schedule time.
	 *          }
	 *          @type string $default_currency      Currency Codes from ISO 4217.
	 *          @type string $default_locale        The locale used within a feed for product descriptions.
	 *          @type string $default_country       Country ID from ISO 3166-1 alpha-2.
	 *          @type string $default_availability  Default availability for products in a feed.
	 *      }
	 *      @type string $bookmark              Cursor used to fetch the next page of items
	 * }
	 * @throws PinterestApiException If the request fails with 2xx status.
	 */
	public static function get_feeds( string $ad_account_id ): array {
		return self::make_request(
			"catalogs/feeds?ad_account_id={$ad_account_id}",
			'GET',
			array(),
			'',
			MINUTE_IN_SECONDS
		);
	}

	/**
	 * Invalidate the ad account's feeds cache.
	 *
	 * @since 1.4.0
	 *
	 * @param string $ad_account_id Ad Account ID.
	 *
	 * @return bool True if the cache was invalidated, false otherwise.
	 */
	public static function invalidate_feeds_cache( string $ad_account_id ): bool {
		return self::invalidate_cached_response(
			"catalogs/feeds?ad_account_id={$ad_account_id}",
			'GET',
			array(),
			''
		);
	}

	/**
	 * Get the latest workflow for the given feed.
	 *
	 * @link https://developers.pinterest.com/docs/api/v5/#operation/feed_processing_results/list
	 *
	 * @param string $feed_id       Feed ID.
	 * @param string $ad_account_id Pinterest Ad Account ID.
	 * @return array {
	 *      Feed Processing Results.
	 *
	 *      @type array[] $items {
	 *          Feed processing results.
	 *
	 *          @type string $id        Feed Processing Results ID.
	 *          @type string $status    Feed Processing status. "COMPLETED", "COMPLETED_EARLY", "DISAPPROVED", etc.
	 *          @type array $product_counts {
	 *              Feed product counts.
	 *
	 *              @type int $original Original product count.
	 *              @type int $ingested Ingested product count.
	 *          }
	 *          @type array $ingestion_details {
	 *              Processing details.
	 *
	 *              @type array $errors {}      Errors.
	 *              @type array $info {}        Info
	 *              @type array $warnings {}    Warnings.
	 *          }
	 *          @type array $validation_details {
	 *              Validation details.
	 *
	 *              @type array $errors {}      Errors.
	 *              @type array $warnings {}    Warnings.
	 *          }
	 *          @type string $created_at Feed Processing Results creation time.
	 *          @type string $updated_at Feed Processing Results update time.
	 *      }
	 *      @type string $bookmark      Cursor used to fetch the next page of items
	 * }
	 *
	 * @throws PinterestApiException If the request fails with other than 2xx status.
	 * @since 1.4.0
	 */
	public static function get_feed_processing_results( $feed_id, $ad_account_id ): array {
		return self::make_request(
			"catalogs/feeds/{$feed_id}/processing_results?ad_account_id={$ad_account_id}&page_size=1",
			'GET',
			array(),
			'',
			MINUTE_IN_SECONDS
		);
	}

	/**
	 * List item issues for a given processing result.
	 *
	 * @param string $feed_processing_result_id  Feed Processing Results ID.
	 * @param int    $limit                      Number of items to return.
	 * @return array {
	 *      Items and their corresponding issues.
	 *
	 *      @type array[] $items {
	 *          @type int       $item_number
	 *          @type string    $item_id
	 *          @type array     $errors {
	 *              An array of errors where keys are error codes e.g. (DUPLICATE_PRODUCTS, AVAILABILITY_INVALID, etc.).
	 *
	 *              @type ?string $attribute_name The name of the attribute that caused the error.
	 *              @type ?string $provided_value The value of the attribute that caused the error.
	 *          }
	 *          @type array     $warnings {
	 *              An array of warnings where keys are warning codes e.g. (SHIPPING_INVALID, TAX_INVALID, etc.).
	 *
	 *              @type ?string $attribute_name The name of the attribute that caused the warning.
	 *              @type ?string $provided_value The value of the attribute that caused the warning.
	 *          }
	 *      }
	 * }
	 *
	 * @throws PinterestApiException If the request fails with other than 2xx status.
	 * @since 1.4.0
	 */
	public static function get_feed_processing_result_items_issues( string $feed_processing_result_id, $limit = 25 ): array {
		return self::make_request(
			"catalogs/processing_results/{$feed_processing_result_id}/item_issues?page_size={$limit}",
			'GET'
		);
	}

	/**
	 * Attempts to redeem the offer code for the given advertiser.
	 *
	 * @link https://developers.pinterest.com/docs/api/v5/#operation/ads_credit/redeem
	 *
	 * @since 1.4.0
	 *
	 * @param string $ad_account_id Pinterest Ad Account ID.
	 * @param string $offer_code    Offer code (hash).
	 *
	 * @return array {
	 *     Credits redeem status.
	 *
	 *     @type bool    $success       Whether the offer code was successfully redeemed or not.
	 *     @type ?int    $errorCode     Error code type if error occurs.
	 *     @type ?string $errorMessage  Reason for failure.
	 * }
	 * @throws PinterestApiException When unable to redeem the offer code or any unexpected error occur.
	 */
	public static function redeem_ads_offer_code( string $ad_account_id, string $offer_code ): array {
		return self::make_request(
			"ad_accounts/{$ad_account_id}/ads_credit/redeem",
			'POST',
			array(
				'offerCodeHash' => $offer_code,
				'validateOnly'  => false,
			)
		);
	}

	/**
	 * Get active billing profiles in the advertiser account.
	 *
	 * @link https://developers.pinterest.com/docs/api/v5/#operation/billing_profiles/get
	 *
	 * @since 1.4.0
	 *
	 * @param string $ad_account_id Pinterest Ad Account ID.
	 *
	 * @return array {
	 *     Billing profiles in the advertiser account.
	 *
	 *     @type array[] $items {
	 *         @type string $id                     Billing ID.
	 *         @type string $card_type              Type of the card ("UNKNOWN" "VISA" "MASTERCARD" "AMERICAN_EXPRESS"
	 *                                              "DISCOVER" "ELO").
	 *         @type string $status                 Status of the billing. ("UNSPECIFIED" "VALID" "INVALID" "PENDING"
	 *                                              "DELETED" "SECONDARY" "PENDING_SECONDARY").
	 *         @type string $advertiser_id          Advertiser ID of the billing.
	 *         @type string $payment_method_brand   Brand of the payment method. ("UNKNOWN" "VISA" "MASTERCARD"
	 *                                              "AMERICAN_EXPRESS" "DISCOVER" "SOFORT" "DINERS_CLUB" "ELO"
	 *                                              "CARTE_BANCAIRE").
	 *     }
	 *     @type string $bookmark Cursor used to fetch the next page of items.
	 * }
	 * @throws PinterestApiException If the request fails with other than 2xx status.
	 */
	public static function get_active_billing_profiles( string $ad_account_id ): array {
		return self::make_request(
			"ad_accounts/{$ad_account_id}/billing_profiles?is_active=true",
			'GET'
		);
	}

	/**
	 * Returns the list of discounts applied to the account.
	 *
	 * @link https://developers.pinterest.com/docs/api/v5/#operation/ads_credits_discounts/get
	 *
	 * @since 1.4.0
	 *
	 * @param string $ad_account_id Pinterest Ad Account ID.
	 *
	 * @return array {
	 *     The list of discounts applied to the account.
	 *
	 *     @type array[] $items {
	 *         @type bool   $active                             True if the offer code is currently active.
	 *         @type string $advertiser_id                      Advertiser ID the offer was applied to.
	 *         @type int    $discountInMicroCurrency            The discount applied in the offer’s currency value.
	 *         @type string $discountCurrency                   Currency value for the discount.
	 *         @type string $title                              Human-readable title of the offer code.
	 *         @type int    $remainingDiscountInMicroCurrency   The credits left to spend.
	 *     }
	 *     @type string $bookmark Cursor used to fetch the next page of items.
	 * }
	 * @throws PinterestApiException If the request fails with other than 2xx status.
	 */
	public static function get_ads_credit_discounts( string $ad_account_id ): array {
		return self::make_request(
			"ad_accounts/{$ad_account_id}/ads_credit/discounts?page_size=25",
			'GET'
		);
	}

	/**
	 * Pull ads supported countries information from the API.
	 *
	 * @since 1.4.4
	 *
	 * @return array {
	 *     Contains the status and token details.
	 *
	 *     @type string $status                         The status of the token exchange.
	 *     @type array  $data {
	 *         Contains token details.
	 *
	 *         @type string $access_token                   The access token for authentication.
	 *         @type string $refresh_token                  The refresh token for acquiring a new access token.
	 *         @type string $token_type                     Type of the token, usually "bearer".
	 *         @type int    $expires_in                     Time in seconds when the access token expires.
	 *         @type int    $refresh_token_expires_in       Time in seconds when the refresh token expires.
	 *         @type string $scope                          The scope for which the access token has permission.
	 *     }
	 * }
	 * @throws PinterestApiException If the request fails with other than 2xx status.
	 */
	public static function exchange_token() {
		$request_url = 'oauth/commerce_integrations/token/exchange/';
		return self::make_request( $request_url );
	}

	/**
	 * Sends Conversions API event data to Pinterest.
	 *
	 * @since 1.4.4
	 *
	 * @param string $ad_account_id Ad Account ID.
	 * @param array  $data Event data.
	 * @return array
	 * @throws PinterestApiException If the request fails with other than 2xx status.
	 */
	public static function send_conversions_api_event( string $ad_account_id, array $data ) {
		return self::make_request(
			"ad_accounts/{$ad_account_id}/events",
			'POST',
			array( 'data' => array( $data ) )
		);
	}
}

SILENT KILLER Tool